xref: /aosp_15_r20/external/clang/test/CXX/class.access/p4.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li // C++0x [class.access]p4:
4*67e74705SXin Li 
5*67e74705SXin Li //   Access control is applied uniformly to all names, whether the
6*67e74705SXin Li //   names are referred to from declarations or expressions.  In the
7*67e74705SXin Li //   case of overloaded function names, access control is applied to
8*67e74705SXin Li //   the function selected by overload resolution.
9*67e74705SXin Li 
10*67e74705SXin Li class Public {} PublicInst;
11*67e74705SXin Li class Protected {} ProtectedInst;
12*67e74705SXin Li class Private {} PrivateInst;
13*67e74705SXin Li 
14*67e74705SXin Li namespace test0 {
15*67e74705SXin Li   class A {
16*67e74705SXin Li   public:
17*67e74705SXin Li     void foo(Public&);
18*67e74705SXin Li   protected:
19*67e74705SXin Li     void foo(Protected&); // expected-note 2 {{declared protected here}}
20*67e74705SXin Li   private:
21*67e74705SXin Li     void foo(Private&); // expected-note 2 {{declared private here}}
22*67e74705SXin Li   };
23*67e74705SXin Li 
test(A * op)24*67e74705SXin Li   void test(A *op) {
25*67e74705SXin Li     op->foo(PublicInst);
26*67e74705SXin Li     op->foo(ProtectedInst); // expected-error {{'foo' is a protected member}}
27*67e74705SXin Li     op->foo(PrivateInst); // expected-error {{'foo' is a private member}}
28*67e74705SXin Li 
29*67e74705SXin Li     void (A::*a)(Public&) = &A::foo;
30*67e74705SXin Li     void (A::*b)(Protected&) = &A::foo; // expected-error {{'foo' is a protected member}}
31*67e74705SXin Li     void (A::*c)(Private&) = &A::foo; // expected-error {{'foo' is a private member}}
32*67e74705SXin Li   }
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li // Member operators.
36*67e74705SXin Li namespace test1 {
37*67e74705SXin Li   class A {
38*67e74705SXin Li   public:
39*67e74705SXin Li     void operator+(Public&);
40*67e74705SXin Li     void operator[](Public&);
41*67e74705SXin Li     void operator()(Public&);
42*67e74705SXin Li     typedef void (*PublicSurrogate)(Public&);
43*67e74705SXin Li     operator PublicSurrogate() const;
44*67e74705SXin Li   protected:
45*67e74705SXin Li     void operator+(Protected&); // expected-note {{declared protected here}}
46*67e74705SXin Li     void operator[](Protected&); // expected-note {{declared protected here}}
47*67e74705SXin Li     void operator()(Protected&); // expected-note {{declared protected here}}
48*67e74705SXin Li     typedef void (*ProtectedSurrogate)(Protected&);
49*67e74705SXin Li     operator ProtectedSurrogate() const; // expected-note {{declared protected here}}
50*67e74705SXin Li   private:
51*67e74705SXin Li     void operator+(Private&); // expected-note {{declared private here}}
52*67e74705SXin Li     void operator[](Private&); // expected-note {{declared private here}}
53*67e74705SXin Li     void operator()(Private&); // expected-note {{declared private here}}
54*67e74705SXin Li     void operator-(); // expected-note {{declared private here}}
55*67e74705SXin Li     typedef void (*PrivateSurrogate)(Private&);
56*67e74705SXin Li     operator PrivateSurrogate() const; // expected-note {{declared private here}}
57*67e74705SXin Li   };
58*67e74705SXin Li   void operator+(const A &, Public&);
59*67e74705SXin Li   void operator+(const A &, Protected&);
60*67e74705SXin Li   void operator+(const A &, Private&);
61*67e74705SXin Li   void operator-(const A &);
62*67e74705SXin Li 
test(A & a,Public & pub,Protected & prot,Private & priv)63*67e74705SXin Li   void test(A &a, Public &pub, Protected &prot, Private &priv) {
64*67e74705SXin Li     a + pub;
65*67e74705SXin Li     a + prot; // expected-error {{'operator+' is a protected member}}
66*67e74705SXin Li     a + priv; // expected-error {{'operator+' is a private member}}
67*67e74705SXin Li     a[pub];
68*67e74705SXin Li     a[prot]; // expected-error {{'operator[]' is a protected member}}
69*67e74705SXin Li     a[priv]; // expected-error {{'operator[]' is a private member}}
70*67e74705SXin Li     a(pub);
71*67e74705SXin Li     a(prot); // expected-error {{'operator()' is a protected member}}
72*67e74705SXin Li     a(priv); // expected-error {{'operator()' is a private member}}
73*67e74705SXin Li     -a;       // expected-error {{'operator-' is a private member}}
74*67e74705SXin Li 
75*67e74705SXin Li     const A &ca = a;
76*67e74705SXin Li     ca + pub;
77*67e74705SXin Li     ca + prot;
78*67e74705SXin Li     ca + priv;
79*67e74705SXin Li     -ca;
80*67e74705SXin Li     // These are all surrogate calls
81*67e74705SXin Li     ca(pub);
82*67e74705SXin Li     ca(prot); // expected-error {{'operator void (*)(Protected &)' is a protected member}}
83*67e74705SXin Li     ca(priv); // expected-error {{'operator void (*)(Private &)' is a private member}}
84*67e74705SXin Li   }
85*67e74705SXin Li }
86*67e74705SXin Li 
87*67e74705SXin Li // Implicit constructor calls.
88*67e74705SXin Li namespace test2 {
89*67e74705SXin Li   class A {
90*67e74705SXin Li   private:
91*67e74705SXin Li     A(); // expected-note 3 {{declared private here}}
92*67e74705SXin Li 
93*67e74705SXin Li     static A foo;
94*67e74705SXin Li   };
95*67e74705SXin Li 
96*67e74705SXin Li   A a; // expected-error {{calling a private constructor}}
97*67e74705SXin Li   A A::foo; // okay
98*67e74705SXin Li 
99*67e74705SXin Li   class B : A { }; // expected-error {{base class 'test2::A' has private default constructor}}
100*67e74705SXin Li   B b; // expected-note{{implicit default constructor}}
101*67e74705SXin Li 
102*67e74705SXin Li   class C : virtual A {
103*67e74705SXin Li   public:
104*67e74705SXin Li     C();
105*67e74705SXin Li   };
106*67e74705SXin Li 
107*67e74705SXin Li   class D : C { }; // expected-error {{inherited virtual base class 'test2::A' has private default constructor}}
108*67e74705SXin Li   D d; // expected-note{{implicit default constructor}}
109*67e74705SXin Li }
110*67e74705SXin Li 
111*67e74705SXin Li // Implicit destructor calls.
112*67e74705SXin Li namespace test3 {
113*67e74705SXin Li   class A {
114*67e74705SXin Li   private:
115*67e74705SXin Li     ~A(); // expected-note 2 {{declared private here}}
116*67e74705SXin Li     static A foo;
117*67e74705SXin Li   };
118*67e74705SXin Li 
119*67e74705SXin Li   A a; // expected-error {{variable of type 'test3::A' has private destructor}}
120*67e74705SXin Li   A A::foo;
121*67e74705SXin Li 
foo(A param)122*67e74705SXin Li   void foo(A param) { // okay
123*67e74705SXin Li     A local; // expected-error {{variable of type 'test3::A' has private destructor}}
124*67e74705SXin Li   }
125*67e74705SXin Li 
126*67e74705SXin Li   template <unsigned N> class Base { ~Base(); }; // expected-note 14 {{declared private here}}
127*67e74705SXin Li   class Base2 : virtual Base<2> { ~Base2(); }; // expected-note 3 {{declared private here}} \
128*67e74705SXin Li                                                // expected-error {{base class 'Base<2>' has private destructor}}
129*67e74705SXin Li   class Base3 : virtual Base<3> { public: ~Base3(); }; // expected-error {{base class 'Base<3>' has private destructor}}
130*67e74705SXin Li 
131*67e74705SXin Li   // These don't cause diagnostics because we don't need the destructor.
132*67e74705SXin Li   class Derived0 : Base<0> { ~Derived0(); };
133*67e74705SXin Li   class Derived1 : Base<1> { };
134*67e74705SXin Li 
135*67e74705SXin Li   class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \
136*67e74705SXin Li                    // expected-error {{inherited virtual base class 'Base<3>' has private destructor}}
137*67e74705SXin Li     Base<0>,  // expected-error {{base class 'Base<0>' has private destructor}}
138*67e74705SXin Li     virtual Base<1>, // expected-error {{base class 'Base<1>' has private destructor}}
139*67e74705SXin Li     Base2, // expected-error {{base class 'test3::Base2' has private destructor}}
140*67e74705SXin Li     virtual Base3
141*67e74705SXin Li   {
~Derived2()142*67e74705SXin Li     ~Derived2() {}
143*67e74705SXin Li   };
144*67e74705SXin Li 
145*67e74705SXin Li   class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \
146*67e74705SXin Li                    // expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}} \
147*67e74705SXin Li     // expected-note 2{{implicit default constructor}}
148*67e74705SXin Li     Base<0>,  // expected-error 2 {{base class 'Base<0>' has private destructor}}
149*67e74705SXin Li     virtual Base<1>, // expected-error 2 {{base class 'Base<1>' has private destructor}}
150*67e74705SXin Li     Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}}
151*67e74705SXin Li     virtual Base3
152*67e74705SXin Li   {};
153*67e74705SXin Li   Derived3 d3; // expected-note {{implicit default constructor}}\
154*67e74705SXin Li                // expected-note{{implicit destructor}}}
155*67e74705SXin Li }
156*67e74705SXin Li 
157*67e74705SXin Li // Conversion functions.
158*67e74705SXin Li namespace test4 {
159*67e74705SXin Li   class Base {
160*67e74705SXin Li   private:
161*67e74705SXin Li     operator Private(); // expected-note 4 {{declared private here}}
162*67e74705SXin Li   public:
163*67e74705SXin Li     operator Public(); // expected-note 2{{member is declared here}}
164*67e74705SXin Li   };
165*67e74705SXin Li 
166*67e74705SXin Li   class Derived1 : private Base { // expected-note 2 {{declared private here}} \
167*67e74705SXin Li                                   // expected-note {{constrained by private inheritance}}
test1()168*67e74705SXin Li     Private test1() { return *this; } // expected-error {{'operator Private' is a private member}}
test2()169*67e74705SXin Li     Public test2() { return *this; }
170*67e74705SXin Li   };
test1(Derived1 & d)171*67e74705SXin Li   Private test1(Derived1 &d) { return d; } // expected-error {{'operator Private' is a private member}} \
172*67e74705SXin Li                                            // expected-error {{cannot cast 'test4::Derived1' to its private base class}}
test2(Derived1 & d)173*67e74705SXin Li   Public test2(Derived1 &d) { return d; } // expected-error {{cannot cast 'test4::Derived1' to its private base class}} \
174*67e74705SXin Li                                           // expected-error {{'operator Public' is a private member}}
175*67e74705SXin Li 
176*67e74705SXin Li 
177*67e74705SXin Li   class Derived2 : public Base {
test1()178*67e74705SXin Li     Private test1() { return *this; } // expected-error {{'operator Private' is a private member}}
test2()179*67e74705SXin Li     Public test2() { return *this; }
180*67e74705SXin Li   };
test1(Derived2 & d)181*67e74705SXin Li   Private test1(Derived2 &d) { return d; } // expected-error {{'operator Private' is a private member}}
test2(Derived2 & d)182*67e74705SXin Li   Public test2(Derived2 &d) { return d; }
183*67e74705SXin Li 
184*67e74705SXin Li   class Derived3 : private Base { // expected-note {{constrained by private inheritance here}} \
185*67e74705SXin Li                                   // expected-note {{declared private here}}
186*67e74705SXin Li   public:
187*67e74705SXin Li     operator Private();
188*67e74705SXin Li   };
test1(Derived3 & d)189*67e74705SXin Li   Private test1(Derived3 &d) { return d; }
test2(Derived3 & d)190*67e74705SXin Li   Public test2(Derived3 &d) { return d; } // expected-error {{'operator Public' is a private member of 'test4::Base'}} \
191*67e74705SXin Li                                           // expected-error {{cannot cast 'test4::Derived3' to its private base class}}
192*67e74705SXin Li 
193*67e74705SXin Li   class Derived4 : public Base {
194*67e74705SXin Li   public:
195*67e74705SXin Li     operator Private();
196*67e74705SXin Li   };
test1(Derived4 & d)197*67e74705SXin Li   Private test1(Derived4 &d) { return d; }
test2(Derived4 & d)198*67e74705SXin Li   Public test2(Derived4 &d) { return d; }
199*67e74705SXin Li }
200*67e74705SXin Li 
201*67e74705SXin Li // Implicit copy assignment operator uses.
202*67e74705SXin Li namespace test5 {
203*67e74705SXin Li   class A {
204*67e74705SXin Li     void operator=(const A &); // expected-note 2 {{implicitly declared private here}}
205*67e74705SXin Li   };
206*67e74705SXin Li 
207*67e74705SXin Li   class Test1 { A a; }; // expected-error {{private member}}
test1()208*67e74705SXin Li   void test1() {
209*67e74705SXin Li     Test1 a;
210*67e74705SXin Li     a = Test1(); // expected-note{{implicit copy}}
211*67e74705SXin Li   }
212*67e74705SXin Li 
213*67e74705SXin Li   class Test2 : A {}; // expected-error {{private member}}
test2()214*67e74705SXin Li   void test2() {
215*67e74705SXin Li     Test2 a;
216*67e74705SXin Li     a = Test2(); // expected-note{{implicit copy}}
217*67e74705SXin Li   }
218*67e74705SXin Li }
219*67e74705SXin Li 
220*67e74705SXin Li // Implicit copy constructor uses.
221*67e74705SXin Li namespace test6 {
222*67e74705SXin Li   class A {
223*67e74705SXin Li     public: A();
224*67e74705SXin Li     private: A(const A &); // expected-note 2 {{declared private here}}
225*67e74705SXin Li   };
226*67e74705SXin Li 
227*67e74705SXin Li   class Test1 { A a; }; // expected-error {{field of type 'test6::A' has private copy constructor}}
test1(const Test1 & t)228*67e74705SXin Li   void test1(const Test1 &t) {
229*67e74705SXin Li     Test1 a = t; // expected-note{{implicit copy}}
230*67e74705SXin Li   }
231*67e74705SXin Li 
232*67e74705SXin Li   class Test2 : A {}; // expected-error {{base class 'test6::A' has private copy constructor}}
test2(const Test2 & t)233*67e74705SXin Li   void test2(const Test2 &t) {
234*67e74705SXin Li     Test2 a = t; // expected-note{{implicit copy}}
235*67e74705SXin Li   }
236*67e74705SXin Li }
237*67e74705SXin Li 
238*67e74705SXin Li // Redeclaration lookups are not accesses.
239*67e74705SXin Li namespace test7 {
240*67e74705SXin Li   class A {
241*67e74705SXin Li     int private_member;
242*67e74705SXin Li   };
243*67e74705SXin Li   class B : A {
foo(int private_member)244*67e74705SXin Li     int foo(int private_member) {
245*67e74705SXin Li       return 0;
246*67e74705SXin Li     }
247*67e74705SXin Li   };
248*67e74705SXin Li }
249*67e74705SXin Li 
250*67e74705SXin Li // Ignored operator new and delete overloads are not
251*67e74705SXin Li namespace test8 {
252*67e74705SXin Li   typedef __typeof__(sizeof(int)) size_t;
253*67e74705SXin Li 
254*67e74705SXin Li   class A {
255*67e74705SXin Li     void *operator new(size_t s);
256*67e74705SXin Li     void operator delete(void *p);
257*67e74705SXin Li   public:
258*67e74705SXin Li     void *operator new(size_t s, int n);
259*67e74705SXin Li     void operator delete(void *p, int n);
260*67e74705SXin Li   };
261*67e74705SXin Li 
test()262*67e74705SXin Li   void test() {
263*67e74705SXin Li     new (2) A();
264*67e74705SXin Li   }
265*67e74705SXin Li }
266*67e74705SXin Li 
267*67e74705SXin Li // Don't silently upgrade forbidden-access paths to private.
268*67e74705SXin Li namespace test9 {
269*67e74705SXin Li   class A {
270*67e74705SXin Li   public: static int x; // expected-note {{member is declared here}}
271*67e74705SXin Li   };
272*67e74705SXin Li   class B : private A { // expected-note {{constrained by private inheritance here}}
273*67e74705SXin Li   };
274*67e74705SXin Li   class C : public B {
getX()275*67e74705SXin Li     static int getX() { return x; } // expected-error {{'x' is a private member of 'test9::A'}}
276*67e74705SXin Li   };
277*67e74705SXin Li }
278*67e74705SXin Li 
279*67e74705SXin Li namespace test10 {
280*67e74705SXin Li   class A {
281*67e74705SXin Li     enum {
282*67e74705SXin Li       value = 10 // expected-note {{declared private here}}
283*67e74705SXin Li     };
284*67e74705SXin Li     friend class C;
285*67e74705SXin Li   };
286*67e74705SXin Li 
287*67e74705SXin Li   class B {
288*67e74705SXin Li     enum {
289*67e74705SXin Li       value = A::value // expected-error {{'value' is a private member of 'test10::A'}}
290*67e74705SXin Li     };
291*67e74705SXin Li   };
292*67e74705SXin Li 
293*67e74705SXin Li   class C {
294*67e74705SXin Li     enum {
295*67e74705SXin Li       value = A::value
296*67e74705SXin Li     };
297*67e74705SXin Li   };
298*67e74705SXin Li }
299*67e74705SXin Li 
300*67e74705SXin Li namespace test11 {
301*67e74705SXin Li   class A {
302*67e74705SXin Li     protected: virtual ~A();
303*67e74705SXin Li   };
304*67e74705SXin Li 
305*67e74705SXin Li   class B : public A {
306*67e74705SXin Li     ~B();
307*67e74705SXin Li   };
308*67e74705SXin Li 
~B()309*67e74705SXin Li   B::~B() {};
310*67e74705SXin Li }
311*67e74705SXin Li 
312*67e74705SXin Li namespace test12 {
313*67e74705SXin Li   class A {
314*67e74705SXin Li     int x;
315*67e74705SXin Li 
foo()316*67e74705SXin Li     void foo() {
317*67e74705SXin Li       class Local {
318*67e74705SXin Li         int foo(A *a) {
319*67e74705SXin Li           return a->x;
320*67e74705SXin Li         }
321*67e74705SXin Li       };
322*67e74705SXin Li     }
323*67e74705SXin Li   };
324*67e74705SXin Li }
325*67e74705SXin Li 
326*67e74705SXin Li namespace test13 {
327*67e74705SXin Li   struct A {
328*67e74705SXin Li     int x;
329*67e74705SXin Li     unsigned foo() const;
330*67e74705SXin Li   };
331*67e74705SXin Li 
332*67e74705SXin Li   struct B : protected A {
333*67e74705SXin Li     using A::foo;
334*67e74705SXin Li     using A::x;
335*67e74705SXin Li   };
336*67e74705SXin Li 
test()337*67e74705SXin Li   void test() {
338*67e74705SXin Li     A *d;
339*67e74705SXin Li     d->foo();
340*67e74705SXin Li     (void) d->x;
341*67e74705SXin Li   }
342*67e74705SXin Li }
343*67e74705SXin Li 
344*67e74705SXin Li // Destructors for temporaries.
345*67e74705SXin Li namespace test14 {
346*67e74705SXin Li   class A {
347*67e74705SXin Li   private: ~A(); // expected-note {{declared private here}}
348*67e74705SXin Li   };
349*67e74705SXin Li   A foo();
350*67e74705SXin Li 
test()351*67e74705SXin Li   void test() {
352*67e74705SXin Li     foo(); // expected-error {{temporary of type 'test14::A' has private destructor}}
353*67e74705SXin Li   }
354*67e74705SXin Li 
355*67e74705SXin Li   class X {
356*67e74705SXin Li     ~X(); // expected-note {{declared private here}}
357*67e74705SXin Li   };
358*67e74705SXin Li 
359*67e74705SXin Li   struct Y1 {
360*67e74705SXin Li     operator X();
361*67e74705SXin Li   };
362*67e74705SXin Li 
g()363*67e74705SXin Li   void g() {
364*67e74705SXin Li     const X &xr = Y1(); // expected-error{{temporary of type 'test14::X' has private destructor}}
365*67e74705SXin Li   }
366*67e74705SXin Li }
367*67e74705SXin Li 
368*67e74705SXin Li // PR 7024
369*67e74705SXin Li namespace test15 {
370*67e74705SXin Li   template <class T> class A {
371*67e74705SXin Li   private:
372*67e74705SXin Li     int private_foo; // expected-note {{declared private here}}
373*67e74705SXin Li     static int private_sfoo; // expected-note {{declared private here}}
374*67e74705SXin Li   protected:
375*67e74705SXin Li     int protected_foo; // expected-note 3 {{declared protected here}} // expected-note {{can only access this member on an object of type 'test15::B<int>'}}
376*67e74705SXin Li     static int protected_sfoo; // expected-note 3 {{declared protected here}}
377*67e74705SXin Li 
test1(A<int> & a)378*67e74705SXin Li     int test1(A<int> &a) {
379*67e74705SXin Li       return a.private_foo; // expected-error {{private member}}
380*67e74705SXin Li     }
381*67e74705SXin Li 
test2(A<int> & a)382*67e74705SXin Li     int test2(A<int> &a) {
383*67e74705SXin Li       return a.private_sfoo; // expected-error {{private member}}
384*67e74705SXin Li     }
385*67e74705SXin Li 
test3(A<int> & a)386*67e74705SXin Li     int test3(A<int> &a) {
387*67e74705SXin Li       return a.protected_foo; // expected-error {{protected member}}
388*67e74705SXin Li     }
389*67e74705SXin Li 
test4(A<int> & a)390*67e74705SXin Li     int test4(A<int> &a) {
391*67e74705SXin Li       return a.protected_sfoo; // expected-error {{protected member}}
392*67e74705SXin Li     }
393*67e74705SXin Li   };
394*67e74705SXin Li 
395*67e74705SXin Li   template class A<int>;
396*67e74705SXin Li   template class A<long>; // expected-note 4 {{in instantiation}}
397*67e74705SXin Li 
398*67e74705SXin Li   template <class T> class B : public A<T> {
399*67e74705SXin Li     // TODO: These first two accesses can be detected as ill-formed at
400*67e74705SXin Li     // definition time because they're member accesses and A<int> can't
401*67e74705SXin Li     // be a subclass of B<T> for any T.
402*67e74705SXin Li 
test1(A<int> & a)403*67e74705SXin Li     int test1(A<int> &a) {
404*67e74705SXin Li       return a.protected_foo; // expected-error 2 {{protected member}}
405*67e74705SXin Li     }
406*67e74705SXin Li 
test2(A<int> & a)407*67e74705SXin Li     int test2(A<int> &a) {
408*67e74705SXin Li       return a.protected_sfoo; // expected-error {{protected member}}
409*67e74705SXin Li     }
410*67e74705SXin Li 
test3(B<int> & b)411*67e74705SXin Li     int test3(B<int> &b) {
412*67e74705SXin Li       return b.protected_foo; // expected-error {{protected member}}
413*67e74705SXin Li     }
414*67e74705SXin Li 
test4(B<int> & b)415*67e74705SXin Li     int test4(B<int> &b) {
416*67e74705SXin Li       return b.protected_sfoo; // expected-error {{protected member}}
417*67e74705SXin Li     }
418*67e74705SXin Li   };
419*67e74705SXin Li 
420*67e74705SXin Li   template class B<int>;  // expected-note {{in instantiation}}
421*67e74705SXin Li   template class B<long>; // expected-note 4 {{in instantiation}}
422*67e74705SXin Li }
423*67e74705SXin Li 
424*67e74705SXin Li // PR7281
425*67e74705SXin Li namespace test16 {
426*67e74705SXin Li   class A { ~A(); }; // expected-note 2{{declared private here}}
b()427*67e74705SXin Li   void b() { throw A(); } // expected-error{{temporary of type 'test16::A' has private destructor}} \
428*67e74705SXin Li   // expected-error{{exception object of type 'test16::A' has private destructor}}
429*67e74705SXin Li }
430*67e74705SXin Li 
431*67e74705SXin Li // rdar://problem/8146294
432*67e74705SXin Li namespace test17 {
433*67e74705SXin Li   class A {
434*67e74705SXin Li     template <typename T> class Inner { }; // expected-note {{declared private here}}
435*67e74705SXin Li   };
436*67e74705SXin Li 
437*67e74705SXin Li   A::Inner<int> s; // expected-error {{'Inner' is a private member of 'test17::A'}}
438*67e74705SXin Li }
439*67e74705SXin Li 
440*67e74705SXin Li namespace test18 {
441*67e74705SXin Li   template <class T> class A {};
442*67e74705SXin Li   class B : A<int> {
443*67e74705SXin Li     A<int> member;
444*67e74705SXin Li   };
445*67e74705SXin Li 
446*67e74705SXin Li   // FIXME: this access to A should be forbidden (because C++ is dumb),
447*67e74705SXin Li   // but LookupResult can't express the necessary information to do
448*67e74705SXin Li   // the check, so we aggressively suppress access control.
449*67e74705SXin Li   class C : B {
450*67e74705SXin Li     A<int> member;
451*67e74705SXin Li   };
452*67e74705SXin Li }
453*67e74705SXin Li 
454*67e74705SXin Li // PR8325
455*67e74705SXin Li namespace test19 {
456*67e74705SXin Li   class A { ~A(); };
457*67e74705SXin Li   // The destructor is not implicitly referenced here.  Contrast to test16,
458*67e74705SXin Li   // testing PR7281, earlier in this file.
b(A * x)459*67e74705SXin Li   void b(A* x) { throw x; }
460*67e74705SXin Li }
461*67e74705SXin Li 
462*67e74705SXin Li // PR7930
463*67e74705SXin Li namespace test20 {
464*67e74705SXin Li   class Foo {
465*67e74705SXin Li     Foo(); // expected-note {{implicitly declared private here}}
466*67e74705SXin Li   };
Foo()467*67e74705SXin Li   Foo::Foo() {}
468*67e74705SXin Li 
test()469*67e74705SXin Li   void test() {
470*67e74705SXin Li     Foo a; // expected-error {{calling a private constructor}}
471*67e74705SXin Li   }
472*67e74705SXin Li }
473*67e74705SXin Li 
474*67e74705SXin Li namespace test21 {
475*67e74705SXin Li   template <class T> class A {
476*67e74705SXin Li     void foo();
477*67e74705SXin Li     void bar();
478*67e74705SXin Li     class Inner; // expected-note {{implicitly declared private here}}
479*67e74705SXin Li   public:
480*67e74705SXin Li     void baz();
481*67e74705SXin Li   };
482*67e74705SXin Li   template <class T> class A<T>::Inner {};
483*67e74705SXin Li   class B {
484*67e74705SXin Li     template <class T> class A<T>::Inner; // expected-error{{non-friend class member 'Inner' cannot have a qualified name}}
485*67e74705SXin Li   };
486*67e74705SXin Li 
test()487*67e74705SXin Li   void test() {
488*67e74705SXin Li     A<int>::Inner i; // expected-error {{'Inner' is a private member}}
489*67e74705SXin Li   }
490*67e74705SXin Li }
491*67e74705SXin Li 
492*67e74705SXin Li namespace rdar8876150 {
493*67e74705SXin Li   struct A { operator bool(); };
494*67e74705SXin Li   struct B : private A { using A::operator bool; };
495*67e74705SXin Li 
f()496*67e74705SXin Li   bool f() {
497*67e74705SXin Li     B b;
498*67e74705SXin Li     return !b;
499*67e74705SXin Li   }
500*67e74705SXin Li }
501*67e74705SXin Li 
502*67e74705SXin Li namespace test23 {
503*67e74705SXin Li   template <typename T> class A {
504*67e74705SXin Li     A();
505*67e74705SXin Li     static A instance;
506*67e74705SXin Li   };
507*67e74705SXin Li 
508*67e74705SXin Li   template <typename T> A<T> A<T>::instance;
509*67e74705SXin Li   template class A<int>;
510*67e74705SXin Li }
511