blob: 09884316f9cd5186aba7e522600c70da75d61ce4 [file] [log] [blame]
John McCall3155f572010-04-09 19:03:51 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
John McCall553c0792010-01-23 00:46:32 +00002
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 {
John McCall5b0829a2010-02-10 09:31:12 +000057 class Base {
58 public: int pub; static int spub;
John McCall553c0792010-01-23 00:46:32 +000059 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
John McCall5b0829a2010-02-10 09:31:12 +000063 class Test : protected Base { // expected-note 6 {{declared protected here}} expected-note 8 {{constrained by protected inheritance here}}
John McCall553c0792010-01-23 00:46:32 +000064 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) {
John McCall5b0829a2010-02-10 09:31:12 +000082 t->pub++; // expected-error {{protected member}} expected-error {{protected base class}}
John McCall553c0792010-01-23 00:46:32 +000083 t->spub++; // expected-error {{protected member}}
John McCall5b0829a2010-02-10 09:31:12 +000084 t->prot++; // expected-error {{protected member}} expected-error {{protected base class}}
John McCall553c0792010-01-23 00:46:32 +000085 t->sprot++; // expected-error {{protected member}}
John McCall5b0829a2010-02-10 09:31:12 +000086 t->priv++; // expected-error {{private member}} expected-error {{protected base class}}
John McCall553c0792010-01-23 00:46:32 +000087 t->spriv++; // expected-error {{private member}}
88
89 // Two possible errors here: one for Base, one for the member
John McCall5b0829a2010-02-10 09:31:12 +000090 t->Base::pub++; // expected-error {{protected member}} expected-error {{protected base class}}
John McCall553c0792010-01-23 00:46:32 +000091 t->Base::spub++; // expected-error {{protected member}}
John McCall5b0829a2010-02-10 09:31:12 +000092 t->Base::prot++; // expected-error 2 {{protected member}} expected-error {{protected base class}}
John McCall553c0792010-01-23 00:46:32 +000093 t->Base::sprot++; // expected-error 2 {{protected member}}
John McCall5b0829a2010-02-10 09:31:12 +000094 t->Base::priv++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{protected base class}}
John McCall553c0792010-01-23 00:46:32 +000095 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 {
John McCall5b0829a2010-02-10 09:31:12 +0000105 class Base {
John McCall553c0792010-01-23 00:46:32 +0000106 public:
John McCall5b0829a2010-02-10 09:31:12 +0000107 int pub;
108 static int spub;
John McCall553c0792010-01-23 00:46:32 +0000109 protected:
John McCall5b0829a2010-02-10 09:31:12 +0000110 int prot; // expected-note {{declared protected here}}
111 static int sprot; // expected-note {{declared protected here}}
John McCall553c0792010-01-23 00:46:32 +0000112 private:
113 int priv; // expected-note 4 {{declared private here}}
114 static int spriv; // expected-note 4 {{declared private here}}
115 };
116
John McCall5b0829a2010-02-10 09:31:12 +0000117 class Test : private Base { // expected-note 6 {{declared private here}} \
118 // expected-note 10 {{constrained by private inheritance here}}
John McCall553c0792010-01-23 00:46:32 +0000119 void test() {
120 pub++;
121 spub++;
122 prot++;
123 sprot++;
124 priv++; // expected-error {{private member}}
125 spriv++; // expected-error {{private member}}
126
127 Base::pub++;
128 Base::spub++;
129 Base::prot++;
130 Base::sprot++;
131 Base::priv++; // expected-error {{private member}}
132 Base::spriv++; // expected-error {{private member}}
133 }
134 };
135
136 void test(Test *t) {
John McCall5b0829a2010-02-10 09:31:12 +0000137 t->pub++; // expected-error {{private member}} expected-error {{private base class}}
John McCall553c0792010-01-23 00:46:32 +0000138 t->spub++; // expected-error {{private member}}
John McCall5b0829a2010-02-10 09:31:12 +0000139 t->prot++; // expected-error {{private member}} expected-error {{private base class}}
John McCall553c0792010-01-23 00:46:32 +0000140 t->sprot++; // expected-error {{private member}}
John McCall5b0829a2010-02-10 09:31:12 +0000141 t->priv++; // expected-error {{private member}} expected-error {{private base class}}
John McCall553c0792010-01-23 00:46:32 +0000142 t->spriv++; // expected-error {{private member}}
143
John McCall5b0829a2010-02-10 09:31:12 +0000144 t->Base::pub++; // expected-error {{private member}} expected-error {{private base class}}
John McCall553c0792010-01-23 00:46:32 +0000145 t->Base::spub++; // expected-error {{private member}}
John McCall5b0829a2010-02-10 09:31:12 +0000146 t->Base::prot++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{private base class}}
John McCall553c0792010-01-23 00:46:32 +0000147 t->Base::sprot++; // expected-error {{protected member}} expected-error {{private member}}
John McCall5b0829a2010-02-10 09:31:12 +0000148 t->Base::priv++; // expected-error 2 {{private member}} expected-error {{private base class}}
John McCall553c0792010-01-23 00:46:32 +0000149 t->Base::spriv++; // expected-error 2 {{private member}}
150 }
151}