p1.cpp revision 91cf4199cca311ea9c3b3a4e2b3984d508c9e5e3
1// RUN: clang-cc -fsyntax-only -verify %s 2 3struct Outer { 4 struct Inner { 5 int intfield; 6 }; 7}; 8 9struct Base { 10 void base_member(); 11 12 typedef int Int; 13 Int typedeffed_member(); 14}; 15 16struct Derived : public Base { 17}; 18 19int myglobal; 20 21void global_function(); 22extern "C" { 23 void global_c_function(); 24} 25 26class A { 27 class AInner { 28 }; 29 30 friend class PreDeclared; 31 friend class Outer::Inner; 32 friend int Outer::Inner::intfield; // expected-error {{ friends can only be classes or functions }} 33 friend int Outer::Inner::missing_field; //expected-error {{ friends can only be classes or functions }} 34 friend int myoperation(float); // okay 35 friend int myglobal; // expected-error {{ friends can only be classes or functions }} 36 37 friend void global_function(); 38 friend void global_c_function(); 39 40 void a_member(); 41 friend void A::a_member(); // expected-error {{ friends cannot be members of the declaring class }} 42 friend void a_member(); // okay (because we ignore class scopes when looking up friends) 43 friend class A::AInner; // this is okay as an extension 44 friend class AInner; // okay, refers to ::AInner 45 46 friend void Derived::missing_member(); // expected-error {{ no function named 'missing_member' with type 'void ()' was found in the specified scope }} 47 48 friend void Derived::base_member(); // expected-error {{ no function named 'base_member' with type 'void ()' was found in the specified scope }} 49 50 friend int Base::typedeffed_member(); // okay: should look through typedef 51 52 // These test that the friend is properly not being treated as a 53 // member function. 54 friend A operator|(const A& l, const A& r); // okay 55 friend A operator|(const A& r); // expected-error {{ overloaded 'operator|' must be a binary operator (has 1 parameter) }} 56 57 friend operator bool() const; // expected-error {{ must use a qualified name when declaring a conversion operator as a friend }} 58 59 typedef void ftypedef(); 60 friend ftypedef typedeffed_function; // okay (because it's not declared as a member) 61}; 62 63class PreDeclared; 64 65int myoperation(float f) { 66 return (int) f; 67} 68