xref: /aosp_15_r20/external/clang/test/CXX/class.access/class.access.base/p1.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li // C++0x [class.access.base]p1(a):
4*67e74705SXin Li //   If a class is declared to be a base class for another class using
5*67e74705SXin Li //   the public access specifier, the public members of the base class
6*67e74705SXin Li //   are accessible as public members of the derived class and protected
7*67e74705SXin Li //   members of the base class are accessible as protected members of
8*67e74705SXin Li //   the derived class.
9*67e74705SXin Li namespace test0 {
10*67e74705SXin Li   class Base {
11*67e74705SXin Li   public: int pub; static int spub;
12*67e74705SXin Li   protected: int prot; static int sprot; // expected-note 4 {{declared protected here}}
13*67e74705SXin Li   private: int priv; static int spriv; // expected-note 8 {{declared private here}}
14*67e74705SXin Li   };
15*67e74705SXin Li 
16*67e74705SXin Li   class Test : public Base {
test()17*67e74705SXin Li     void test() {
18*67e74705SXin Li       pub++;
19*67e74705SXin Li       spub++;
20*67e74705SXin Li       prot++;
21*67e74705SXin Li       sprot++;
22*67e74705SXin Li       priv++; // expected-error {{private member}}
23*67e74705SXin Li       spriv++; // expected-error {{private member}}
24*67e74705SXin Li 
25*67e74705SXin Li       Base::pub++;
26*67e74705SXin Li       Base::spub++;
27*67e74705SXin Li       Base::prot++;
28*67e74705SXin Li       Base::sprot++;
29*67e74705SXin Li       Base::priv++; // expected-error {{private member}}
30*67e74705SXin Li       Base::spriv++; // expected-error {{private member}}
31*67e74705SXin Li     }
32*67e74705SXin Li   };
33*67e74705SXin Li 
test(Test * t)34*67e74705SXin Li   void test(Test *t) {
35*67e74705SXin Li     t->pub++;
36*67e74705SXin Li     t->spub++;
37*67e74705SXin Li     t->prot++; // expected-error {{protected member}}
38*67e74705SXin Li     t->sprot++; // expected-error {{protected member}}
39*67e74705SXin Li     t->priv++; // expected-error {{private member}}
40*67e74705SXin Li     t->spriv++; // expected-error {{private member}}
41*67e74705SXin Li 
42*67e74705SXin Li     t->Base::pub++;
43*67e74705SXin Li     t->Base::spub++;
44*67e74705SXin Li     t->Base::prot++; // expected-error {{protected member}}
45*67e74705SXin Li     t->Base::sprot++; // expected-error {{protected member}}
46*67e74705SXin Li     t->Base::priv++; // expected-error {{private member}}
47*67e74705SXin Li     t->Base::spriv++; // expected-error {{private member}}
48*67e74705SXin Li   }
49*67e74705SXin Li }
50*67e74705SXin Li 
51*67e74705SXin Li // C++0x [class.access.base]p1(b):
52*67e74705SXin Li //   If a class is declared to be a base class for another class using
53*67e74705SXin Li //   the protected access specifier, the public and protected members
54*67e74705SXin Li //   of the base class are accessible as protected members of the
55*67e74705SXin Li //   derived class.
56*67e74705SXin Li namespace test1 {
57*67e74705SXin Li   class Base { // expected-note 6{{member is declared here}}
58*67e74705SXin Li   public:
59*67e74705SXin Li     int pub; // expected-note{{member is declared here}}
60*67e74705SXin Li     static int spub; // expected-note{{member is declared here}}
61*67e74705SXin Li   protected: int prot; static int sprot; // expected-note 4 {{declared protected here}}
62*67e74705SXin Li   private: int priv; static int spriv; // expected-note 8 {{declared private here}}
63*67e74705SXin Li   };
64*67e74705SXin Li 
65*67e74705SXin Li   class Test : protected Base { // expected-note 6 {{declared protected here}} expected-note 8 {{constrained by protected inheritance here}}
test()66*67e74705SXin Li     void test() {
67*67e74705SXin Li       pub++;
68*67e74705SXin Li       spub++;
69*67e74705SXin Li       prot++;
70*67e74705SXin Li       sprot++;
71*67e74705SXin Li       priv++; // expected-error {{private member}}
72*67e74705SXin Li       spriv++; // expected-error {{private member}}
73*67e74705SXin Li 
74*67e74705SXin Li       Base::pub++;
75*67e74705SXin Li       Base::spub++;
76*67e74705SXin Li       Base::prot++;
77*67e74705SXin Li       Base::sprot++;
78*67e74705SXin Li       Base::priv++; // expected-error {{private member}}
79*67e74705SXin Li       Base::spriv++; // expected-error {{private member}}
80*67e74705SXin Li     }
81*67e74705SXin Li   };
82*67e74705SXin Li 
test(Test * t)83*67e74705SXin Li   void test(Test *t) {
84*67e74705SXin Li     t->pub++; // expected-error {{protected member}} expected-error {{protected base class}}
85*67e74705SXin Li     t->spub++; // expected-error {{protected member}}
86*67e74705SXin Li     t->prot++; // expected-error {{protected member}} expected-error {{protected base class}}
87*67e74705SXin Li     t->sprot++; // expected-error {{protected member}}
88*67e74705SXin Li     t->priv++; // expected-error {{private member}} expected-error {{protected base class}}
89*67e74705SXin Li     t->spriv++; // expected-error {{private member}}
90*67e74705SXin Li 
91*67e74705SXin Li     // Two possible errors here: one for Base, one for the member
92*67e74705SXin Li     t->Base::pub++; // expected-error {{protected member}} expected-error {{protected base class}}
93*67e74705SXin Li     t->Base::spub++; // expected-error {{protected member}}
94*67e74705SXin Li     t->Base::prot++; // expected-error 2 {{protected member}} expected-error {{protected base class}}
95*67e74705SXin Li     t->Base::sprot++; // expected-error 2 {{protected member}}
96*67e74705SXin Li     t->Base::priv++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{protected base class}}
97*67e74705SXin Li     t->Base::spriv++; // expected-error {{protected member}} expected-error {{private member}}
98*67e74705SXin Li   }
99*67e74705SXin Li }
100*67e74705SXin Li 
101*67e74705SXin Li // C++0x [class.access.base]p1(b):
102*67e74705SXin Li //   If a class is declared to be a base class for another class using
103*67e74705SXin Li //   the private access specifier, the public and protected members of
104*67e74705SXin Li //   the base class are accessible as private members of the derived
105*67e74705SXin Li //   class.
106*67e74705SXin Li namespace test2 {
107*67e74705SXin Li   class Base { // expected-note 6{{member is declared here}}
108*67e74705SXin Li   public:
109*67e74705SXin Li     int pub; // expected-note{{member is declared here}}
110*67e74705SXin Li     static int spub; // expected-note{{member is declared here}}
111*67e74705SXin Li   protected:
112*67e74705SXin Li     int prot; // expected-note {{declared protected here}} \
113*67e74705SXin Li     // expected-note{{member is declared here}}
114*67e74705SXin Li     static int sprot; // expected-note {{declared protected here}} \
115*67e74705SXin Li     // expected-note{{member is declared here}}
116*67e74705SXin Li   private:
117*67e74705SXin Li     int priv; // expected-note 4 {{declared private here}}
118*67e74705SXin Li     static int spriv; // expected-note 4 {{declared private here}}
119*67e74705SXin Li   };
120*67e74705SXin Li 
121*67e74705SXin Li   class Test : private Base { // expected-note 6 {{declared private here}} \
122*67e74705SXin Li                               // expected-note 10 {{constrained by private inheritance here}}
test()123*67e74705SXin Li     void test() {
124*67e74705SXin Li       pub++;
125*67e74705SXin Li       spub++;
126*67e74705SXin Li       prot++;
127*67e74705SXin Li       sprot++;
128*67e74705SXin Li       priv++; // expected-error {{private member}}
129*67e74705SXin Li       spriv++; // expected-error {{private member}}
130*67e74705SXin Li 
131*67e74705SXin Li       Base::pub++;
132*67e74705SXin Li       Base::spub++;
133*67e74705SXin Li       Base::prot++;
134*67e74705SXin Li       Base::sprot++;
135*67e74705SXin Li       Base::priv++; // expected-error {{private member}}
136*67e74705SXin Li       Base::spriv++; // expected-error {{private member}}
137*67e74705SXin Li     }
138*67e74705SXin Li   };
139*67e74705SXin Li 
test(Test * t)140*67e74705SXin Li   void test(Test *t) {
141*67e74705SXin Li     t->pub++; // expected-error {{private member}} expected-error {{private base class}}
142*67e74705SXin Li     t->spub++; // expected-error {{private member}}
143*67e74705SXin Li     t->prot++; // expected-error {{private member}} expected-error {{private base class}}
144*67e74705SXin Li     t->sprot++; // expected-error {{private member}}
145*67e74705SXin Li     t->priv++; // expected-error {{private member}} expected-error {{private base class}}
146*67e74705SXin Li     t->spriv++; // expected-error {{private member}}
147*67e74705SXin Li 
148*67e74705SXin Li     t->Base::pub++; // expected-error {{private member}} expected-error {{private base class}}
149*67e74705SXin Li     t->Base::spub++; // expected-error {{private member}}
150*67e74705SXin Li     t->Base::prot++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{private base class}}
151*67e74705SXin Li     t->Base::sprot++; // expected-error {{protected member}} expected-error {{private member}}
152*67e74705SXin Li     t->Base::priv++; // expected-error 2 {{private member}} expected-error {{private base class}}
153*67e74705SXin Li     t->Base::spriv++; // expected-error 2 {{private member}}
154*67e74705SXin Li   }
155*67e74705SXin Li }
156*67e74705SXin Li 
157*67e74705SXin Li namespace PR12788 {
158*67e74705SXin Li   class A {
159*67e74705SXin Li   protected:
160*67e74705SXin Li     struct {
161*67e74705SXin Li       int x;
162*67e74705SXin Li     };
163*67e74705SXin Li   };
164*67e74705SXin Li   class B : A {
f()165*67e74705SXin Li     void f() {
166*67e74705SXin Li       ++x;
167*67e74705SXin Li       A::x++;
168*67e74705SXin Li     }
169*67e74705SXin Li   };
170*67e74705SXin Li }
171