10e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++14
20033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlsson
30033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonfriend class A; // expected-error {{'friend' used outside of class}}
40033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonvoid f() { friend class A; } // expected-error {{'friend' used outside of class}}
50033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonclass C { friend class A; };
60033836b3c4bb578ef999813de4f5f1a24862d18Anders Carlssonclass D { void f() { friend class A; } }; // expected-error {{'friend' used outside of class}}
7e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall
8e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall// PR5760
9e7e278bce2301990107cef3f873cbbf7da94469aJohn McCallnamespace test0 {
10e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall  namespace ns {
11e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall    void f(int);
12e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall  }
13e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall
14e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall  struct A {
15e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall    friend void ns::f(int a);
16e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall  };
17e7e278bce2301990107cef3f873cbbf7da94469aJohn McCall}
18e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall
19e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall// Test derived from LLVM's Registry.h
20e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCallnamespace test1 {
21e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall  template <class T> struct Outer {
22e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall    void foo(T);
23e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall    struct Inner {
24e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall      friend void Outer::foo(T);
25e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall    };
26e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall  };
27e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall
28e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall  void test() {
29e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall    (void) Outer<int>::Inner();
30e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall  }
31e129d44aab6324aa2094d68730a7843c41a4e45fJohn McCall}
32df370002215a56cbbee139630f1cd8c8299b861fJohn McCall
33df370002215a56cbbee139630f1cd8c8299b861fJohn McCall// PR5476
34df370002215a56cbbee139630f1cd8c8299b861fJohn McCallnamespace test2 {
35df370002215a56cbbee139630f1cd8c8299b861fJohn McCall  namespace foo {
36df370002215a56cbbee139630f1cd8c8299b861fJohn McCall    void Func(int x);
37df370002215a56cbbee139630f1cd8c8299b861fJohn McCall  }
38df370002215a56cbbee139630f1cd8c8299b861fJohn McCall
39df370002215a56cbbee139630f1cd8c8299b861fJohn McCall  class Bar {
40df370002215a56cbbee139630f1cd8c8299b861fJohn McCall    friend void ::test2::foo::Func(int x);
41df370002215a56cbbee139630f1cd8c8299b861fJohn McCall  };
42df370002215a56cbbee139630f1cd8c8299b861fJohn McCall}
43bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall
44bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall// PR5134
45bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCallnamespace test3 {
46bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall  class Foo {
47f6a144f5991c6b29622a31fdab86adede0648d12David Majnemer    friend const int getInt(int inInt = 0) {}
485291c3cec0dbe8ad1d8e7e67e93af2b1586d5400Douglas Gregor
49bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall  };
50bc12044215a6d0d77b5c6f09df34e8506a8d80e1John McCall}
51e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor
52e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregornamespace test4 {
53e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor  class T4A {
54e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor    friend class T4B;
55e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor
56e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor  public:
57e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor    T4A(class T4B *);
58e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor
59e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor  protected:
60e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor    T4B *mB;          // error here
61e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor  };
62e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor
63e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor  class T4B {};
64e1aa9f3a5d3e2c0f8a5606e82eef3c65a6f30672Douglas Gregor}
651d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis
661d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidisnamespace rdar8529993 {
67cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregorstruct A { ~A(); };
681d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis
691d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidisstruct B : A
701d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis{
71cb710a4df50b79659399f0722ea29e90251ea834Douglas Gregor  template<int> friend A::~A(); // expected-error {{destructor cannot be declared as a template}}
721d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis};
731d1e70ec6545c8ca863e00aaca14287269a23c1cArgyrios Kyrtzidis}
74d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall
75d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall// PR7915
76d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCallnamespace test5 {
77d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall  struct A;
78d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall  struct A1 { friend void A(); };
79d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall
80d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall  struct B { friend void B(); };
81d7945c6bfd9e0cc7ed451e6c4acd8860f2d0eabaJohn McCall}
8208e41a656575ee63f8eefc7805493055c645fa85Nico Weber
8308e41a656575ee63f8eefc7805493055c645fa85Nico Weber// PR8479
8408e41a656575ee63f8eefc7805493055c645fa85Nico Webernamespace test6_1 {
8508e41a656575ee63f8eefc7805493055c645fa85Nico Weber  class A {
8608e41a656575ee63f8eefc7805493055c645fa85Nico Weber   public:
8708e41a656575ee63f8eefc7805493055c645fa85Nico Weber   private:
8808e41a656575ee63f8eefc7805493055c645fa85Nico Weber    friend class vectorA;
8908e41a656575ee63f8eefc7805493055c645fa85Nico Weber    A() {}
9008e41a656575ee63f8eefc7805493055c645fa85Nico Weber  };
9108e41a656575ee63f8eefc7805493055c645fa85Nico Weber  class vectorA {
9208e41a656575ee63f8eefc7805493055c645fa85Nico Weber   public:
9308e41a656575ee63f8eefc7805493055c645fa85Nico Weber    vectorA(int i, const A& t = A()) {}
9408e41a656575ee63f8eefc7805493055c645fa85Nico Weber  };
9508e41a656575ee63f8eefc7805493055c645fa85Nico Weber  void f() {
9608e41a656575ee63f8eefc7805493055c645fa85Nico Weber    vectorA v(1);
9708e41a656575ee63f8eefc7805493055c645fa85Nico Weber  }
9808e41a656575ee63f8eefc7805493055c645fa85Nico Weber}
9908e41a656575ee63f8eefc7805493055c645fa85Nico Webernamespace test6_2 {
10008e41a656575ee63f8eefc7805493055c645fa85Nico Weber  template<class T>
10108e41a656575ee63f8eefc7805493055c645fa85Nico Weber  class vector {
10208e41a656575ee63f8eefc7805493055c645fa85Nico Weber   public:
10308e41a656575ee63f8eefc7805493055c645fa85Nico Weber    vector(int i, const T& t = T()) {}
10408e41a656575ee63f8eefc7805493055c645fa85Nico Weber  };
10508e41a656575ee63f8eefc7805493055c645fa85Nico Weber  class A {
10608e41a656575ee63f8eefc7805493055c645fa85Nico Weber   public:
10708e41a656575ee63f8eefc7805493055c645fa85Nico Weber   private:
10808e41a656575ee63f8eefc7805493055c645fa85Nico Weber    friend class vector<A>;
10908e41a656575ee63f8eefc7805493055c645fa85Nico Weber    A() {}
11008e41a656575ee63f8eefc7805493055c645fa85Nico Weber  };
11108e41a656575ee63f8eefc7805493055c645fa85Nico Weber  void f() {
11208e41a656575ee63f8eefc7805493055c645fa85Nico Weber    vector<A> v(1);
11308e41a656575ee63f8eefc7805493055c645fa85Nico Weber  }
11408e41a656575ee63f8eefc7805493055c645fa85Nico Weber}
11515d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Webernamespace test6_3 {
11615d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber  template<class T>
11715d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber  class vector {
11815d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber   public:
11915d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber    vector(int i) {}
12015d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber    void f(const T& t = T()) {}
12115d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber  };
12215d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber  class A {
12315d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber   public:
12415d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber   private:
12515d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber    friend void vector<A>::f(const A&);
12615d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber    A() {}
12715d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber  };
12815d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber  void f() {
12915d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber    vector<A> v(1);
13015d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber    v.f();
13115d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber  }
13215d5c83ce698a6b6ae1166f9008c6ead34ae7a5dNico Weber}
1339c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky
1349c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewyckynamespace test7 {
1359c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky  extern "C" {
1369c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky    class X {
137aa4bc18240c03b5ed7952aa5e013c081f8733ed3Richard Smith      friend int test7_f() { return 42; }
1389c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky    };
1399c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky  }
1409c6fde5ac9c4a696baaa637a7fb6d83fe91e1e09Nick Lewycky}
14178037ac3e7562aa3e306eaba97f1c609b86337d9John McCall
14278037ac3e7562aa3e306eaba97f1c609b86337d9John McCall// PR15485
14378037ac3e7562aa3e306eaba97f1c609b86337d9John McCallnamespace test8 {
14478037ac3e7562aa3e306eaba97f1c609b86337d9John McCall  namespace ns1 {
14578037ac3e7562aa3e306eaba97f1c609b86337d9John McCall    namespace ns2 {
14678037ac3e7562aa3e306eaba97f1c609b86337d9John McCall      template<class T> void f(T t); // expected-note {{target of using declaration}}
14778037ac3e7562aa3e306eaba97f1c609b86337d9John McCall    }
14878037ac3e7562aa3e306eaba97f1c609b86337d9John McCall    using ns2::f; // expected-note {{using declaration}}
14978037ac3e7562aa3e306eaba97f1c609b86337d9John McCall  }
15078037ac3e7562aa3e306eaba97f1c609b86337d9John McCall  struct A { void f(); }; // expected-note {{target of using declaration}}
15178037ac3e7562aa3e306eaba97f1c609b86337d9John McCall  struct B : public A { using A::f; }; // expected-note {{using declaration}}
15278037ac3e7562aa3e306eaba97f1c609b86337d9John McCall  struct X {
15378037ac3e7562aa3e306eaba97f1c609b86337d9John McCall    template<class T> friend void ns1::f(T t); // expected-error {{cannot befriend target of using declaration}}
15478037ac3e7562aa3e306eaba97f1c609b86337d9John McCall    friend void B::f(); // expected-error {{cannot befriend target of using declaration}}
15578037ac3e7562aa3e306eaba97f1c609b86337d9John McCall  };
15678037ac3e7562aa3e306eaba97f1c609b86337d9John McCall}
157319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin
158319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin// PR16423
159319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Linnamespace test9 {
160319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin  class C {
161319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin  };
162319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin  struct A {
163319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin    friend void C::f(int, int, int) {}  // expected-error {{no function named 'f' with type 'void (int, int, int)' was found in the specified scope}}
164319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin  };
165319957c64a445b6e16bf00054fc4bb88754abfc8Stephen Lin}
166f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith
167f9e65a274d4e5c5a45503efc81da43be76503983Richard Smithnamespace test10 {
16822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  struct X {};
16922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_a();
17022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_a(X);
171f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith  struct A {
17222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_a();
17322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_b();
17422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_c();
17522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d();
17622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_a(X);
17722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_b(X);
17822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_c(X);
17922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d(X);
180f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith  };
18122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_b();
18222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_b(X);
183f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith  struct B {
18422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_a();
18522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_b();
18622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_c();
18722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d();
18822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_a(X);
18922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_b(X);
19022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_c(X);
19122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d(X);
192f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith  };
19322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_c();
19422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_c(X);
19522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
19622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  // FIXME: Give a better diagnostic for the case where a function exists but is
19722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  // not visible.
19822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  void g(X x) {
19922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_a();
20022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_b();
20122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_c();
20222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(); // expected-error {{undeclared identifier}}
20322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
20422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_a();
20522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_b();
20622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_c();
20722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(); // expected-error {{no member named 'f10_d'}}
20822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
20922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_a(x);
21022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_b(x);
21122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_c(x);
21222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(x); // PR16597: expected-error {{undeclared identifier}}
21322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
21422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_a(x);
21522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_b(x);
21622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_c(x);
21722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(x); // expected-error {{no type named 'f10_d'}}
21822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  }
21922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
22022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  struct Y : X {
22122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d();
22222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d(X);
22322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  };
22422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
22522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  struct Z {
22622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    operator X();
22722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d();
22822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d(X);
22922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  };
23022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
23122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  void g(X x, Y y, Z z) {
23222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(); // expected-error {{undeclared identifier}}
23322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(); // expected-error {{no member named 'f10_d'}}
23422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
23522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    // f10_d is visible to ADL in the second and third cases.
23622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(x); // expected-error {{undeclared identifier}}
23722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(y);
23822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(z);
23922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
24022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    // No ADL here.
24122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(x); // expected-error {{no type named 'f10_d'}}
24222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(y); // expected-error {{no type named 'f10_d'}}
24322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(z); // expected-error {{no type named 'f10_d'}}
24422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  }
24522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
24622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  void local_externs(X x, Y y) {
24722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    extern void f10_d();
24822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    extern void f10_d(X);
24922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d();
25022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(x);
25122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    // FIXME: This lookup should fail, because the local extern declaration
25222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    // should suppress ADL.
25322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(y);
25422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    {
25522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith      int f10_d;
25622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith      f10_d(); // expected-error {{not a function}}
25722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith      f10_d(x); // expected-error {{not a function}}
25822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith      f10_d(y); // expected-error {{not a function}}
25922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    }
26022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  }
26122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
26222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  void i(X x, Y y) {
26322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(); // expected-error {{undeclared identifier}}
26422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(x); // expected-error {{undeclared identifier}}
26522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(y);
26622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  }
26722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
26822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  struct C {
26922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d();
27022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    friend void f10_d(X);
27122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  };
27222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
27322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  void j(X x, Y y) {
27422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(); // expected-error {{undeclared identifier}}
27522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(x); // expected-error {{undeclared identifier}}
27622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(y);
27722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  }
27822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith
27922050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_d();
28022050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  extern void f10_d(X);
28122050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith  void k(X x, Y y, Z z) {
28222050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    // All OK now.
28322050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d();
28422050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    f10_d(x);
28522050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d();
28622050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(x);
28722050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(y);
28822050f25e34ba0cd21ee2dc3d765951c48e27cdeRichard Smith    ::test10::f10_d(z);
289f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith  }
290f9e65a274d4e5c5a45503efc81da43be76503983Richard Smith}
2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace test11 {
2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  class __attribute__((visibility("hidden"))) B;
2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  class A {
2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    friend class __attribute__((visibility("hidden"), noreturn)) B; // expected-warning {{'noreturn' attribute only applies to functions and methods}}
2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
2986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
2990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3000e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesnamespace pr21851 {
3010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// PR21851 was a problem where we assumed that when the friend function redecl
3020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// lookup found a C++ method, it would necessarily have a qualifier. Below we
3030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// have some test cases where unqualified lookup finds C++ methods without using
3040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// qualifiers. Unfortunately, we can't exercise the case of an access check
3050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// failure because nested classes always have access to the members of outer
3060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// classes.
3070e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3080e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid friend_own_method() {
3090e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  class A {
3100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    void m() {}
3110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    friend void m();
3120e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  };
3130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3150e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid friend_enclosing_method() {
3160e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  class A;
3170e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  class C {
3180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    int p;
3190e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    friend class A;
3200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  };
3210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  class A {
3220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    void enclosing_friend() {
3230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      (void)b->p;
3240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      (void)c->p;
3250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    }
3260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    class B {
3270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      void b(A *a) {
3280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        (void)a->c->p;
3290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      }
3300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      int p;
3310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      friend void enclosing_friend();
3320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    };
3330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    B *b;
3340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    C *c;
3350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  };
3360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3380e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic auto friend_file_func() {
3390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  extern void file_scope_friend();
3400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  class A {
3410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    int p;
3420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    friend void file_scope_friend();
3430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  };
3440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return A();
3450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3470e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid file_scope_friend() {
3480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  auto a = friend_file_func();
3490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  (void)a.p;
3500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3530e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate<typename T>
3540e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct X_pr6954 {
3550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  operator int();
3560e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  friend void f_pr6954(int x);
3570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
3580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3590e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint array0_pr6954[sizeof(X_pr6954<int>)];
3600e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesint array1_pr6954[sizeof(X_pr6954<float>)];
3610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
3620e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid g_pr6954() {
3630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  f_pr6954(5); // expected-error{{undeclared identifier 'f_pr6954'}}
3640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
3650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
366