18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s 2*1a88adbbSCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3*1a88adbbSCharles Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4cd8db41cSAnders Carlsson 5cd8db41cSAnders Carlsson class C { 6cd8db41cSAnders Carlsson friend class D; 7cd8db41cSAnders Carlsson }; 822e3784cSAnders Carlsson 922e3784cSAnders Carlsson class A { 1022e3784cSAnders Carlsson public: 1122e3784cSAnders Carlsson void f(); 1222e3784cSAnders Carlsson }; 1322e3784cSAnders Carlsson 1407e91c04SJohn McCall friend int x; // expected-error {{'friend' used outside of class}} 1507e91c04SJohn McCall 1607e91c04SJohn McCall friend class D {}; // expected-error {{'friend' used outside of class}} 1707e91c04SJohn McCall 1807e91c04SJohn McCall union U { 1907e91c04SJohn McCall int u1; 2007e91c04SJohn McCall }; 2107e91c04SJohn McCall 2222e3784cSAnders Carlsson class B { 2322e3784cSAnders Carlsson // 'A' here should refer to the declaration above. 2422e3784cSAnders Carlsson friend class A; 2522e3784cSAnders Carlsson 26*1a88adbbSCharles Li friend C; 27*1a88adbbSCharles Li #if __cplusplus <= 199711L 28*1a88adbbSCharles Li // expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'class' to befriend 'C'}} 29*1a88adbbSCharles Li #endif 30*1a88adbbSCharles Li 31*1a88adbbSCharles Li friend U; 32*1a88adbbSCharles Li #if __cplusplus <= 199711L 33*1a88adbbSCharles Li // expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'union' to befriend 'U'}} 34*1a88adbbSCharles Li #endif 35*1a88adbbSCharles Li 36*1a88adbbSCharles Li friend int; 37*1a88adbbSCharles Li #if __cplusplus <= 199711L 38*1a88adbbSCharles Li // expected-warning@-2 {{non-class friend type 'int' is a C++11 extension}} 39*1a88adbbSCharles Li #endif 4007e91c04SJohn McCall 4107e91c04SJohn McCall friend void myfunc(); 4207e91c04SJohn McCall f(A * a)4322e3784cSAnders Carlsson void f(A *a) { a->f(); } 4422e3784cSAnders Carlsson }; 4507e91c04SJohn McCall bar()46ee4f4025SDavid Majnemerinline void bar() {} // expected-note {{previous definition is here}} 4719bff32eSAlp Toker class E { bar()4819bff32eSAlp Toker friend void bar() {} // expected-error {{redefinition of 'bar'}} 4919bff32eSAlp Toker }; 50045cbffbSChris Lattner 51045cbffbSChris Lattner 52045cbffbSChris Lattner 53045cbffbSChris Lattner 54045cbffbSChris Lattner template <typename t1, typename t2> class some_template; 55045cbffbSChris Lattner friend // expected-error {{'friend' used outside of class}} 56045cbffbSChris Lattner some_template<foo, bar>& // expected-error {{use of undeclared identifier 'foo'}} 57045cbffbSChris Lattner ; // expected-error {{expected unqualified-id}} 58