brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 47d0f02 Raw
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