// 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}}