| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| |
| class C { |
| friend class D; |
| }; |
| |
| class A { |
| public: |
| void f(); |
| }; |
| |
| friend int x; // expected-error {{'friend' used outside of class}} |
| |
| friend class D {}; // expected-error {{'friend' used outside of class}} |
| |
| union U { |
| int u1; |
| }; |
| |
| class B { |
| // 'A' here should refer to the declaration above. |
| friend class A; |
| |
| friend C; |
| #if __cplusplus <= 199711L |
| // expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'class' to befriend 'C'}} |
| #endif |
| |
| friend U; |
| #if __cplusplus <= 199711L |
| // expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'union' to befriend 'U'}} |
| #endif |
| |
| friend int; |
| #if __cplusplus <= 199711L |
| // expected-warning@-2 {{non-class friend type 'int' is a C++11 extension}} |
| #endif |
| |
| friend void myfunc(); |
| |
| void f(A *a) { a->f(); } |
| }; |
| |
| inline void bar() {} // expected-note {{previous definition is here}} |
| class E { |
| friend void bar() {} // expected-error {{redefinition of 'bar'}} |
| }; |
| |
| |
| |
| |
| template <typename t1, typename t2> class some_template; |
| friend // expected-error {{'friend' used outside of class}} |
| some_template<foo, bar>& // expected-error {{use of undeclared identifier 'foo'}} |
| ; // expected-error {{expected unqualified-id}} |