blob: a3b89cc688bb486e0c2f38560d4d8541da2698aa [file] [log] [blame]
Daniel Dunbar8fbe78f2009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Anders Carlssoncd8db412009-05-06 04:46:28 +00002
3class C {
4 friend class D;
5};
Anders Carlsson22e37842009-05-11 22:25:03 +00006
7class A {
8public:
Mike Stump11289f42009-09-09 15:08:12 +00009 void f();
Anders Carlsson22e37842009-05-11 22:25:03 +000010};
11
John McCall07e91c02009-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 Carlsson22e37842009-05-11 22:25:03 +000020class B {
21 // 'A' here should refer to the declaration above.
22 friend class A;
23
Douglas Gregor932aac62011-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 McCall07e91c02009-08-06 02:15:43 +000027
28 friend void myfunc();
29
30 void f(A *a) { a->f(); }
Anders Carlsson22e37842009-05-11 22:25:03 +000031};
John McCall07e91c02009-08-06 02:15:43 +000032
Alp Toker19bff322013-10-18 05:54:24 +000033void bar() {} // expected-note {{previous definition is here}}
34class E {
35 friend void bar() {} // expected-error {{redefinition of 'bar'}}
36};
Chris Lattner045cbff2009-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}}