1 // RUN: %clang_cc1 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++98 %s 2 // RUN: %clang_cc1 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s 3 // RUN: %clang_cc1 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -fsyntax-only -verify %s 4 // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-compatibility-version=19 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++98 %s 5 // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-compatibility-version=19 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s 6 // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-compatibility-version=19 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s 7 8 // C++0x [class.access]p4: 9 10 // Access control is applied uniformly to all names, whether the 11 // names are referred to from declarations or expressions. In the 12 // case of overloaded function names, access control is applied to 13 // the function selected by overload resolution. 14 15 class Public {} PublicInst; 16 class Protected {} ProtectedInst; 17 class Private {} PrivateInst; 18 19 namespace test0 { 20 class A { 21 public: 22 void foo(Public&); 23 protected: 24 void foo(Protected&); // expected-note 2 {{declared protected here}} 25 private: 26 void foo(Private&); // expected-note 2 {{declared private here}} 27 }; 28 29 void test(A *op) { 30 op->foo(PublicInst); 31 op->foo(ProtectedInst); // expected-error {{'foo' is a protected member}} 32 op->foo(PrivateInst); // expected-error {{'foo' is a private member}} 33 34 void (A::*a)(Public&) = &A::foo; 35 void (A::*b)(Protected&) = &A::foo; // expected-error {{'foo' is a protected member}} 36 void (A::*c)(Private&) = &A::foo; // expected-error {{'foo' is a private member}} 37 } 38 } 39 40 // Member operators. 41 namespace test1 { 42 class A { 43 public: 44 void operator+(Public&); 45 void operator[](Public&); 46 void operator()(Public&); 47 typedef void (*PublicSurrogate)(Public&); 48 operator PublicSurrogate() const; 49 protected: 50 void operator+(Protected&); // expected-note {{declared protected here}} 51 void operator[](Protected&); // expected-note {{declared protected here}} 52 void operator()(Protected&); // expected-note {{declared protected here}} 53 typedef void (*ProtectedSurrogate)(Protected&); 54 operator ProtectedSurrogate() const; // expected-note {{declared protected here}} 55 private: 56 void operator+(Private&); // expected-note {{declared private here}} 57 void operator[](Private&); // expected-note {{declared private here}} 58 void operator()(Private&); // expected-note {{declared private here}} 59 void operator-(); // expected-note {{declared private here}} 60 typedef void (*PrivateSurrogate)(Private&); 61 operator PrivateSurrogate() const; // expected-note {{declared private here}} 62 }; 63 void operator+(const A &, Public&); 64 void operator+(const A &, Protected&); 65 void operator+(const A &, Private&); 66 void operator-(const A &); 67 68 void test(A &a, Public &pub, Protected &prot, Private &priv) { 69 a + pub; 70 a + prot; // expected-error {{'operator+' is a protected member}} 71 a + priv; // expected-error {{'operator+' is a private member}} 72 a[pub]; 73 a[prot]; // expected-error {{'operator[]' is a protected member}} 74 a[priv]; // expected-error {{'operator[]' is a private member}} 75 a(pub); 76 a(prot); // expected-error {{'operator()' is a protected member}} 77 a(priv); // expected-error {{'operator()' is a private member}} 78 -a; // expected-error {{'operator-' is a private member}} 79 80 const A &ca = a; 81 ca + pub; 82 ca + prot; 83 ca + priv; 84 -ca; 85 // These are all surrogate calls 86 ca(pub); 87 ca(prot); // expected-error {{'operator void (*)(Protected &)' is a protected member}} 88 ca(priv); // expected-error {{'operator void (*)(Private &)' is a private member}} 89 } 90 } 91 92 // Implicit constructor calls. 93 namespace test2 { 94 class A { 95 private: 96 A(); // expected-note 1+{{declared private here}} 97 98 static A foo; 99 }; 100 101 A a; // expected-error {{calling a private constructor}} 102 A A::foo; // okay 103 104 #if __cplusplus < 201103L 105 class B : A { }; // expected-error {{base class 'test2::A' has private default constructor}} 106 B b; // expected-note{{implicit default constructor}} 107 108 class C : virtual A { 109 public: 110 C(); 111 }; 112 113 class D : C { }; // expected-error {{inherited virtual base class 'test2::A' has private default constructor}} 114 D d; // expected-note{{implicit default constructor}} 115 #else 116 class B : A { }; // expected-note {{base class 'test2::A' has an inaccessible default constructor}} 117 B b; // expected-error {{call to implicitly-deleted default constructor}} 118 119 // FIXME: Do a better job of explaining how we get here from class D. 120 class C : virtual A { // expected-note {{default constructor of 'D' is implicitly deleted because base class 'test2::A' has an inaccessible default constructor}} 121 public: 122 C(); 123 }; 124 125 class D : C { }; 126 D d; // expected-error {{call to implicitly-deleted default constructor}} 127 #endif 128 } 129 130 // Implicit destructor calls. 131 namespace test3 { 132 class A { 133 private: 134 ~A(); // expected-note 2 {{declared private here}} 135 static A foo; 136 }; 137 138 A a; // expected-error {{variable of type 'test3::A' has private destructor}} 139 A A::foo; 140 141 void foo(A param) { // okay 142 A local; // expected-error {{variable of type 'test3::A' has private destructor}} 143 } 144 145 #if __cplusplus < 201103L && !defined(_MSC_VER) 146 template <unsigned N> class Base { ~Base(); }; // expected-note 14 {{declared private here}} 147 class Base2 : virtual Base<2> { ~Base2(); }; // expected-note 3 {{declared private here}} \ 148 // expected-error {{base class 'Base<2>' has private destructor}} 149 class Base3 : virtual Base<3> { public: ~Base3(); }; // expected-error {{base class 'Base<3>' has private destructor}} 150 151 // These don't cause diagnostics because we don't need the destructor. 152 class Derived0 : Base<0> { ~Derived0(); }; 153 class Derived1 : Base<1> { }; 154 155 class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \ 156 // expected-error {{inherited virtual base class 'Base<3>' has private destructor}} 157 Base<0>, // expected-error {{base class 'Base<0>' has private destructor}} 158 virtual Base<1>, // expected-error {{base class 'Base<1>' has private destructor}} 159 Base2, // expected-error {{base class 'test3::Base2' has private destructor}} 160 virtual Base3 161 { 162 ~Derived2() {} 163 }; 164 165 class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \ 166 // expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}} \ 167 // expected-note 2{{implicit default constructor}} 168 Base<0>, // expected-error 2 {{base class 'Base<0>' has private destructor}} 169 virtual Base<1>, // expected-error 2 {{base class 'Base<1>' has private destructor}} 170 Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}} 171 virtual Base3 172 {}; 173 Derived3 d3; // expected-note{{implicit destructor}}} \ 174 // expected-note 3 {{implicit default constructor}} 175 #elif __cplusplus < 201103L && defined(_MSC_VER) 176 template <unsigned N> class Base { ~Base(); }; // expected-note 14 {{declared private here}} 177 class Base2 : virtual Base<2> { ~Base2(); }; // expected-note 3 {{declared private here}} \ 178 // expected-error {{base class 'Base<2>' has private destructor}} 179 class Base3 : virtual Base<3> { public: ~Base3(); }; // expected-error {{base class 'Base<3>' has private destructor}} 180 181 // These don't cause diagnostics because we don't need the destructor. 182 class Derived0 : Base<0> { ~Derived0(); }; 183 class Derived1 : Base<1> { }; 184 185 class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \ 186 // expected-error {{inherited virtual base class 'Base<3>' has private destructor}} 187 Base<0>, // expected-error {{base class 'Base<0>' has private destructor}} 188 virtual Base<1>, // expected-error {{base class 'Base<1>' has private destructor}} 189 Base2, // expected-error {{base class 'test3::Base2' has private destructor}} 190 virtual Base3 191 { 192 ~Derived2() {} // expected-note 2{{in implicit destructor}} 193 }; 194 195 class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \ 196 // expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}} 197 Base<0>, // expected-error 2 {{base class 'Base<0>' has private destructor}} 198 virtual Base<1>, // expected-error 2 {{base class 'Base<1>' has private destructor}} 199 Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}} 200 virtual Base3 201 {}; 202 Derived3 d3; // expected-note{{implicit destructor}}} expected-note {{implicit default constructor}} 203 #elif __cplusplus >= 201103L && !defined(_MSC_VER) 204 template <unsigned N> class Base { ~Base(); }; // expected-note 4{{declared private here}} 205 class Base2 : virtual Base<2> { ~Base2(); }; // expected-note 1{{declared private here}} 206 class Base3 : virtual Base<3> { public: ~Base3(); }; 207 208 // These don't cause diagnostics because we don't need the destructor. 209 class Derived0 : Base<0> { ~Derived0(); }; 210 class Derived1 : Base<1> { }; 211 212 class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \ 213 // expected-error {{inherited virtual base class 'Base<3>' has private destructor}} 214 Base<0>, // expected-error {{base class 'Base<0>' has private destructor}} 215 virtual Base<1>, // expected-error {{base class 'Base<1>' has private destructor}} 216 Base2, // expected-error {{base class 'test3::Base2' has private destructor}} 217 virtual Base3 218 { 219 ~Derived2() {} 220 }; 221 222 class Derived3 : 223 Base<0>, // expected-note {{deleted because base class 'Base<0>' has an inaccessible destructor}} 224 virtual Base<1>, 225 Base2, 226 virtual Base3 227 {}; 228 Derived3 d3; // expected-error {{implicitly-deleted default constructor}} 229 #elif __cplusplus >= 201103L && defined(_MSC_VER) 230 template <unsigned N> class Base { ~Base(); }; // expected-note 6{{declared private here}} 231 // expected-error@+1 {{inherited virtual base class 'Base<2>' has private destructor}} 232 class Base2 : virtual Base<2> { ~Base2(); }; // expected-note 1{{declared private here}} 233 // expected-error@+1 {{inherited virtual base class 'Base<3>' has private destructor}} 234 class Base3 : virtual Base<3> { public: ~Base3(); }; 235 236 // These don't cause diagnostics because we don't need the destructor. 237 class Derived0 : Base<0> { ~Derived0(); }; 238 class Derived1 : Base<1> { }; 239 240 class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \ 241 // expected-error {{inherited virtual base class 'Base<3>' has private destructor}} 242 Base<0>, // expected-error {{base class 'Base<0>' has private destructor}} 243 virtual Base<1>, // expected-error {{base class 'Base<1>' has private destructor}} 244 Base2, // expected-error {{base class 'test3::Base2' has private destructor}} 245 virtual Base3 246 { 247 // expected-note@+2 {{in implicit destructor for 'test3::Base2' first required here}} 248 // expected-note@+1 {{in implicit destructor for 'test3::Base3' first required here}} 249 ~Derived2() {} 250 }; 251 252 class Derived3 : 253 Base<0>, // expected-note {{deleted because base class 'Base<0>' has an inaccessible destructor}} 254 virtual Base<1>, 255 Base2, 256 virtual Base3 257 {}; 258 Derived3 d3; // expected-error {{implicitly-deleted default constructor}} 259 #else 260 #error "missing case of MSVC cross C++ versions" 261 #endif 262 } 263 264 // Conversion functions. 265 namespace test4 { 266 class Base { 267 private: 268 operator Private(); // expected-note 4 {{declared private here}} 269 public: 270 operator Public(); // expected-note 2{{member is declared here}} 271 }; 272 273 class Derived1 : private Base { // expected-note 2 {{declared private here}} \ 274 // expected-note {{constrained by private inheritance}} 275 Private test1() { return *this; } // expected-error {{'operator Private' is a private member}} 276 Public test2() { return *this; } 277 }; 278 Private test1(Derived1 &d) { return d; } // expected-error {{'operator Private' is a private member}} \ 279 // expected-error {{cannot cast 'test4::Derived1' to its private base class}} 280 Public test2(Derived1 &d) { return d; } // expected-error {{cannot cast 'test4::Derived1' to its private base class}} \ 281 // expected-error {{'operator Public' is a private member}} 282 283 284 class Derived2 : public Base { 285 Private test1() { return *this; } // expected-error {{'operator Private' is a private member}} 286 Public test2() { return *this; } 287 }; 288 Private test1(Derived2 &d) { return d; } // expected-error {{'operator Private' is a private member}} 289 Public test2(Derived2 &d) { return d; } 290 291 class Derived3 : private Base { // expected-note {{constrained by private inheritance here}} \ 292 // expected-note {{declared private here}} 293 public: 294 operator Private(); 295 }; 296 Private test1(Derived3 &d) { return d; } 297 Public test2(Derived3 &d) { return d; } // expected-error {{'operator Public' is a private member of 'test4::Base'}} \ 298 // expected-error {{cannot cast 'test4::Derived3' to its private base class}} 299 300 class Derived4 : public Base { 301 public: 302 operator Private(); 303 }; 304 Private test1(Derived4 &d) { return d; } 305 Public test2(Derived4 &d) { return d; } 306 } 307 308 // Implicit copy assignment operator uses. 309 namespace test5 { 310 class A { 311 void operator=(const A &); 312 #if __cplusplus < 201103L 313 // expected-note@-2 2{{implicitly declared private here}} 314 #endif 315 }; 316 317 #if __cplusplus < 201103L 318 class Test1 { A a; }; // expected-error {{private member}} 319 void test1() { 320 Test1 a; 321 a = Test1(); // expected-note{{implicit copy}} 322 } 323 324 class Test2 : A {}; // expected-error {{private member}} 325 void test2() { 326 Test2 a; 327 a = Test2(); // expected-note{{implicit copy}} 328 } 329 #else 330 class Test1 { A a; }; // expected-note {{because field 'a' has an inaccessible copy assignment operator}} 331 void test1() { 332 Test1 a; 333 a = Test1(); // expected-error {{copy assignment operator is implicitly deleted}} 334 } 335 336 class Test2 : A {}; // expected-note {{because base class 'test5::A' has an inaccessible copy assignment operator}} 337 void test2() { 338 Test2 a; 339 a = Test2(); // expected-error {{copy assignment operator is implicitly deleted}} 340 } 341 #endif 342 } 343 344 // Implicit copy constructor uses. 345 namespace test6 { 346 class A { 347 public: A(); 348 private: A(const A &); 349 #if __cplusplus < 201103L 350 // expected-note@-2 2{{declared private here}} 351 #endif 352 }; 353 354 #if __cplusplus < 201103L 355 class Test1 { A a; }; // expected-error {{field of type 'test6::A' has private copy constructor}} 356 void test1(const Test1 &t) { 357 Test1 a = t; // expected-note{{implicit copy}} 358 } 359 360 class Test2 : A {}; // expected-error {{base class 'test6::A' has private copy constructor}} 361 void test2(const Test2 &t) { 362 Test2 a = t; // expected-note{{implicit copy}} 363 } 364 #else 365 class Test1 { A a; }; // expected-note {{field 'a' has an inaccessible copy constructor}} 366 void test1(const Test1 &t) { 367 Test1 a = t; // expected-error{{implicitly-deleted}} 368 } 369 370 class Test2 : A {}; // expected-note {{base class 'test6::A' has an inaccessible copy constructor}} 371 void test2(const Test2 &t) { 372 Test2 a = t; // expected-error{{implicitly-deleted}} 373 } 374 #endif 375 } 376 377 // Redeclaration lookups are not accesses. 378 namespace test7 { 379 class A { 380 int private_member; 381 }; 382 class B : A { 383 int foo(int private_member) { 384 return 0; 385 } 386 }; 387 } 388 389 // Ignored operator new and delete overloads are not 390 namespace test8 { 391 typedef __typeof__(sizeof(int)) size_t; 392 393 class A { 394 void *operator new(size_t s); 395 void operator delete(void *p); 396 public: 397 void *operator new(size_t s, int n); 398 void operator delete(void *p, int n); 399 }; 400 401 void test() { 402 new (2) A(); 403 } 404 } 405 406 // Don't silently upgrade forbidden-access paths to private. 407 namespace test9 { 408 class A { 409 public: static int x; // expected-note {{member is declared here}} 410 }; 411 class B : private A { // expected-note {{constrained by private inheritance here}} 412 }; 413 class C : public B { 414 static int getX() { return x; } // expected-error {{'x' is a private member of 'test9::A'}} 415 }; 416 } 417 418 namespace test10 { 419 class A { 420 enum { 421 value = 10 // expected-note {{declared private here}} 422 }; 423 friend class C; 424 }; 425 426 class B { 427 enum { 428 value = A::value // expected-error {{'value' is a private member of 'test10::A'}} 429 }; 430 }; 431 432 class C { 433 enum { 434 value = A::value 435 }; 436 }; 437 } 438 439 namespace test11 { 440 class A { 441 protected: virtual ~A(); 442 }; 443 444 class B : public A { 445 ~B(); 446 }; 447 448 B::~B() {}; 449 } 450 451 namespace test12 { 452 class A { 453 int x; 454 455 void foo() { 456 class Local { 457 int foo(A *a) { 458 return a->x; 459 } 460 }; 461 } 462 }; 463 } 464 465 namespace test13 { 466 struct A { 467 int x; 468 unsigned foo() const; 469 }; 470 471 struct B : protected A { 472 using A::foo; 473 using A::x; 474 }; 475 476 void test() { 477 A *d; 478 d->foo(); 479 (void) d->x; 480 } 481 } 482 483 // Destructors for temporaries. 484 namespace test14 { 485 class A { 486 private: ~A(); // expected-note {{declared private here}} 487 }; 488 A foo(); 489 490 void test() { 491 foo(); // expected-error {{temporary of type 'test14::A' has private destructor}} 492 } 493 494 class X { 495 ~X(); // expected-note {{declared private here}} 496 }; 497 498 struct Y1 { 499 operator X(); 500 }; 501 502 void g() { 503 const X &xr = Y1(); // expected-error{{temporary of type 'test14::X' has private destructor}} 504 } 505 } 506 507 // PR 7024 508 namespace test15 { 509 template <class T> class A { 510 private: 511 int private_foo; // expected-note {{declared private here}} 512 static int private_sfoo; // expected-note {{declared private here}} 513 protected: 514 int protected_foo; // expected-note 3 {{declared protected here}} // expected-note {{can only access this member on an object of type 'test15::B<int>'}} 515 static int protected_sfoo; // expected-note 3 {{declared protected here}} 516 517 int test1(A<int> &a) { 518 return a.private_foo; // expected-error {{private member}} 519 } 520 521 int test2(A<int> &a) { 522 return a.private_sfoo; // expected-error {{private member}} 523 } 524 525 int test3(A<int> &a) { 526 return a.protected_foo; // expected-error {{protected member}} 527 } 528 529 int test4(A<int> &a) { 530 return a.protected_sfoo; // expected-error {{protected member}} 531 } 532 }; 533 534 template class A<int>; 535 template class A<long>; // expected-note 4 {{in instantiation}} 536 537 template <class T> class B : public A<T> { 538 // TODO: These first two accesses can be detected as ill-formed at 539 // definition time because they're member accesses and A<int> can't 540 // be a subclass of B<T> for any T. 541 542 int test1(A<int> &a) { 543 return a.protected_foo; // expected-error 2 {{protected member}} 544 } 545 546 int test2(A<int> &a) { 547 return a.protected_sfoo; // expected-error {{protected member}} 548 } 549 550 int test3(B<int> &b) { 551 return b.protected_foo; // expected-error {{protected member}} 552 } 553 554 int test4(B<int> &b) { 555 return b.protected_sfoo; // expected-error {{protected member}} 556 } 557 }; 558 559 template class B<int>; // expected-note {{in instantiation}} 560 template class B<long>; // expected-note 4 {{in instantiation}} 561 } 562 563 // PR7281 564 namespace test16 { 565 class A { ~A(); }; // expected-note 2{{declared private here}} 566 void b() { throw A(); } // expected-error{{temporary of type 'test16::A' has private destructor}} \ 567 // expected-error{{exception object of type 'test16::A' has private destructor}} 568 } 569 570 // rdar://problem/8146294 571 namespace test17 { 572 class A { 573 template <typename T> class Inner { }; // expected-note {{declared private here}} 574 }; 575 576 A::Inner<int> s; // expected-error {{'Inner' is a private member of 'test17::A'}} 577 } 578 579 namespace test18 { 580 template <class T> class A {}; // expected-note {{member is declared here}} 581 class B : A<int> { // expected-note {{constrained by implicitly private inheritance here}} 582 A<int> member; 583 }; 584 class C : B { 585 A<int> member; // expected-error {{'A' is a private member of 'test18::A<int>'}} 586 }; 587 } 588 589 // PR8325 590 namespace test19 { 591 class A { ~A(); }; 592 // The destructor is not implicitly referenced here. Contrast to test16, 593 // testing PR7281, earlier in this file. 594 void b(A* x) { throw x; } 595 } 596 597 // PR7930 598 namespace test20 { 599 class Foo { 600 Foo(); // expected-note {{implicitly declared private here}} 601 }; 602 Foo::Foo() {} 603 604 void test() { 605 Foo a; // expected-error {{calling a private constructor}} 606 } 607 } 608 609 namespace test21 { 610 template <class T> class A { 611 void foo(); 612 void bar(); 613 class Inner; // expected-note {{implicitly declared private here}} 614 public: 615 void baz(); 616 }; 617 template <class T> class A<T>::Inner {}; 618 class B { 619 template <class T> class A<T>::Inner; // expected-error{{non-friend class member 'Inner' cannot have a qualified name}} 620 }; 621 622 void test() { 623 A<int>::Inner i; // expected-error {{'Inner' is a private member}} 624 } 625 } 626 627 namespace rdar8876150 { 628 struct A { operator bool(); }; 629 struct B : private A { using A::operator bool; }; 630 631 bool f() { 632 B b; 633 return !b; 634 } 635 } 636 637 namespace test23 { 638 template <typename T> class A { 639 A(); 640 static A instance; 641 }; 642 643 template <typename T> A<T> A<T>::instance; 644 template class A<int>; 645 } 646