xref: /aosp_15_r20/external/clang/test/SemaCXX/access-base-class.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li namespace T1 {
3*67e74705SXin Li 
4*67e74705SXin Li class A { };
5*67e74705SXin Li class B : private A { }; // expected-note {{declared private here}}
6*67e74705SXin Li 
f(B * b)7*67e74705SXin Li void f(B* b) {
8*67e74705SXin Li   A *a = b; // expected-error{{cannot cast 'T1::B' to its private base class 'T1::A'}}
9*67e74705SXin Li }
10*67e74705SXin Li 
11*67e74705SXin Li }
12*67e74705SXin Li 
13*67e74705SXin Li namespace T2 {
14*67e74705SXin Li 
15*67e74705SXin Li class A { };
16*67e74705SXin Li class B : A { }; // expected-note {{implicitly declared private here}}
17*67e74705SXin Li 
f(B * b)18*67e74705SXin Li void f(B* b) {
19*67e74705SXin Li   A *a = b; // expected-error {{cannot cast 'T2::B' to its private base class 'T2::A'}}
20*67e74705SXin Li }
21*67e74705SXin Li 
22*67e74705SXin Li }
23*67e74705SXin Li 
24*67e74705SXin Li namespace T3 {
25*67e74705SXin Li 
26*67e74705SXin Li class A { };
27*67e74705SXin Li class B : public A { };
28*67e74705SXin Li 
f(B * b)29*67e74705SXin Li void f(B* b) {
30*67e74705SXin Li   A *a = b;
31*67e74705SXin Li }
32*67e74705SXin Li 
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li namespace T4 {
36*67e74705SXin Li 
37*67e74705SXin Li class A {};
38*67e74705SXin Li 
39*67e74705SXin Li class B : private virtual A {};
40*67e74705SXin Li class C : public virtual A {};
41*67e74705SXin Li 
42*67e74705SXin Li class D : public B, public C {};
43*67e74705SXin Li 
f(D * d)44*67e74705SXin Li void f(D *d) {
45*67e74705SXin Li   // This takes the D->C->B->A path.
46*67e74705SXin Li   A *a = d;
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li }
50*67e74705SXin Li 
51*67e74705SXin Li namespace T5 {
52*67e74705SXin Li   class A {};
53*67e74705SXin Li 
54*67e74705SXin Li   class B : private A {
f(B * b)55*67e74705SXin Li     void f(B *b) {
56*67e74705SXin Li       A *a = b;
57*67e74705SXin Li     }
58*67e74705SXin Li   };
59*67e74705SXin Li }
60*67e74705SXin Li 
61*67e74705SXin Li namespace T6 {
62*67e74705SXin Li   class C;
63*67e74705SXin Li 
64*67e74705SXin Li   class A {}; // expected-note{{member is declared here}}
65*67e74705SXin Li 
66*67e74705SXin Li   class B : private A { // expected-note {{declared private here}} expected-note {{constrained by private inheritance here}}
67*67e74705SXin Li     void f(C* c);
68*67e74705SXin Li   };
69*67e74705SXin Li 
70*67e74705SXin Li   class C : public B {
f(C * c)71*67e74705SXin Li     void f(C *c) {
72*67e74705SXin Li       A* a = c; // expected-error {{cannot cast 'T6::C' to its private base class 'T6::A'}} \
73*67e74705SXin Li                 // expected-error {{'A' is a private member of 'T6::A'}}
74*67e74705SXin Li     }
75*67e74705SXin Li   };
76*67e74705SXin Li 
f(C * c)77*67e74705SXin Li   void B::f(C *c) {
78*67e74705SXin Li     A *a = c;
79*67e74705SXin Li   }
80*67e74705SXin Li }
81*67e74705SXin Li 
82*67e74705SXin Li namespace T7 {
83*67e74705SXin Li   class A {};
84*67e74705SXin Li   class B : public A {};
85*67e74705SXin Li   class C : private B {
f(C * c)86*67e74705SXin Li     void f(C *c) {
87*67e74705SXin Li       A* a = c; // okay
88*67e74705SXin Li     }
89*67e74705SXin Li   };
90*67e74705SXin Li }
91*67e74705SXin Li 
92