blob: ace0ff26e2d9a4b0e6faca3d1be0a363a9b2acde [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Anders Carlssonf47f7a12009-05-06 04:46:28 +00002
3class C {
4 friend class D;
5};
Anders Carlsson5dc2af12009-05-11 22:25:03 +00006
7class A {
8public:
Mike Stump1eb44332009-09-09 15:08:12 +00009 void f();
Anders Carlsson5dc2af12009-05-11 22:25:03 +000010};
11
John McCall67d1a672009-08-06 02:15:43 +000012friend int x; // expected-error {{'friend' used outside of class}}
13
14friend class D {}; // expected-error {{'friend' used outside of class}}
15
16union U {
17 int u1;
18};
19
Anders Carlsson5dc2af12009-05-11 22:25:03 +000020class B {
21 // 'A' here should refer to the declaration above.
22 friend class A;
23
Douglas Gregor44054452011-05-10 21:23:31 +000024 friend C; // expected-warning {{specify 'class' to befriend}}
25 friend U; // expected-warning {{specify 'union' to befriend}}
26 friend int; // expected-warning {{non-class friend type 'int'}}
John McCall67d1a672009-08-06 02:15:43 +000027
28 friend void myfunc();
29
30 void f(A *a) { a->f(); }
Anders Carlsson5dc2af12009-05-11 22:25:03 +000031};
John McCall67d1a672009-08-06 02:15:43 +000032
Stephen Hines651f13c2014-04-23 16:59:28 -070033inline void bar() {} // expected-note {{previous definition is here}}
Alp Toker530fa4f2013-10-18 05:54:24 +000034class E {
35 friend void bar() {} // expected-error {{redefinition of 'bar'}}
36};
Chris Lattnerbd87c0b2009-12-07 00:48:47 +000037
38
39
40
41template <typename t1, typename t2> class some_template;
42friend // expected-error {{'friend' used outside of class}}
43some_template<foo, bar>& // expected-error {{use of undeclared identifier 'foo'}}
44 ; // expected-error {{expected unqualified-id}}