Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 friend class A; // expected-error {{'friend' used outside of class}}
      4 void f() { friend class A; } // expected-error {{'friend' used outside of class}}
      5 class C { friend class A; };
      6 class D { void f() { friend class A; } }; // expected-error {{'friend' used outside of class}}
      7 
      8 // PR5760
      9 namespace test0 {
     10   namespace ns {
     11     void f(int);
     12   }
     13 
     14   struct A {
     15     friend void ns::f(int a);
     16   };
     17 }
     18 
     19 // Test derived from LLVM's Registry.h
     20 namespace test1 {
     21   template <class T> struct Outer {
     22     void foo(T);
     23     struct Inner {
     24       friend void Outer::foo(T);
     25     };
     26   };
     27 
     28   void test() {
     29     (void) Outer<int>::Inner();
     30   }
     31 }
     32 
     33 // PR5476
     34 namespace test2 {
     35   namespace foo {
     36     void Func(int x);
     37   }
     38 
     39   class Bar {
     40     friend void ::test2::foo::Func(int x);
     41   };
     42 }
     43 
     44 // PR5134
     45 namespace test3 {
     46   class Foo {
     47     friend const int getInt(int inInt = 0) {}
     48 
     49   };
     50 }
     51 
     52 namespace test4 {
     53   class T4A {
     54     friend class T4B;
     55 
     56   public:
     57     T4A(class T4B *);
     58 
     59   protected:
     60     T4B *mB;          // error here
     61   };
     62 
     63   class T4B {};
     64 }
     65 
     66 namespace rdar8529993 {
     67 struct A { ~A(); };
     68 
     69 struct B : A
     70 {
     71   template<int> friend A::~A(); // expected-error {{destructor cannot be declared as a template}}
     72 };
     73 }
     74 
     75 // PR7915
     76 namespace test5 {
     77   struct A;
     78   struct A1 { friend void A(); };
     79 
     80   struct B { friend void B(); };
     81 }
     82 
     83 // PR8479
     84 namespace test6_1 {
     85   class A {
     86    public:
     87    private:
     88     friend class vectorA;
     89     A() {}
     90   };
     91   class vectorA {
     92    public:
     93     vectorA(int i, const A& t = A()) {}
     94   };
     95   void f() {
     96     vectorA v(1);
     97   }
     98 }
     99 namespace test6_2 {
    100   template<class T>
    101   class vector {
    102    public:
    103     vector(int i, const T& t = T()) {}
    104   };
    105   class A {
    106    public:
    107    private:
    108     friend class vector<A>;
    109     A() {}
    110   };
    111   void f() {
    112     vector<A> v(1);
    113   }
    114 }
    115 namespace test6_3 {
    116   template<class T>
    117   class vector {
    118    public:
    119     vector(int i) {}
    120     void f(const T& t = T()) {}
    121   };
    122   class A {
    123    public:
    124    private:
    125     friend void vector<A>::f(const A&);
    126     A() {}
    127   };
    128   void f() {
    129     vector<A> v(1);
    130     v.f();
    131   }
    132 }
    133 
    134 namespace test7 {
    135   extern "C" {
    136     class X {
    137       friend int test7_f() { return 42; }
    138     };
    139   }
    140 }
    141 
    142 // PR15485
    143 namespace test8 {
    144   namespace ns1 {
    145     namespace ns2 {
    146       template<class T> void f(T t); // expected-note {{target of using declaration}}
    147     }
    148     using ns2::f; // expected-note {{using declaration}}
    149   }
    150   struct A { void f(); }; // expected-note {{target of using declaration}}
    151   struct B : public A { using A::f; }; // expected-note {{using declaration}}
    152   struct X {
    153     template<class T> friend void ns1::f(T t); // expected-error {{cannot befriend target of using declaration}}
    154     friend void B::f(); // expected-error {{cannot befriend target of using declaration}}
    155   };
    156 }
    157 
    158 // PR16423
    159 namespace test9 {
    160   class C {
    161   };
    162   struct A {
    163     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}}
    164   };
    165 }
    166 
    167 namespace test10 {
    168   struct X {};
    169   extern void f10_a();
    170   extern void f10_a(X);
    171   struct A {
    172     friend void f10_a();
    173     friend void f10_b();
    174     friend void f10_c();
    175     friend void f10_d();
    176     friend void f10_a(X);
    177     friend void f10_b(X);
    178     friend void f10_c(X);
    179     friend void f10_d(X);
    180   };
    181   extern void f10_b();
    182   extern void f10_b(X);
    183   struct B {
    184     friend void f10_a();
    185     friend void f10_b();
    186     friend void f10_c();
    187     friend void f10_d();
    188     friend void f10_a(X);
    189     friend void f10_b(X);
    190     friend void f10_c(X);
    191     friend void f10_d(X);
    192   };
    193   extern void f10_c();
    194   extern void f10_c(X);
    195 
    196   // FIXME: Give a better diagnostic for the case where a function exists but is
    197   // not visible.
    198   void g(X x) {
    199     f10_a();
    200     f10_b();
    201     f10_c();
    202     f10_d(); // expected-error {{undeclared identifier}}
    203 
    204     ::test10::f10_a();
    205     ::test10::f10_b();
    206     ::test10::f10_c();
    207     ::test10::f10_d(); // expected-error {{no member named 'f10_d'}}
    208 
    209     f10_a(x);
    210     f10_b(x);
    211     f10_c(x);
    212     f10_d(x); // PR16597: expected-error {{undeclared identifier}}
    213 
    214     ::test10::f10_a(x);
    215     ::test10::f10_b(x);
    216     ::test10::f10_c(x);
    217     ::test10::f10_d(x); // expected-error {{no type named 'f10_d'}}
    218   }
    219 
    220   struct Y : X {
    221     friend void f10_d();
    222     friend void f10_d(X);
    223   };
    224 
    225   struct Z {
    226     operator X();
    227     friend void f10_d();
    228     friend void f10_d(X);
    229   };
    230 
    231   void g(X x, Y y, Z z) {
    232     f10_d(); // expected-error {{undeclared identifier}}
    233     ::test10::f10_d(); // expected-error {{no member named 'f10_d'}}
    234 
    235     // f10_d is visible to ADL in the second and third cases.
    236     f10_d(x); // expected-error {{undeclared identifier}}
    237     f10_d(y);
    238     f10_d(z);
    239 
    240     // No ADL here.
    241     ::test10::f10_d(x); // expected-error {{no type named 'f10_d'}}
    242     ::test10::f10_d(y); // expected-error {{no type named 'f10_d'}}
    243     ::test10::f10_d(z); // expected-error {{no type named 'f10_d'}}
    244   }
    245 
    246   void local_externs(X x, Y y) {
    247     extern void f10_d();
    248     extern void f10_d(X);
    249     f10_d();
    250     f10_d(x);
    251     // FIXME: This lookup should fail, because the local extern declaration
    252     // should suppress ADL.
    253     f10_d(y);
    254     {
    255       int f10_d;
    256       f10_d(); // expected-error {{not a function}}
    257       f10_d(x); // expected-error {{not a function}}
    258       f10_d(y); // expected-error {{not a function}}
    259     }
    260   }
    261 
    262   void i(X x, Y y) {
    263     f10_d(); // expected-error {{undeclared identifier}}
    264     f10_d(x); // expected-error {{undeclared identifier}}
    265     f10_d(y);
    266   }
    267 
    268   struct C {
    269     friend void f10_d();
    270     friend void f10_d(X);
    271   };
    272 
    273   void j(X x, Y y) {
    274     f10_d(); // expected-error {{undeclared identifier}}
    275     f10_d(x); // expected-error {{undeclared identifier}}
    276     f10_d(y);
    277   }
    278 
    279   extern void f10_d();
    280   extern void f10_d(X);
    281   void k(X x, Y y, Z z) {
    282     // All OK now.
    283     f10_d();
    284     f10_d(x);
    285     ::test10::f10_d();
    286     ::test10::f10_d(x);
    287     ::test10::f10_d(y);
    288     ::test10::f10_d(z);
    289   }
    290 }
    291 
    292 namespace test11 {
    293   class __attribute__((visibility("hidden"))) B;
    294 
    295   class A {
    296     friend class __attribute__((visibility("hidden"), noreturn)) B; // expected-warning {{'noreturn' attribute only applies to functions and methods}}
    297   };
    298 }
    299