58 lines
1.4 KiB
C++
58 lines
1.4 KiB
C++
// 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}}
|