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