blob: ef1aed50e62661283314ab87324bdb0b1ff3d394 [file] [log] [blame]
Daniel Dunbar8fbe78f2009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Anders Carlsson40a90c82009-09-13 23:59:13 +00002template<typename T> struct A {
3 struct B { };
4
5 friend struct B;
6};
7
8void f() {
9 A<int>::B b;
10}
Douglas Gregor2208a292009-09-26 20:57:03 +000011
12struct C0 {
13 friend struct A<int>;
14};
Douglas Gregorce40e2e2010-04-12 16:00:01 +000015
16namespace PR6770 {
17 namespace N {
18 int f1(int);
19 }
20 using namespace N;
21
22 namespace M {
23 float f1(float);
24 }
25 using M::f1;
26
27 template<typename T> void f1(T, T);
28 template <class T>
29 void f() {
30 friend class f; // expected-error{{'friend' used outside of class}}
Richard Trieu553b2b22011-12-15 00:38:15 +000031 friend class f1; // expected-error{{'friend' used outside of class}}
Douglas Gregorce40e2e2010-04-12 16:00:01 +000032 }
33}
Reid Kleckner93864172015-04-08 00:04:47 +000034
35namespace friend_redecl_inline {
36// We had a bug where instantiating the foo friend declaration would check the
37// defined-ness of the most recent decl while checking if the canonical decl was
38// inlined.
39void foo();
40void bar();
41template <typename T>
42class C {
43 friend void foo();
44 friend inline void bar();
45};
46inline void foo() {}
47inline void bar() {}
48C<int> c;
49}