1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li // C++0x [class.access.base]p1(a): 4*67e74705SXin Li // If a class is declared to be a base class for another class using 5*67e74705SXin Li // the public access specifier, the public members of the base class 6*67e74705SXin Li // are accessible as public members of the derived class and protected 7*67e74705SXin Li // members of the base class are accessible as protected members of 8*67e74705SXin Li // the derived class. 9*67e74705SXin Li namespace test0 { 10*67e74705SXin Li class Base { 11*67e74705SXin Li public: int pub; static int spub; 12*67e74705SXin Li protected: int prot; static int sprot; // expected-note 4 {{declared protected here}} 13*67e74705SXin Li private: int priv; static int spriv; // expected-note 8 {{declared private here}} 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li class Test : public Base { test()17*67e74705SXin Li void test() { 18*67e74705SXin Li pub++; 19*67e74705SXin Li spub++; 20*67e74705SXin Li prot++; 21*67e74705SXin Li sprot++; 22*67e74705SXin Li priv++; // expected-error {{private member}} 23*67e74705SXin Li spriv++; // expected-error {{private member}} 24*67e74705SXin Li 25*67e74705SXin Li Base::pub++; 26*67e74705SXin Li Base::spub++; 27*67e74705SXin Li Base::prot++; 28*67e74705SXin Li Base::sprot++; 29*67e74705SXin Li Base::priv++; // expected-error {{private member}} 30*67e74705SXin Li Base::spriv++; // expected-error {{private member}} 31*67e74705SXin Li } 32*67e74705SXin Li }; 33*67e74705SXin Li test(Test * t)34*67e74705SXin Li void test(Test *t) { 35*67e74705SXin Li t->pub++; 36*67e74705SXin Li t->spub++; 37*67e74705SXin Li t->prot++; // expected-error {{protected member}} 38*67e74705SXin Li t->sprot++; // expected-error {{protected member}} 39*67e74705SXin Li t->priv++; // expected-error {{private member}} 40*67e74705SXin Li t->spriv++; // expected-error {{private member}} 41*67e74705SXin Li 42*67e74705SXin Li t->Base::pub++; 43*67e74705SXin Li t->Base::spub++; 44*67e74705SXin Li t->Base::prot++; // expected-error {{protected member}} 45*67e74705SXin Li t->Base::sprot++; // expected-error {{protected member}} 46*67e74705SXin Li t->Base::priv++; // expected-error {{private member}} 47*67e74705SXin Li t->Base::spriv++; // expected-error {{private member}} 48*67e74705SXin Li } 49*67e74705SXin Li } 50*67e74705SXin Li 51*67e74705SXin Li // C++0x [class.access.base]p1(b): 52*67e74705SXin Li // If a class is declared to be a base class for another class using 53*67e74705SXin Li // the protected access specifier, the public and protected members 54*67e74705SXin Li // of the base class are accessible as protected members of the 55*67e74705SXin Li // derived class. 56*67e74705SXin Li namespace test1 { 57*67e74705SXin Li class Base { // expected-note 6{{member is declared here}} 58*67e74705SXin Li public: 59*67e74705SXin Li int pub; // expected-note{{member is declared here}} 60*67e74705SXin Li static int spub; // expected-note{{member is declared here}} 61*67e74705SXin Li protected: int prot; static int sprot; // expected-note 4 {{declared protected here}} 62*67e74705SXin Li private: int priv; static int spriv; // expected-note 8 {{declared private here}} 63*67e74705SXin Li }; 64*67e74705SXin Li 65*67e74705SXin Li class Test : protected Base { // expected-note 6 {{declared protected here}} expected-note 8 {{constrained by protected inheritance here}} test()66*67e74705SXin Li void test() { 67*67e74705SXin Li pub++; 68*67e74705SXin Li spub++; 69*67e74705SXin Li prot++; 70*67e74705SXin Li sprot++; 71*67e74705SXin Li priv++; // expected-error {{private member}} 72*67e74705SXin Li spriv++; // expected-error {{private member}} 73*67e74705SXin Li 74*67e74705SXin Li Base::pub++; 75*67e74705SXin Li Base::spub++; 76*67e74705SXin Li Base::prot++; 77*67e74705SXin Li Base::sprot++; 78*67e74705SXin Li Base::priv++; // expected-error {{private member}} 79*67e74705SXin Li Base::spriv++; // expected-error {{private member}} 80*67e74705SXin Li } 81*67e74705SXin Li }; 82*67e74705SXin Li test(Test * t)83*67e74705SXin Li void test(Test *t) { 84*67e74705SXin Li t->pub++; // expected-error {{protected member}} expected-error {{protected base class}} 85*67e74705SXin Li t->spub++; // expected-error {{protected member}} 86*67e74705SXin Li t->prot++; // expected-error {{protected member}} expected-error {{protected base class}} 87*67e74705SXin Li t->sprot++; // expected-error {{protected member}} 88*67e74705SXin Li t->priv++; // expected-error {{private member}} expected-error {{protected base class}} 89*67e74705SXin Li t->spriv++; // expected-error {{private member}} 90*67e74705SXin Li 91*67e74705SXin Li // Two possible errors here: one for Base, one for the member 92*67e74705SXin Li t->Base::pub++; // expected-error {{protected member}} expected-error {{protected base class}} 93*67e74705SXin Li t->Base::spub++; // expected-error {{protected member}} 94*67e74705SXin Li t->Base::prot++; // expected-error 2 {{protected member}} expected-error {{protected base class}} 95*67e74705SXin Li t->Base::sprot++; // expected-error 2 {{protected member}} 96*67e74705SXin Li t->Base::priv++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{protected base class}} 97*67e74705SXin Li t->Base::spriv++; // expected-error {{protected member}} expected-error {{private member}} 98*67e74705SXin Li } 99*67e74705SXin Li } 100*67e74705SXin Li 101*67e74705SXin Li // C++0x [class.access.base]p1(b): 102*67e74705SXin Li // If a class is declared to be a base class for another class using 103*67e74705SXin Li // the private access specifier, the public and protected members of 104*67e74705SXin Li // the base class are accessible as private members of the derived 105*67e74705SXin Li // class. 106*67e74705SXin Li namespace test2 { 107*67e74705SXin Li class Base { // expected-note 6{{member is declared here}} 108*67e74705SXin Li public: 109*67e74705SXin Li int pub; // expected-note{{member is declared here}} 110*67e74705SXin Li static int spub; // expected-note{{member is declared here}} 111*67e74705SXin Li protected: 112*67e74705SXin Li int prot; // expected-note {{declared protected here}} \ 113*67e74705SXin Li // expected-note{{member is declared here}} 114*67e74705SXin Li static int sprot; // expected-note {{declared protected here}} \ 115*67e74705SXin Li // expected-note{{member is declared here}} 116*67e74705SXin Li private: 117*67e74705SXin Li int priv; // expected-note 4 {{declared private here}} 118*67e74705SXin Li static int spriv; // expected-note 4 {{declared private here}} 119*67e74705SXin Li }; 120*67e74705SXin Li 121*67e74705SXin Li class Test : private Base { // expected-note 6 {{declared private here}} \ 122*67e74705SXin Li // expected-note 10 {{constrained by private inheritance here}} test()123*67e74705SXin Li void test() { 124*67e74705SXin Li pub++; 125*67e74705SXin Li spub++; 126*67e74705SXin Li prot++; 127*67e74705SXin Li sprot++; 128*67e74705SXin Li priv++; // expected-error {{private member}} 129*67e74705SXin Li spriv++; // expected-error {{private member}} 130*67e74705SXin Li 131*67e74705SXin Li Base::pub++; 132*67e74705SXin Li Base::spub++; 133*67e74705SXin Li Base::prot++; 134*67e74705SXin Li Base::sprot++; 135*67e74705SXin Li Base::priv++; // expected-error {{private member}} 136*67e74705SXin Li Base::spriv++; // expected-error {{private member}} 137*67e74705SXin Li } 138*67e74705SXin Li }; 139*67e74705SXin Li test(Test * t)140*67e74705SXin Li void test(Test *t) { 141*67e74705SXin Li t->pub++; // expected-error {{private member}} expected-error {{private base class}} 142*67e74705SXin Li t->spub++; // expected-error {{private member}} 143*67e74705SXin Li t->prot++; // expected-error {{private member}} expected-error {{private base class}} 144*67e74705SXin Li t->sprot++; // expected-error {{private member}} 145*67e74705SXin Li t->priv++; // expected-error {{private member}} expected-error {{private base class}} 146*67e74705SXin Li t->spriv++; // expected-error {{private member}} 147*67e74705SXin Li 148*67e74705SXin Li t->Base::pub++; // expected-error {{private member}} expected-error {{private base class}} 149*67e74705SXin Li t->Base::spub++; // expected-error {{private member}} 150*67e74705SXin Li t->Base::prot++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{private base class}} 151*67e74705SXin Li t->Base::sprot++; // expected-error {{protected member}} expected-error {{private member}} 152*67e74705SXin Li t->Base::priv++; // expected-error 2 {{private member}} expected-error {{private base class}} 153*67e74705SXin Li t->Base::spriv++; // expected-error 2 {{private member}} 154*67e74705SXin Li } 155*67e74705SXin Li } 156*67e74705SXin Li 157*67e74705SXin Li namespace PR12788 { 158*67e74705SXin Li class A { 159*67e74705SXin Li protected: 160*67e74705SXin Li struct { 161*67e74705SXin Li int x; 162*67e74705SXin Li }; 163*67e74705SXin Li }; 164*67e74705SXin Li class B : A { f()165*67e74705SXin Li void f() { 166*67e74705SXin Li ++x; 167*67e74705SXin Li A::x++; 168*67e74705SXin Li } 169*67e74705SXin Li }; 170*67e74705SXin Li } 171