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 2{{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}} expected-error {{attempt to use a deleted function}} 229 #elif __cplusplus >= 201103L && defined(_MSC_VER) 230 template <unsigned N> class Base { ~Base(); }; // expected-note 9{{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 : // expected-error 3{{has private destructor}} 253 Base<0>, // expected-note {{deleted because base class 'Base<0>' has an inaccessible destructor}} 254 // expected-note@-1 {{destructor of 'Derived3' is implicitly deleted}} 255 virtual Base<1>, 256 Base2, 257 virtual Base3 258 {}; 259 Derived3 d3; // expected-error {{implicitly-deleted default constructor}} expected-error {{use a deleted function}} 260 // expected-note@-1 {{implicit destructor for}} 261 #else 262 #error "missing case of MSVC cross C++ versions" 263 #endif 264 } 265 266 // Conversion functions. 267 namespace test4 { 268 class Base { 269 private: 270 operator Private(); // expected-note 4 {{declared private here}} 271 public: 272 operator Public(); // expected-note 2{{member is declared here}} 273 }; 274 275 class Derived1 : private Base { // expected-note 2 {{declared private here}} \ 276 // expected-note {{constrained by private inheritance}} 277 Private test1() { return *this; } // expected-error {{'operator Private' is a private member}} 278 Public test2() { return *this; } 279 }; 280 Private test1(Derived1 &d) { return d; } // expected-error {{'operator Private' is a private member}} \ 281 // expected-error {{cannot cast 'test4::Derived1' to its private base class}} 282 Public test2(Derived1 &d) { return d; } // expected-error {{cannot cast 'test4::Derived1' to its private base class}} \ 283 // expected-error {{'operator Public' is a private member}} 284 285 286 class Derived2 : public Base { 287 Private test1() { return *this; } // expected-error {{'operator Private' is a private member}} 288 Public test2() { return *this; } 289 }; 290 Private test1(Derived2 &d) { return d; } // expected-error {{'operator Private' is a private member}} 291 Public test2(Derived2 &d) { return d; } 292 293 class Derived3 : private Base { // expected-note {{constrained by private inheritance here}} \ 294 // expected-note {{declared private here}} 295 public: 296 operator Private(); 297 }; 298 Private test1(Derived3 &d) { return d; } 299 Public test2(Derived3 &d) { return d; } // expected-error {{'operator Public' is a private member of 'test4::Base'}} \ 300 // expected-error {{cannot cast 'test4::Derived3' to its private base class}} 301 302 class Derived4 : public Base { 303 public: 304 operator Private(); 305 }; 306 Private test1(Derived4 &d) { return d; } 307 Public test2(Derived4 &d) { return d; } 308 } 309 310 // Implicit copy assignment operator uses. 311 namespace test5 { 312 class A { 313 void operator=(const A &); 314 #if __cplusplus < 201103L 315 // expected-note@-2 2{{implicitly declared private here}} 316 #endif 317 }; 318 319 #if __cplusplus < 201103L 320 class Test1 { A a; }; // expected-error {{private member}} 321 void test1() { 322 Test1 a; 323 a = Test1(); // expected-note{{implicit copy}} 324 } 325 326 class Test2 : A {}; // expected-error {{private member}} 327 void test2() { 328 Test2 a; 329 a = Test2(); // expected-note{{implicit copy}} 330 } 331 #else 332 class Test1 { A a; }; // expected-note {{because field 'a' has an inaccessible copy assignment operator}} 333 void test1() { 334 Test1 a; 335 a = Test1(); // expected-error {{copy assignment operator is implicitly deleted}} 336 } 337 338 class Test2 : A {}; // expected-note {{because base class 'test5::A' has an inaccessible copy assignment operator}} 339 void test2() { 340 Test2 a; 341 a = Test2(); // expected-error {{copy assignment operator is implicitly deleted}} 342 } 343 #endif 344 } 345 346 // Implicit copy constructor uses. 347 namespace test6 { 348 class A { 349 public: A(); 350 private: A(const A &); 351 #if __cplusplus < 201103L 352 // expected-note@-2 2{{declared private here}} 353 #endif 354 }; 355 356 #if __cplusplus < 201103L 357 class Test1 { A a; }; // expected-error {{field of type 'test6::A' has private copy constructor}} 358 void test1(const Test1 &t) { 359 Test1 a = t; // expected-note{{implicit copy}} 360 } 361 362 class Test2 : A {}; // expected-error {{base class 'test6::A' has private copy constructor}} 363 void test2(const Test2 &t) { 364 Test2 a = t; // expected-note{{implicit copy}} 365 } 366 #else 367 class Test1 { A a; }; // expected-note {{field 'a' has an inaccessible copy constructor}} 368 void test1(const Test1 &t) { 369 Test1 a = t; // expected-error{{implicitly-deleted}} 370 } 371 372 class Test2 : A {}; // expected-note {{base class 'test6::A' has an inaccessible copy constructor}} 373 void test2(const Test2 &t) { 374 Test2 a = t; // expected-error{{implicitly-deleted}} 375 } 376 #endif 377 } 378 379 // Redeclaration lookups are not accesses. 380 namespace test7 { 381 class A { 382 int private_member; 383 }; 384 class B : A { 385 int foo(int private_member) { 386 return 0; 387 } 388 }; 389 } 390 391 // Ignored operator new and delete overloads are not 392 namespace test8 { 393 typedef __typeof__(sizeof(int)) size_t; 394 395 class A { 396 void *operator new(size_t s); 397 void operator delete(void *p); 398 public: 399 void *operator new(size_t s, int n); 400 void operator delete(void *p, int n); 401 }; 402 403 void test() { 404 new (2) A(); 405 } 406 } 407 408 // Don't silently upgrade forbidden-access paths to private. 409 namespace test9 { 410 class A { 411 public: static int x; // expected-note {{member is declared here}} 412 }; 413 class B : private A { // expected-note {{constrained by private inheritance here}} 414 }; 415 class C : public B { 416 static int getX() { return x; } // expected-error {{'x' is a private member of 'test9::A'}} 417 }; 418 } 419 420 namespace test10 { 421 class A { 422 enum { 423 value = 10 // expected-note {{declared private here}} 424 }; 425 friend class C; 426 }; 427 428 class B { 429 enum { 430 value = A::value // expected-error {{'value' is a private member of 'test10::A'}} 431 }; 432 }; 433 434 class C { 435 enum { 436 value = A::value 437 }; 438 }; 439 } 440 441 namespace test11 { 442 class A { 443 protected: virtual ~A(); 444 }; 445 446 class B : public A { 447 ~B(); 448 }; 449 450 B::~B() {}; 451 } 452 453 namespace test12 { 454 class A { 455 int x; 456 457 void foo() { 458 class Local { 459 int foo(A *a) { 460 return a->x; 461 } 462 }; 463 } 464 }; 465 } 466 467 namespace test13 { 468 struct A { 469 int x; 470 unsigned foo() const; 471 }; 472 473 struct B : protected A { 474 using A::foo; 475 using A::x; 476 }; 477 478 void test() { 479 A *d; 480 d->foo(); 481 (void) d->x; 482 } 483 } 484 485 // Destructors for temporaries. 486 namespace test14 { 487 class A { 488 private: ~A(); // expected-note {{declared private here}} 489 }; 490 A foo(); 491 492 void test() { 493 foo(); // expected-error {{temporary of type 'test14::A' has private destructor}} 494 } 495 496 class X { 497 ~X(); // expected-note {{declared private here}} 498 }; 499 500 struct Y1 { 501 operator X(); 502 }; 503 504 void g() { 505 const X &xr = Y1(); // expected-error{{temporary of type 'test14::X' has private destructor}} 506 } 507 } 508 509 // PR 7024 510 namespace test15 { 511 template <class T> class A { 512 private: 513 int private_foo; // expected-note {{declared private here}} 514 static int private_sfoo; // expected-note {{declared private here}} 515 protected: 516 int protected_foo; // expected-note 3 {{declared protected here}} // expected-note {{can only access this member on an object of type 'test15::B<int>'}} 517 static int protected_sfoo; // expected-note 3 {{declared protected here}} 518 519 int test1(A<int> &a) { 520 return a.private_foo; // expected-error {{private member}} 521 } 522 523 int test2(A<int> &a) { 524 return a.private_sfoo; // expected-error {{private member}} 525 } 526 527 int test3(A<int> &a) { 528 return a.protected_foo; // expected-error {{protected member}} 529 } 530 531 int test4(A<int> &a) { 532 return a.protected_sfoo; // expected-error {{protected member}} 533 } 534 }; 535 536 template class A<int>; 537 template class A<long>; // expected-note 4 {{in instantiation}} 538 539 template <class T> class B : public A<T> { 540 // TODO: These first two accesses can be detected as ill-formed at 541 // definition time because they're member accesses and A<int> can't 542 // be a subclass of B<T> for any T. 543 544 int test1(A<int> &a) { 545 return a.protected_foo; // expected-error 2 {{protected member}} 546 } 547 548 int test2(A<int> &a) { 549 return a.protected_sfoo; // expected-error {{protected member}} 550 } 551 552 int test3(B<int> &b) { 553 return b.protected_foo; // expected-error {{protected member}} 554 } 555 556 int test4(B<int> &b) { 557 return b.protected_sfoo; // expected-error {{protected member}} 558 } 559 }; 560 561 template class B<int>; // expected-note {{in instantiation}} 562 template class B<long>; // expected-note 4 {{in instantiation}} 563 } 564 565 // PR7281 566 namespace test16 { 567 class A { ~A(); }; // expected-note 2{{declared private here}} 568 void b() { throw A(); } // expected-error{{temporary of type 'test16::A' has private destructor}} \ 569 // expected-error{{exception object of type 'test16::A' has private destructor}} 570 } 571 572 // rdar://problem/8146294 573 namespace test17 { 574 class A { 575 template <typename T> class Inner { }; // expected-note {{declared private here}} 576 }; 577 578 A::Inner<int> s; // expected-error {{'Inner' is a private member of 'test17::A'}} 579 } 580 581 namespace test18 { 582 template <class T> class A {}; // expected-note {{member is declared here}} 583 class B : A<int> { // expected-note {{constrained by implicitly private inheritance here}} 584 A<int> member; 585 }; 586 class C : B { 587 A<int> member; // expected-error {{'A' is a private member of 'test18::A<int>'}} 588 }; 589 } 590 591 // PR8325 592 namespace test19 { 593 class A { ~A(); }; 594 // The destructor is not implicitly referenced here. Contrast to test16, 595 // testing PR7281, earlier in this file. 596 void b(A* x) { throw x; } 597 } 598 599 // PR7930 600 namespace test20 { 601 class Foo { 602 Foo(); // expected-note {{implicitly declared private here}} 603 }; 604 Foo::Foo() {} 605 606 void test() { 607 Foo a; // expected-error {{calling a private constructor}} 608 } 609 } 610 611 namespace test21 { 612 template <class T> class A { 613 void foo(); 614 void bar(); 615 class Inner; // expected-note {{implicitly declared private here}} 616 public: 617 void baz(); 618 }; 619 template <class T> class A<T>::Inner {}; 620 class B { 621 template <class T> class A<T>::Inner; // expected-error{{non-friend class member 'Inner' cannot have a qualified name}} 622 }; 623 624 void test() { 625 A<int>::Inner i; // expected-error {{'Inner' is a private member}} 626 } 627 } 628 629 namespace rdar8876150 { 630 struct A { operator bool(); }; 631 struct B : private A { using A::operator bool; }; 632 633 bool f() { 634 B b; 635 return !b; 636 } 637 } 638 639 namespace test23 { 640 template <typename T> class A { 641 A(); 642 static A instance; 643 }; 644 645 template <typename T> A<T> A<T>::instance; 646 template class A<int>; 647 } 648