| // RUN: %clang_cc1 -fsyntax-only -verify %s | 
 | namespace T1 { | 
 |    | 
 | class A { }; | 
 | class B : private A { }; // expected-note {{declared private here}} | 
 |  | 
 | void f(B* b) { | 
 |   A *a = b; // expected-error{{cannot cast 'T1::B' to its private base class 'T1::A'}} | 
 | } | 
 |  | 
 | } | 
 |  | 
 | namespace T2 {  | 
 |  | 
 | class A { }; | 
 | class B : A { }; // expected-note {{implicitly declared private here}} | 
 |  | 
 | void f(B* b) { | 
 |   A *a = b; // expected-error {{cannot cast 'T2::B' to its private base class 'T2::A'}} | 
 | } | 
 |  | 
 | } | 
 |  | 
 | namespace T3 { | 
 |  | 
 | class A { }; | 
 | class B : public A { };  | 
 |  | 
 | void f(B* b) { | 
 |   A *a = b; | 
 | } | 
 |  | 
 | } | 
 |  | 
 | namespace T4 { | 
 |  | 
 | class A {}; | 
 |  | 
 | class B : private virtual A {}; | 
 | class C : public virtual A {}; | 
 |  | 
 | class D : public B, public C {}; | 
 |  | 
 | void f(D *d) { | 
 |   // This takes the D->C->B->A path. | 
 |   A *a = d; | 
 | } | 
 |  | 
 | } | 
 |  | 
 | namespace T5 { | 
 |   class A {}; | 
 |      | 
 |   class B : private A { | 
 |     void f(B *b) { | 
 |       A *a = b; | 
 |     } | 
 |   };     | 
 | } | 
 |  | 
 | namespace T6 { | 
 |   class C; | 
 |    | 
 |   class A {}; // expected-note{{member is declared here}} | 
 |    | 
 |   class B : private A { // expected-note {{declared private here}} expected-note {{constrained by private inheritance here}} | 
 |     void f(C* c); | 
 |   }; | 
 |    | 
 |   class C : public B {  | 
 |     void f(C *c) { | 
 |       A* a = c; // expected-error {{cannot cast 'T6::C' to its private base class 'T6::A'}} \ | 
 |                 // expected-error {{'A' is a private member of 'T6::A'}} | 
 |     } | 
 |   }; | 
 |    | 
 |   void B::f(C *c) { | 
 |     A *a = c; | 
 |   } | 
 | } | 
 |  | 
 | namespace T7 { | 
 |   class A {}; | 
 |   class B : public A {}; | 
 |   class C : private B {  | 
 |     void f(C *c) { | 
 |       A* a = c; // okay | 
 |     } | 
 |   }; | 
 | } | 
 |  |