// RUN: %clang_cc1 -verify %s namespace test0 { struct A { static int x; }; struct B : A {}; struct C : B {}; int test() { return A::x + B::x + C::x; } } namespace test1 { struct A { private: static int x; // expected-note 5 {{declared private here}} static int test() { return x; } }; struct B : public A { static int test() { return x; } // expected-error {{private member}} }; struct C : private A { static int test() { return x; } // expected-error {{private member}} }; struct D { public: static int x; // expected-note{{member is declared here}} static int test() { return x; } }; struct E : private D { // expected-note{{constrained by private inheritance}} static int test() { return x; } }; int test() { return A::x // expected-error {{private member}} + B::x // expected-error {{private member}} + C::x // expected-error {{private member}} + D::x + E::x; // expected-error {{private member}} } } namespace test2 { class A { protected: static int x; // expected-note{{member is declared here}} }; class B : private A {}; // expected-note {{private inheritance}} class C : private A { int test(B *b) { return b->x; // expected-error {{private member}} } }; } namespace test3 { class A { protected: static int x; }; class B : public A {}; class C : private A { int test(B *b) { // x is accessible at C when named in A. // A is an accessible base of B at C. // Therefore this succeeds. return b->x; } }; } // TODO: flesh out these cases