1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 friend class A; // expected-error {{'friend' used outside of class}} f()4void f() { friend class A; } // expected-error {{'friend' used outside of class}} 5 class C { friend class A; }; f()6class D { void f() { friend class A; } }; // expected-error {{'friend' used outside of class}} 7 8 // PR5760 9 namespace test0 { 10 namespace ns { 11 void f(int); 12 } 13 14 struct A { 15 friend void ns::f(int a); 16 }; 17 } 18 19 // Test derived from LLVM's Registry.h 20 namespace test1 { 21 template <class T> struct Outer { 22 void foo(T); 23 struct Inner { 24 friend void Outer::foo(T); 25 }; 26 }; 27 test()28 void test() { 29 (void) Outer<int>::Inner(); 30 } 31 } 32 33 // PR5476 34 namespace test2 { 35 namespace foo { 36 void Func(int x); 37 } 38 39 class Bar { 40 friend void ::test2::foo::Func(int x); 41 }; 42 } 43 44 // PR5134 45 namespace test3 { 46 class Foo { 47 friend const int getInt(int inInt = 0); 48 49 }; 50 } 51 52 namespace test4 { 53 class T4A { 54 friend class T4B; 55 56 public: 57 T4A(class T4B *); 58 59 protected: 60 T4B *mB; // error here 61 }; 62 63 class T4B {}; 64 } 65 66 namespace rdar8529993 { 67 struct A { ~A(); }; 68 69 struct B : A 70 { 71 template<int> friend A::~A(); // expected-error {{destructor cannot be declared as a template}} 72 }; 73 } 74 75 // PR7915 76 namespace test5 { 77 struct A; 78 struct A1 { friend void A(); }; 79 80 struct B { friend void B(); }; 81 } 82 83 // PR8479 84 namespace test6_1 { 85 class A { 86 public: 87 private: 88 friend class vectorA; A()89 A() {} 90 }; 91 class vectorA { 92 public: vectorA(int i,const A & t=A ())93 vectorA(int i, const A& t = A()) {} 94 }; f()95 void f() { 96 vectorA v(1); 97 } 98 } 99 namespace test6_2 { 100 template<class T> 101 class vector { 102 public: vector(int i,const T & t=T ())103 vector(int i, const T& t = T()) {} 104 }; 105 class A { 106 public: 107 private: 108 friend class vector<A>; A()109 A() {} 110 }; f()111 void f() { 112 vector<A> v(1); 113 } 114 } 115 namespace test6_3 { 116 template<class T> 117 class vector { 118 public: vector(int i)119 vector(int i) {} f(const T & t=T ())120 void f(const T& t = T()) {} 121 }; 122 class A { 123 public: 124 private: 125 friend void vector<A>::f(const A&); A()126 A() {} 127 }; f()128 void f() { 129 vector<A> v(1); 130 v.f(); 131 } 132 } 133 134 namespace test7 { 135 extern "C" { 136 class X { f()137 friend int f() { return 42; } 138 }; 139 } 140 } 141