p1.cpp revision 67d1a67f3db2f1aa69083c5c94164d6e0ee05b32
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 21class A { 22 class AInner { 23 }; 24 25 friend class PreDeclared; 26 friend class Outer::Inner; 27 friend int Outer::Inner::intfield; // expected-error {{ friends can only be classes or functions }} 28 friend int Outer::Inner::missing_field; //expected-error {{ friends can only be classes or functions }} 29 friend int myoperation(float); // okay 30 friend int myglobal; // expected-error {{ friends can only be classes or functions }} 31 32 void a_member(); 33 friend void A::a_member(); // expected-error {{ friends cannot be members of the declaring class }} 34 friend void a_member(); // okay (because we ignore class scopes when looking up friends) 35 friend class A::AInner; // expected-error {{ friends cannot be members of the declaring class }} 36 friend class AInner; // expected-error {{ friends cannot be members of the declaring class }} 37 38 friend void Derived::missing_member(); // expected-error {{ no function named 'missing_member' with type 'void ()' was found in the specified scope }} 39 40 friend void Derived::base_member(); // expected-error {{ no function named 'base_member' with type 'void ()' was found in the specified scope }} 41 42 friend int Base::typedeffed_member(); // okay: should look through typedef 43 44 // These test that the friend is properly not being treated as a 45 // member function. 46 friend A operator|(const A& l, const A& r); // okay 47 friend A operator|(const A& r); // expected-error {{ overloaded 'operator|' must be a binary operator (has 1 parameter) }} 48 49 friend operator bool() const; // expected-error {{ must use a qualified name when declaring a conversion operator as a friend }} 50 51 typedef void ftypedef(); 52 friend ftypedef typedeffed_function; // okay (because it's not declared as a member) 53}; 54 55class PreDeclared; 56 57int myoperation(float f) { 58 return (int) f; 59} 60