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