access-base-class.cpp revision 6e98fd68651a7da7a20015894749e9480c5ea160
1// RUN: clang-cc -fsyntax-only -verify %s 2namespace T1 { 3 4class A { }; 5class B : private A { }; // expected-note {{'private' inheritance specifier here}} 6 7void f(B* b) { 8 A *a = b; // expected-error{{conversion from 'class T1::B' to inaccessible base class 'class T1::A'}} \ 9 expected-error{{incompatible type initializing 'class T1::B *', expected 'class T1::A *'}} 10} 11 12} 13 14namespace T2 { 15 16class A { }; 17class B : A { }; // expected-note {{inheritance is implicitly 'private'}} 18 19void f(B* b) { 20 A *a = b; // expected-error {{conversion from 'class T2::B' to inaccessible base class 'class T2::A'}} \ 21 expected-error {{incompatible type initializing 'class T2::B *', expected 'class T2::A *'}} 22} 23 24} 25 26namespace T3 { 27 28class A { }; 29class B : public A { }; 30 31void f(B* b) { 32 A *a = b; 33} 34 35} 36 37namespace T4 { 38 39class A {}; 40 41class B : private virtual A {}; 42class C : public virtual A {}; 43 44class D : public B, public C {}; 45 46void f(D *d) { 47 // This takes the D->C->B->A path. 48 A *a = d; 49} 50 51} 52 53namespace T5 { 54 class A {}; 55 56 class B : private A { 57 void f(B *b) { 58 A *a = b; 59 } 60 }; 61} 62 63namespace T6 { 64 class C; 65 66 class A {}; 67 68 class B : private A { // expected-note {{'private' inheritance specifier here}} 69 void f(C* c); 70 }; 71 72 class C : public B { 73 void f(C *c) { 74 A* a = c; // expected-error {{conversion from 'class T6::C' to inaccessible base class 'class T6::A'}} \ 75 expected-error {{incompatible type initializing 'class T6::C *', expected 'class T6::A *'}} 76 } 77 }; 78 79 void B::f(C *c) { 80 A *a = c; 81 } 82} 83 84namespace T7 { 85 86class C; 87class A { }; 88class B : protected A { // expected-note {{'protected' inheritance specifier here}} 89 void f(C *); 90}; 91 92class C : protected B { // expected-note {{'protected' inheritance specifier here}} 93 void f(C *c) { 94 A* a = c; 95 } 96}; 97 98void B::f(C *c) { 99 A *a = c; // expected-error {{conversion from 'class T7::C' to inaccessible base class 'class T7::A'}} \ 100 expected-error {{incompatible type initializing 'class T7::C *', expected 'class T7::A *'}} 101} 102 103class D : private C { 104 void f(D *d) { 105 A *a = d; 106 } 107}; 108 109void f(B* b) { 110 A *a = b; // expected-error {{conversion from 'class T7::B' to inaccessible base class 'class T7::A'}} \ 111 expected-error {{incompatible type initializing 'class T7::B *', expected 'class T7::A *'}} 112} 113 114} 115