1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 friend class A; // expected-error {{'friend' used outside of class}} 4 void f() { friend class A; } // expected-error {{'friend' used outside of class}} 5 class C { friend class A; }; 6 class 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 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; 89 A() {} 90 }; 91 class vectorA { 92 public: 93 vectorA(int i, const A& t = A()) {} 94 }; 95 void f() { 96 vectorA v(1); 97 } 98 } 99 namespace test6_2 { 100 template<class T> 101 class vector { 102 public: 103 vector(int i, const T& t = T()) {} 104 }; 105 class A { 106 public: 107 private: 108 friend class vector<A>; 109 A() {} 110 }; 111 void f() { 112 vector<A> v(1); 113 } 114 } 115 namespace test6_3 { 116 template<class T> 117 class vector { 118 public: 119 vector(int i) {} 120 void f(const T& t = T()) {} 121 }; 122 class A { 123 public: 124 private: 125 friend void vector<A>::f(const A&); 126 A() {} 127 }; 128 void f() { 129 vector<A> v(1); 130 v.f(); 131 } 132 } 133 134 namespace test7 { 135 extern "C" { 136 class X { 137 friend int f() { return 42; } 138 }; 139 } 140 } 141