118 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2namespace T1 {3 4class A { };5class B : private A { }; // expected-note {{declared private here}}6 7void f(B* b) {8 A *a = b; // expected-error{{cannot cast 'B' to its private base class 'A'}}9}10 11}12 13namespace T2 { 14 15class A { };16class B : A { }; // expected-note {{implicitly declared private here}}17 18void f(B* b) {19 A *a = b; // expected-error {{cannot cast 'B' to its private base class 'A'}}20}21 22}23 24namespace T3 {25 26class A { };27class B : public A { }; 28 29void f(B* b) {30 A *a = b;31}32 33}34 35namespace T4 {36 37class A {};38 39class B : private virtual A {};40class C : public virtual A {};41 42class D : public B, public C {};43 44void f(D *d) {45 // This takes the D->C->B->A path.46 A *a = d;47}48 49}50 51namespace T5 {52 class A {};53 54 class B : private A {55 void f(B *b) {56 A *a = b;57 }58 }; 59}60 61namespace T6 {62 class C;63 64 class A {}; // expected-note{{member is declared here}}65 66 class B : private A { // expected-note {{declared private here}} expected-note {{constrained by private inheritance here}}67 void f(C* c);68 };69 70 class C : public B { 71 void f(C *c) {72 A* a = c; // expected-error {{cannot cast 'C' to its private base class 'A'}} \73 // expected-error {{'A' is a private member of 'T6::A'}}74 }75 };76 77 void B::f(C *c) {78 A *a = c;79 }80}81 82namespace T7 {83 class A {};84 class B : public A {};85 class C : private B { 86 void f(C *c) {87 A* a = c; // okay88 }89 };90}91 92namespace T8 {93template <int>94struct flag {95 static constexpr bool value = true;96};97 98template <class T>99struct trait : flag<sizeof(T)> {}; // expected-note 2{{here}}100 101template <class T, bool Inferred = trait<T>::value> // expected-note {{here}}102struct a {};103 104template <class T>105class b {106 a<T> x; // expected-note {{here}}107 using U = a<T>;108};109 110template <int>111struct Impossible {112 static_assert(false, ""); // expected-error {{static assertion failed}}113};114 115// verify "no member named 'value'" bogus diagnostic is not emitted.116trait<b<Impossible<0>>>::value; // expected-note {{here}}117} // namespace T8118