1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li namespace T1 { 3*67e74705SXin Li 4*67e74705SXin Li class A { }; 5*67e74705SXin Li class B : private A { }; // expected-note {{declared private here}} 6*67e74705SXin Li f(B * b)7*67e74705SXin Livoid f(B* b) { 8*67e74705SXin Li A *a = b; // expected-error{{cannot cast 'T1::B' to its private base class 'T1::A'}} 9*67e74705SXin Li } 10*67e74705SXin Li 11*67e74705SXin Li } 12*67e74705SXin Li 13*67e74705SXin Li namespace T2 { 14*67e74705SXin Li 15*67e74705SXin Li class A { }; 16*67e74705SXin Li class B : A { }; // expected-note {{implicitly declared private here}} 17*67e74705SXin Li f(B * b)18*67e74705SXin Livoid f(B* b) { 19*67e74705SXin Li A *a = b; // expected-error {{cannot cast 'T2::B' to its private base class 'T2::A'}} 20*67e74705SXin Li } 21*67e74705SXin Li 22*67e74705SXin Li } 23*67e74705SXin Li 24*67e74705SXin Li namespace T3 { 25*67e74705SXin Li 26*67e74705SXin Li class A { }; 27*67e74705SXin Li class B : public A { }; 28*67e74705SXin Li f(B * b)29*67e74705SXin Livoid f(B* b) { 30*67e74705SXin Li A *a = b; 31*67e74705SXin Li } 32*67e74705SXin Li 33*67e74705SXin Li } 34*67e74705SXin Li 35*67e74705SXin Li namespace T4 { 36*67e74705SXin Li 37*67e74705SXin Li class A {}; 38*67e74705SXin Li 39*67e74705SXin Li class B : private virtual A {}; 40*67e74705SXin Li class C : public virtual A {}; 41*67e74705SXin Li 42*67e74705SXin Li class D : public B, public C {}; 43*67e74705SXin Li f(D * d)44*67e74705SXin Livoid f(D *d) { 45*67e74705SXin Li // This takes the D->C->B->A path. 46*67e74705SXin Li A *a = d; 47*67e74705SXin Li } 48*67e74705SXin Li 49*67e74705SXin Li } 50*67e74705SXin Li 51*67e74705SXin Li namespace T5 { 52*67e74705SXin Li class A {}; 53*67e74705SXin Li 54*67e74705SXin Li class B : private A { f(B * b)55*67e74705SXin Li void f(B *b) { 56*67e74705SXin Li A *a = b; 57*67e74705SXin Li } 58*67e74705SXin Li }; 59*67e74705SXin Li } 60*67e74705SXin Li 61*67e74705SXin Li namespace T6 { 62*67e74705SXin Li class C; 63*67e74705SXin Li 64*67e74705SXin Li class A {}; // expected-note{{member is declared here}} 65*67e74705SXin Li 66*67e74705SXin Li class B : private A { // expected-note {{declared private here}} expected-note {{constrained by private inheritance here}} 67*67e74705SXin Li void f(C* c); 68*67e74705SXin Li }; 69*67e74705SXin Li 70*67e74705SXin Li class C : public B { f(C * c)71*67e74705SXin Li void f(C *c) { 72*67e74705SXin Li A* a = c; // expected-error {{cannot cast 'T6::C' to its private base class 'T6::A'}} \ 73*67e74705SXin Li // expected-error {{'A' is a private member of 'T6::A'}} 74*67e74705SXin Li } 75*67e74705SXin Li }; 76*67e74705SXin Li f(C * c)77*67e74705SXin Li void B::f(C *c) { 78*67e74705SXin Li A *a = c; 79*67e74705SXin Li } 80*67e74705SXin Li } 81*67e74705SXin Li 82*67e74705SXin Li namespace T7 { 83*67e74705SXin Li class A {}; 84*67e74705SXin Li class B : public A {}; 85*67e74705SXin Li class C : private B { f(C * c)86*67e74705SXin Li void f(C *c) { 87*67e74705SXin Li A* a = c; // okay 88*67e74705SXin Li } 89*67e74705SXin Li }; 90*67e74705SXin Li } 91*67e74705SXin Li 92