brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · f748a2b Raw
118 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3// C++98 [class.friend]p7:4// C++11 [class.friend]p9:5//   A name nominated by a friend declaration shall be accessible in6//   the scope of the class containing the friend declaration.7 8// PR123289// Simple, non-templated case.10namespace test0 {11  class X {12    void f(); // expected-note {{implicitly declared private here}}13  };14 15  class Y {16    friend void X::f(); // expected-error {{friend function 'f' is a private member of 'test0::X'}}17  };18}19 20// Templated but non-dependent.21namespace test1 {22  class X {23    void f(); // expected-note {{implicitly declared private here}}24  };25 26  template <class T> class Y {27    friend void X::f(); // expected-error {{friend function 'f' is a private member of 'test1::X'}}28  };29}30 31// Dependent but instantiated at the right type.32namespace test2 {33  template <class T> class Y;34 35  class X {36    void f();37    friend class Y<int>;38  };39 40  template <class T> class Y {41    friend void X::f();42  };43 44  template class Y<int>;45}46 47// Dependent and instantiated at the wrong type.48namespace test3 {49  template <class T> class Y;50 51  class X {52    void f(); // expected-note {{implicitly declared private here}}53    friend class Y<int>;54  };55 56  template <class T> class Y {57    friend void X::f(); // expected-error {{friend function 'f' is a private member of 'test3::X'}}58  };59 60  template class Y<float>; // expected-note {{in instantiation}}61}62 63// Dependent because dependently-scoped.64namespace test4 {65  template <class T> class X {66    void f();67  };68 69  template <class T> class Y {70    friend void X<T>::f();71  };72}73 74// Dependently-scoped, no friends.75namespace test5 {76  template <class T> class X {77    void f(); // expected-note {{implicitly declared private here}}78  };79 80  template <class T> class Y {81    friend void X<T>::f(); // expected-error {{friend function 'f' is a private member of 'test5::X<int>'}}82  };83 84  template class Y<int>; // expected-note {{in instantiation}}85}86 87// Dependently-scoped, wrong friend.88namespace test6 {89  template <class T> class Y;90 91  template <class T> class X {92    void f(); // expected-note {{implicitly declared private here}}93    friend class Y<float>;94  };95 96  template <class T> class Y {97    friend void X<T>::f(); // expected-error {{friend function 'f' is a private member of 'test6::X<int>'}}98  };99 100  template class Y<int>; // expected-note {{in instantiation}}101}102 103// Dependently-scoped, right friend.104namespace test7 {105  template <class T> class Y;106 107  template <class T> class X {108    void f();109    friend class Y<int>;110  };111 112  template <class T> class Y {113    friend void X<T>::f();114  };115 116  template class Y<int>;117}118