513 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3namespace test0 {4 class A {5 protected: int x; // expected-note 3 {{declared}} \6 // expected-note {{member is declared here}}7 static int sx; // expected-note 3 {{declared}} \8 // expected-note {{member is declared here}}9 };10 class B : public A {11 };12 class C : protected A {13 };14 class D : private B { // expected-note 2 {{constrained}}15 };16 17 void test(A &a) {18 (void) a.x; // expected-error {{'x' is a protected member}}19 (void) a.sx; // expected-error {{'sx' is a protected member}}20 }21 void test(B &b) {22 (void) b.x; // expected-error {{'x' is a protected member}}23 (void) b.sx; // expected-error {{'sx' is a protected member}}24 }25 void test(C &c) {26 (void) c.x; // expected-error {{'x' is a protected member}}27 (void) c.sx; // expected-error {{'sx' is a protected member}}28 }29 void test(D &d) {30 (void) d.x; // expected-error {{'x' is a private member}}31 (void) d.sx; // expected-error {{'sx' is a private member}}32 }33}34 35namespace test1 {36 class A {37 protected: int x;38 static int sx;39 static void test(A&);40 };41 class B : public A {42 static void test(B&);43 };44 class C : protected A {45 static void test(C&);46 };47 class D : private B {48 static void test(D&);49 };50 51 void A::test(A &a) {52 (void) a.x;53 (void) a.sx;54 }55 void B::test(B &b) {56 (void) b.x;57 (void) b.sx;58 }59 void C::test(C &c) {60 (void) c.x;61 (void) c.sx;62 }63 void D::test(D &d) {64 (void) d.x;65 (void) d.sx;66 }67}68 69namespace test2 {70 class A {71 protected: int x; // expected-note 3 {{can only access this member on an object of type}}72 static int sx;73 static void test(A&);74 };75 class B : public A {76 static void test(A&);77 };78 class C : protected A {79 static void test(A&);80 };81 class D : private B {82 static void test(A&);83 };84 85 void A::test(A &a) {86 (void) a.x;87 (void) a.sx;88 }89 void B::test(A &a) {90 (void) a.x; // expected-error {{'x' is a protected member}}91 (void) a.sx;92 }93 void C::test(A &a) {94 (void) a.x; // expected-error {{'x' is a protected member}}95 (void) a.sx;96 }97 void D::test(A &a) {98 (void) a.x; // expected-error {{'x' is a protected member}}99 (void) a.sx;100 }101}102 103namespace test3 {104 class B;105 class A {106 protected: int x; //expected-note {{declared protected}} // expected-note {{can only access this member on an object of type}}107 static int sx;108 static void test(B&);109 };110 class B : public A {111 static void test(B&);112 };113 class C : protected A {114 static void test(B&);115 };116 class D : private B {117 static void test(B&);118 };119 120 void A::test(B &b) {121 (void) b.x;122 (void) b.sx;123 }124 void B::test(B &b) {125 (void) b.x;126 (void) b.sx;127 }128 void C::test(B &b) {129 (void) b.x; // expected-error {{'x' is a protected member}}130 (void) b.sx;131 }132 void D::test(B &b) {133 (void) b.x; // expected-error {{'x' is a protected member}}134 (void) b.sx;135 }136}137 138namespace test4 {139 class C;140 class A {141 protected: int x; // expected-note 2{{declared protected here}} expected-note{{member is declared here}}142 static int sx; // expected-note 3{{member is declared here}}143 static void test(C&);144 };145 class B : public A {146 static void test(C&);147 };148 class C : protected A { // expected-note 4 {{constrained}}149 static void test(C&);150 };151 class D : private B {152 static void test(C&);153 };154 155 void A::test(C &c) {156 (void) c.x; // expected-error {{'x' is a protected member}}157 (void) c.sx; // expected-error {{'sx' is a protected member}}158 }159 void B::test(C &c) {160 (void) c.x; // expected-error {{'x' is a protected member}}161 (void) c.sx; // expected-error {{'sx' is a protected member}}162 }163 void C::test(C &c) {164 (void) c.x;165 (void) c.sx;166 }167 void D::test(C &c) {168 (void) c.x; // expected-error {{'x' is a protected member}}169 (void) c.sx; // expected-error {{'sx' is a protected member}}170 }171}172 173namespace test5 {174 class D;175 class A {176 protected: int x; // expected-note 3{{member is declared here}}177 static int sx; // expected-note 3{{member is declared here}}178 static void test(D&);179 };180 class B : public A {181 static void test(D&);182 };183 class C : protected A {184 static void test(D&);185 };186 class D : private B { // expected-note 6 {{constrained}}187 static void test(D&);188 };189 190 void A::test(D &d) {191 (void) d.x; // expected-error {{'x' is a private member}}192 (void) d.sx; // expected-error {{'sx' is a private member}}193 }194 void B::test(D &d) {195 (void) d.x; // expected-error {{'x' is a private member}}196 (void) d.sx; // expected-error {{'sx' is a private member}}197 }198 void C::test(D &d) {199 (void) d.x; // expected-error {{'x' is a private member}}200 (void) d.sx; // expected-error {{'sx' is a private member}}201 }202 void D::test(D &d) {203 (void) d.x;204 (void) d.sx;205 }206}207 208namespace test6 {209 class Static {};210 class A {211 protected:212 void foo(int); // expected-note 3 {{can only access this member on an object of type}}213 void foo(long);214 static void foo(Static);215 216 static void test(A&);217 };218 class B : public A {219 static void test(A&);220 };221 class C : protected A {222 static void test(A&);223 };224 class D : private B {225 static void test(A&);226 };227 228 void A::test(A &a) {229 a.foo(10);230 a.foo(Static());231 }232 void B::test(A &a) {233 a.foo(10); // expected-error {{'foo' is a protected member}}234 a.foo(Static());235 }236 void C::test(A &a) {237 a.foo(10); // expected-error {{'foo' is a protected member}}238 a.foo(Static());239 }240 void D::test(A &a) {241 a.foo(10); // expected-error {{'foo' is a protected member}}242 a.foo(Static());243 }244}245 246namespace test7 {247 class Static {};248 class A {249 protected:250 void foo(int); // expected-note 3 {{must name member using the type of the current context}}251 void foo(long);252 static void foo(Static);253 254 static void test();255 };256 class B : public A {257 static void test();258 };259 class C : protected A {260 static void test();261 };262 class D : private B {263 static void test();264 };265 266 void A::test() {267 void (A::*x)(int) = &A::foo;268 void (*sx)(Static) = &A::foo;269 }270 void B::test() {271 void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}272 void (*sx)(Static) = &A::foo;273 }274 void C::test() {275 void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}276 void (*sx)(Static) = &A::foo;277 }278 void D::test() {279 void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}280 void (*sx)(Static) = &A::foo;281 }282}283 284namespace test8 {285 class Static {};286 class A {287 protected:288 void foo(int); // expected-note 3 {{must name member using the type of the current context}}289 void foo(long);290 static void foo(Static);291 292 static void test();293 };294 class B : public A {295 static void test();296 };297 class C : protected A {298 static void test();299 };300 class D : private B {301 static void test();302 };303 void call(void (A::*)(int));304 void calls(void (*)(Static));305 306 void A::test() {307 call(&A::foo);308 calls(&A::foo);309 }310 void B::test() {311 call(&A::foo); // expected-error {{'foo' is a protected member}}312 calls(&A::foo);313 }314 void C::test() {315 call(&A::foo); // expected-error {{'foo' is a protected member}}316 calls(&A::foo);317 }318 void D::test() {319 call(&A::foo); // expected-error {{'foo' is a protected member}}320 calls(&A::foo);321 }322}323 324namespace test9 {325 class A { // expected-note {{member is declared here}}326 protected: int foo(); // expected-note 4 {{declared}} expected-note 3 {{can only access this member on an object of type}} expected-note 2 {{member is declared here}}327 };328 329 class B : public A { // expected-note {{member is declared here}}330 friend class D;331 };332 333 class C : protected B { // expected-note {{declared}} \334 // expected-note 7 {{constrained}}335 };336 337 class D : public A {338 static void test(A &a) {339 a.foo(); // expected-error {{'foo' is a protected member}}340 a.A::foo(); // expected-error {{'foo' is a protected member}}341 a.B::foo(); // expected-error {{'foo' is a protected member}}342 a.C::foo(); // expected-error {{'foo' is a protected member}}343 a.D::foo(); // expected-error {{'foo' is a protected member}}344 }345 346 static void test(B &b) {347 b.foo();348 b.A::foo();349 b.B::foo(); // accessible as named in A350 b.C::foo(); // expected-error {{'foo' is a protected member}}351 }352 353 static void test(C &c) {354 c.foo(); // expected-error {{'foo' is a protected member}}355 c.A::foo(); // expected-error {{'A' is a protected member}} \356 // expected-error {{cannot cast}}357 c.B::foo(); // expected-error {{'B' is a protected member}} \358 // expected-error {{cannot cast}}359 c.C::foo(); // expected-error {{'foo' is a protected member}}360 }361 362 static void test(D &d) {363 d.foo();364 d.A::foo();365 d.B::foo();366 d.C::foo(); // expected-error {{'foo' is a protected member}}367 }368 };369}370 371namespace test10 {372 template<typename T> class A {373 protected:374 int foo();375 int foo() const;376 377 ~A() { foo(); }378 };379 380 template class A<int>;381}382 383// class.protected friendship384namespace test11 {385 class A {386 protected:387 int foo();388 };389 390 class B : public A {391 friend class C;392 };393 394 class C {395 void test() {396 B b;397 b.A::foo();398 }399 };400}401 402// This friendship is considered because a public member of A would be403// a private member of C.404namespace test12 {405 class A { protected: int foo(); };406 class B : public virtual A {};407 class C : private B { friend void test(); };408 class D : private C, public virtual A {};409 410 void test() {411 D d;412 d.A::foo();413 }414}415 416// This friendship is not considered because a public member of A is417// inaccessible in C.418namespace test13 {419 class A { protected: int foo(); }; // expected-note {{declared protected here}}420 class B : private virtual A {};421 class C : private B { friend void test(); };422 class D : public virtual A {};423 424 void test() {425 D d;426 d.A::foo(); // expected-error {{protected member}}427 }428}429 430// PR8058431namespace test14 {432 class A {433 protected:434 template <class T> void temp(T t); // expected-note {{must name member using the type of the current context}}435 436 void nontemp(int); // expected-note {{must name member using the type of the current context}}437 438 template <class T> void ovl_temp(T t); // expected-note {{must name member using the type of the current context}}439 void ovl_temp(float);440 441 void ovl_nontemp(int); // expected-note {{must name member using the type of the current context}}442 void ovl_nontemp(float);443 444 template <class T> void ovl_withtemp(T);445 void ovl_withtemp(int); // expected-note {{must name member using the type of the current context}}446 };447 448 class B : public A {449 void use() {450 void (A::*ptr)(int);451 ptr = &A::temp; // expected-error {{protected member}}452 ptr = &A::nontemp; // expected-error {{protected member}}453 ptr = &A::ovl_temp; // expected-error {{protected member}}454 ptr = &A::ovl_nontemp; // expected-error {{protected member}}455 ptr = &A::ovl_withtemp; // expected-error {{protected member}}456 }457 };458}459 460namespace test15 {461 class A {462 protected:463 A(); // expected-note 2 {{protected constructor can only be used to construct a base class subobject}}464 A(const A &); // expected-note {{protected constructor can only be used to construct a base class subobject}}465 ~A(); // expected-note 3 {{protected destructor can only be used to destroy a base class subobject}}466 };467 468 class B : public A {469 // The uses here are fine.470 B() {}471 B(int i) : A() {}472 ~B() {}473 474 // All these uses are bad.475 476 void test0() {477 A a; // expected-error {{protected constructor}} expected-error {{protected destructor}}478 }479 480 A *test1() {481 return new A(); // expected-error {{protected constructor}}482 }483 484 void test2(A *a) {485 delete a; // expected-error {{protected destructor}}486 }487 488 A test3(A *a) {489 return *a; // expected-error {{protected constructor}}490 }491 492 void test4(A *a) {493 a->~A(); // expected-error {{protected member}}494 }495 };496}497 498namespace test16 {499 class A {500 protected:501 ~A();502 };503 504 class B : public virtual A {505 public:506 ~B() {}507 };508 509 class C : public B {510 ~C() {}511 };512}513