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 {{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}}
229 #elif __cplusplus >= 201103L && defined(_MSC_VER)
230   template <unsigned N> class Base { ~Base(); }; // expected-note 6{{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 :
253     Base<0>, // expected-note {{deleted because base class 'Base<0>' has an inaccessible destructor}}
254     virtual Base<1>,
255     Base2,
256     virtual Base3
257   {};
258   Derived3 d3; // expected-error {{implicitly-deleted default constructor}}
259 #else
260 #error "missing case of MSVC cross C++ versions"
261 #endif
262 }
263 
264 // Conversion functions.
265 namespace test4 {
266   class Base {
267   private:
268     operator Private(); // expected-note 4 {{declared private here}}
269   public:
270     operator Public(); // expected-note 2{{member is declared here}}
271   };
272 
273   class Derived1 : private Base { // expected-note 2 {{declared private here}} \
274                                   // expected-note {{constrained by private inheritance}}
275     Private test1() { return *this; } // expected-error {{'operator Private' is a private member}}
276     Public test2() { return *this; }
277   };
278   Private test1(Derived1 &d) { return d; } // expected-error {{'operator Private' is a private member}} \
279                                            // expected-error {{cannot cast 'test4::Derived1' to its private base class}}
280   Public test2(Derived1 &d) { return d; } // expected-error {{cannot cast 'test4::Derived1' to its private base class}} \
281                                           // expected-error {{'operator Public' is a private member}}
282 
283 
284   class Derived2 : public Base {
285     Private test1() { return *this; } // expected-error {{'operator Private' is a private member}}
286     Public test2() { return *this; }
287   };
288   Private test1(Derived2 &d) { return d; } // expected-error {{'operator Private' is a private member}}
289   Public test2(Derived2 &d) { return d; }
290 
291   class Derived3 : private Base { // expected-note {{constrained by private inheritance here}} \
292                                   // expected-note {{declared private here}}
293   public:
294     operator Private();
295   };
296   Private test1(Derived3 &d) { return d; }
297   Public test2(Derived3 &d) { return d; } // expected-error {{'operator Public' is a private member of 'test4::Base'}} \
298                                           // expected-error {{cannot cast 'test4::Derived3' to its private base class}}
299 
300   class Derived4 : public Base {
301   public:
302     operator Private();
303   };
304   Private test1(Derived4 &d) { return d; }
305   Public test2(Derived4 &d) { return d; }
306 }
307 
308 // Implicit copy assignment operator uses.
309 namespace test5 {
310   class A {
311     void operator=(const A &);
312 #if __cplusplus < 201103L
313     // expected-note@-2 2{{implicitly declared private here}}
314 #endif
315   };
316 
317 #if __cplusplus < 201103L
318   class Test1 { A a; }; // expected-error {{private member}}
319   void test1() {
320     Test1 a;
321     a = Test1(); // expected-note{{implicit copy}}
322   }
323 
324   class Test2 : A {}; // expected-error {{private member}}
325   void test2() {
326     Test2 a;
327     a = Test2(); // expected-note{{implicit copy}}
328   }
329 #else
330   class Test1 { A a; }; // expected-note {{because field 'a' has an inaccessible copy assignment operator}}
331   void test1() {
332     Test1 a;
333     a = Test1(); // expected-error {{copy assignment operator is implicitly deleted}}
334   }
335 
336   class Test2 : A {}; // expected-note {{because base class 'test5::A' has an inaccessible copy assignment operator}}
337   void test2() {
338     Test2 a;
339     a = Test2(); // expected-error {{copy assignment operator is implicitly deleted}}
340   }
341 #endif
342 }
343 
344 // Implicit copy constructor uses.
345 namespace test6 {
346   class A {
347     public: A();
348     private: A(const A &);
349 #if __cplusplus < 201103L
350     // expected-note@-2 2{{declared private here}}
351 #endif
352   };
353 
354 #if __cplusplus < 201103L
355   class Test1 { A a; }; // expected-error {{field of type 'test6::A' has private copy constructor}}
356   void test1(const Test1 &t) {
357     Test1 a = t; // expected-note{{implicit copy}}
358   }
359 
360   class Test2 : A {}; // expected-error {{base class 'test6::A' has private copy constructor}}
361   void test2(const Test2 &t) {
362     Test2 a = t; // expected-note{{implicit copy}}
363   }
364 #else
365   class Test1 { A a; }; // expected-note {{field 'a' has an inaccessible copy constructor}}
366   void test1(const Test1 &t) {
367     Test1 a = t; // expected-error{{implicitly-deleted}}
368   }
369 
370   class Test2 : A {}; // expected-note {{base class 'test6::A' has an inaccessible copy constructor}}
371   void test2(const Test2 &t) {
372     Test2 a = t; // expected-error{{implicitly-deleted}}
373   }
374 #endif
375 }
376 
377 // Redeclaration lookups are not accesses.
378 namespace test7 {
379   class A {
380     int private_member;
381   };
382   class B : A {
383     int foo(int private_member) {
384       return 0;
385     }
386   };
387 }
388 
389 // Ignored operator new and delete overloads are not
390 namespace test8 {
391   typedef __typeof__(sizeof(int)) size_t;
392 
393   class A {
394     void *operator new(size_t s);
395     void operator delete(void *p);
396   public:
397     void *operator new(size_t s, int n);
398     void operator delete(void *p, int n);
399   };
400 
401   void test() {
402     new (2) A();
403   }
404 }
405 
406 // Don't silently upgrade forbidden-access paths to private.
407 namespace test9 {
408   class A {
409   public: static int x; // expected-note {{member is declared here}}
410   };
411   class B : private A { // expected-note {{constrained by private inheritance here}}
412   };
413   class C : public B {
414     static int getX() { return x; } // expected-error {{'x' is a private member of 'test9::A'}}
415   };
416 }
417 
418 namespace test10 {
419   class A {
420     enum {
421       value = 10 // expected-note {{declared private here}}
422     };
423     friend class C;
424   };
425 
426   class B {
427     enum {
428       value = A::value // expected-error {{'value' is a private member of 'test10::A'}}
429     };
430   };
431 
432   class C {
433     enum {
434       value = A::value
435     };
436   };
437 }
438 
439 namespace test11 {
440   class A {
441     protected: virtual ~A();
442   };
443 
444   class B : public A {
445     ~B();
446   };
447 
448   B::~B() {};
449 }
450 
451 namespace test12 {
452   class A {
453     int x;
454 
455     void foo() {
456       class Local {
457         int foo(A *a) {
458           return a->x;
459         }
460       };
461     }
462   };
463 }
464 
465 namespace test13 {
466   struct A {
467     int x;
468     unsigned foo() const;
469   };
470 
471   struct B : protected A {
472     using A::foo;
473     using A::x;
474   };
475 
476   void test() {
477     A *d;
478     d->foo();
479     (void) d->x;
480   }
481 }
482 
483 // Destructors for temporaries.
484 namespace test14 {
485   class A {
486   private: ~A(); // expected-note {{declared private here}}
487   };
488   A foo();
489 
490   void test() {
491     foo(); // expected-error {{temporary of type 'test14::A' has private destructor}}
492   }
493 
494   class X {
495     ~X(); // expected-note {{declared private here}}
496   };
497 
498   struct Y1 {
499     operator X();
500   };
501 
502   void g() {
503     const X &xr = Y1(); // expected-error{{temporary of type 'test14::X' has private destructor}}
504   }
505 }
506 
507 // PR 7024
508 namespace test15 {
509   template <class T> class A {
510   private:
511     int private_foo; // expected-note {{declared private here}}
512     static int private_sfoo; // expected-note {{declared private here}}
513   protected:
514     int protected_foo; // expected-note 3 {{declared protected here}} // expected-note {{can only access this member on an object of type 'test15::B<int>'}}
515     static int protected_sfoo; // expected-note 3 {{declared protected here}}
516 
517     int test1(A<int> &a) {
518       return a.private_foo; // expected-error {{private member}}
519     }
520 
521     int test2(A<int> &a) {
522       return a.private_sfoo; // expected-error {{private member}}
523     }
524 
525     int test3(A<int> &a) {
526       return a.protected_foo; // expected-error {{protected member}}
527     }
528 
529     int test4(A<int> &a) {
530       return a.protected_sfoo; // expected-error {{protected member}}
531     }
532   };
533 
534   template class A<int>;
535   template class A<long>; // expected-note 4 {{in instantiation}}
536 
537   template <class T> class B : public A<T> {
538     // TODO: These first two accesses can be detected as ill-formed at
539     // definition time because they're member accesses and A<int> can't
540     // be a subclass of B<T> for any T.
541 
542     int test1(A<int> &a) {
543       return a.protected_foo; // expected-error 2 {{protected member}}
544     }
545 
546     int test2(A<int> &a) {
547       return a.protected_sfoo; // expected-error {{protected member}}
548     }
549 
550     int test3(B<int> &b) {
551       return b.protected_foo; // expected-error {{protected member}}
552     }
553 
554     int test4(B<int> &b) {
555       return b.protected_sfoo; // expected-error {{protected member}}
556     }
557   };
558 
559   template class B<int>;  // expected-note {{in instantiation}}
560   template class B<long>; // expected-note 4 {{in instantiation}}
561 }
562 
563 // PR7281
564 namespace test16 {
565   class A { ~A(); }; // expected-note 2{{declared private here}}
566   void b() { throw A(); } // expected-error{{temporary of type 'test16::A' has private destructor}} \
567   // expected-error{{exception object of type 'test16::A' has private destructor}}
568 }
569 
570 // rdar://problem/8146294
571 namespace test17 {
572   class A {
573     template <typename T> class Inner { }; // expected-note {{declared private here}}
574   };
575 
576   A::Inner<int> s; // expected-error {{'Inner' is a private member of 'test17::A'}}
577 }
578 
579 namespace test18 {
580   template <class T> class A {}; // expected-note {{member is declared here}}
581   class B : A<int> { // expected-note {{constrained by implicitly private inheritance here}}
582     A<int> member;
583   };
584   class C : B {
585     A<int> member; // expected-error {{'A' is a private member of 'test18::A<int>'}}
586   };
587 }
588 
589 // PR8325
590 namespace test19 {
591   class A { ~A(); };
592   // The destructor is not implicitly referenced here.  Contrast to test16,
593   // testing PR7281, earlier in this file.
594   void b(A* x) { throw x; }
595 }
596 
597 // PR7930
598 namespace test20 {
599   class Foo {
600     Foo(); // expected-note {{implicitly declared private here}}
601   };
602   Foo::Foo() {}
603 
604   void test() {
605     Foo a; // expected-error {{calling a private constructor}}
606   }
607 }
608 
609 namespace test21 {
610   template <class T> class A {
611     void foo();
612     void bar();
613     class Inner; // expected-note {{implicitly declared private here}}
614   public:
615     void baz();
616   };
617   template <class T> class A<T>::Inner {};
618   class B {
619     template <class T> class A<T>::Inner; // expected-error{{non-friend class member 'Inner' cannot have a qualified name}}
620   };
621 
622   void test() {
623     A<int>::Inner i; // expected-error {{'Inner' is a private member}}
624   }
625 }
626 
627 namespace rdar8876150 {
628   struct A { operator bool(); };
629   struct B : private A { using A::operator bool; };
630 
631   bool f() {
632     B b;
633     return !b;
634   }
635 }
636 
637 namespace test23 {
638   template <typename T> class A {
639     A();
640     static A instance;
641   };
642 
643   template <typename T> A<T> A<T>::instance;
644   template class A<int>;
645 }
646