2009-12-16 04:14:24 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
2016-04-15 07:47:07 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
2009-05-06 12:46:28 +08:00
|
|
|
|
|
|
|
class C {
|
|
|
|
friend class D;
|
|
|
|
};
|
2009-05-12 06:25:03 +08:00
|
|
|
|
|
|
|
class A {
|
|
|
|
public:
|
2009-09-09 23:08:12 +08:00
|
|
|
void f();
|
2009-05-12 06:25:03 +08:00
|
|
|
};
|
|
|
|
|
2009-08-06 10:15:43 +08:00
|
|
|
friend int x; // expected-error {{'friend' used outside of class}}
|
|
|
|
|
|
|
|
friend class D {}; // expected-error {{'friend' used outside of class}}
|
|
|
|
|
|
|
|
union U {
|
|
|
|
int u1;
|
|
|
|
};
|
|
|
|
|
2009-05-12 06:25:03 +08:00
|
|
|
class B {
|
|
|
|
// 'A' here should refer to the declaration above.
|
|
|
|
friend class A;
|
|
|
|
|
2016-04-15 07:47:07 +08:00
|
|
|
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
|
2009-08-06 10:15:43 +08:00
|
|
|
|
|
|
|
friend void myfunc();
|
|
|
|
|
|
|
|
void f(A *a) { a->f(); }
|
2009-05-12 06:25:03 +08:00
|
|
|
};
|
2009-08-06 10:15:43 +08:00
|
|
|
|
2014-03-30 14:44:54 +08:00
|
|
|
inline void bar() {} // expected-note {{previous definition is here}}
|
2013-10-18 13:54:24 +08:00
|
|
|
class E {
|
|
|
|
friend void bar() {} // expected-error {{redefinition of 'bar'}}
|
|
|
|
};
|
2009-12-07 08:48:47 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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}}
|