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