blob: fd0d9f68e1e2d0b928391d222b4423c7e144e001 [file] [log] [blame]
John McCall553c0792010-01-23 00:46:32 +00001// RUN: %clang_cc1 -fsyntax-only -faccess-control -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.
9namespace 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.
56namespace test1 {
57 class Base { // expected-note 6 {{constrained by protected inheritance}}
58 public: int pub; static int spub; // expected-note 2 {{constrained by protected inheritance}}
59 protected: int prot; static int sprot; // expected-note 4 {{declared protected here}}
60 private: int priv; static int spriv; // expected-note 8 {{declared private here}}
61 };
62
63 class Test : protected Base {
64 void test() {
65 pub++;
66 spub++;
67 prot++;
68 sprot++;
69 priv++; // expected-error {{private member}}
70 spriv++; // expected-error {{private member}}
71
72 Base::pub++;
73 Base::spub++;
74 Base::prot++;
75 Base::sprot++;
76 Base::priv++; // expected-error {{private member}}
77 Base::spriv++; // expected-error {{private member}}
78 }
79 };
80
81 void test(Test *t) {
82 t->pub++; // expected-error {{protected member}}
83 t->spub++; // expected-error {{protected member}}
84 t->prot++; // expected-error {{protected member}}
85 t->sprot++; // expected-error {{protected member}}
86 t->priv++; // expected-error {{private member}}
87 t->spriv++; // expected-error {{private member}}
88
89 // Two possible errors here: one for Base, one for the member
90 t->Base::pub++; // expected-error {{protected member}}
91 t->Base::spub++; // expected-error {{protected member}}
92 t->Base::prot++; // expected-error 2 {{protected member}}
93 t->Base::sprot++; // expected-error 2 {{protected member}}
94 t->Base::priv++; // expected-error {{protected member}} expected-error {{private member}}
95 t->Base::spriv++; // expected-error {{protected member}} expected-error {{private member}}
96 }
97}
98
99// C++0x [class.access.base]p1(b):
100// If a class is declared to be a base class for another class using
101// the private access specifier, the public and protected members of
102// the base class are accessible as private members of the derived
103// class.
104namespace test2 {
105 class Base { //expected-note 6 {{constrained by private inheritance}}
106 public:
107 int pub; // expected-note {{constrained by private inheritance}}
108 static int spub; // expected-note {{constrained by private inheritance}}
109 protected:
110 int prot; // expected-note {{constrained by private inheritance}} \
111 // expected-note {{declared protected here}}
112 static int sprot; // expected-note {{constrained by private inheritance}} \
113 // expected-note {{declared protected here}}
114 private:
115 int priv; // expected-note 4 {{declared private here}}
116 static int spriv; // expected-note 4 {{declared private here}}
117 };
118
119 class Test : private Base { // expected-note 6 {{'private' inheritance specifier here}}
120 void test() {
121 pub++;
122 spub++;
123 prot++;
124 sprot++;
125 priv++; // expected-error {{private member}}
126 spriv++; // expected-error {{private member}}
127
128 Base::pub++;
129 Base::spub++;
130 Base::prot++;
131 Base::sprot++;
132 Base::priv++; // expected-error {{private member}}
133 Base::spriv++; // expected-error {{private member}}
134 }
135 };
136
137 void test(Test *t) {
138 t->pub++; // expected-error {{private member}} expected-error {{inaccessible base class}}
139 t->spub++; // expected-error {{private member}}
140 t->prot++; // expected-error {{private member}} expected-error {{inaccessible base class}}
141 t->sprot++; // expected-error {{private member}}
142 t->priv++; // expected-error {{private member}} expected-error {{inaccessible base class}}
143 t->spriv++; // expected-error {{private member}}
144
145 t->Base::pub++; // expected-error {{private member}} expected-error {{inaccessible base class}}
146 t->Base::spub++; // expected-error {{private member}}
147 t->Base::prot++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{inaccessible base class}}
148 t->Base::sprot++; // expected-error {{protected member}} expected-error {{private member}}
149 t->Base::priv++; // expected-error 2 {{private member}} expected-error {{inaccessible base class}}
150 t->Base::spriv++; // expected-error 2 {{private member}}
151 }
152}