xref: /llvm-project/clang/test/Parser/cxx-friend.cpp (revision 1a88adbb27a21e7728253c2f932b41009e314985)
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 Majnemer inline 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