blob: a4492ba1a7ab940dcb03b34971e6ef30edc84649 [file] [log] [blame]
Daniel Dunbar8fbe78f2009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Charles Li1a88adb2016-04-14 23:47:07 +00002// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
Anders Carlssoncd8db412009-05-06 04:46:28 +00004
5class C {
6 friend class D;
7};
Anders Carlsson22e37842009-05-11 22:25:03 +00008
9class A {
10public:
Mike Stump11289f42009-09-09 15:08:12 +000011 void f();
Anders Carlsson22e37842009-05-11 22:25:03 +000012};
13
John McCall07e91c02009-08-06 02:15:43 +000014friend int x; // expected-error {{'friend' used outside of class}}
15
16friend class D {}; // expected-error {{'friend' used outside of class}}
17
18union U {
19 int u1;
20};
21
Anders Carlsson22e37842009-05-11 22:25:03 +000022class B {
23 // 'A' here should refer to the declaration above.
24 friend class A;
25
Charles Li1a88adb2016-04-14 23:47:07 +000026 friend C;
27#if __cplusplus <= 199711L
28 // expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'class' to befriend 'C'}}
29#endif
30
31 friend U;
32#if __cplusplus <= 199711L
33 // expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'union' to befriend 'U'}}
34#endif
35
36 friend int;
37#if __cplusplus <= 199711L
38 // expected-warning@-2 {{non-class friend type 'int' is a C++11 extension}}
39#endif
John McCall07e91c02009-08-06 02:15:43 +000040
41 friend void myfunc();
42
43 void f(A *a) { a->f(); }
Anders Carlsson22e37842009-05-11 22:25:03 +000044};
John McCall07e91c02009-08-06 02:15:43 +000045
David Majnemeree4f4022014-03-30 06:44:54 +000046inline void bar() {} // expected-note {{previous definition is here}}
Alp Toker19bff322013-10-18 05:54:24 +000047class E {
48 friend void bar() {} // expected-error {{redefinition of 'bar'}}
49};
Chris Lattner045cbff2009-12-07 00:48:47 +000050
51
52
53
54template <typename t1, typename t2> class some_template;
55friend // expected-error {{'friend' used outside of class}}
56some_template<foo, bar>& // expected-error {{use of undeclared identifier 'foo'}}
57 ; // expected-error {{expected unqualified-id}}