Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify %s
      2 // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify %s
      3 // PR7800
      4 
      5 // The Microsoft ABI doesn't have the concept of key functions, so we have different
      6 // expectations about when functions are first required for that case.
      7 
      8 #ifdef MSABI
      9 // expected-note@+2 3 {{declared private here}}
     10 #endif
     11 class NoDestroy { ~NoDestroy(); }; // expected-note 3 {{declared private here}}
     12 struct A {
     13   virtual ~A();
     14 };
     15 
     16 #ifdef MSABI
     17 // expected-error@+3 {{field of type 'NoDestroy' has private destructor}}
     18 #endif
     19 struct B : public virtual A {
     20   NoDestroy x; // expected-error {{field of type 'NoDestroy' has private destructor}}
     21 };
     22 #ifdef MSABI
     23 // expected-note@+3 {{implicit default constructor for 'B' first required here}}
     24 // expected-note@+2 {{implicit destructor for 'B' first required here}}
     25 #endif
     26 struct D : public virtual B {
     27   virtual void foo();
     28   ~D();
     29 };
     30 #ifdef MSABI
     31 D d; // expected-note {{implicit default constructor for 'D' first required here}}
     32 #else
     33 void D::foo() { // expected-note {{implicit destructor for 'B' first required here}}
     34 }
     35 #endif
     36 
     37 #ifdef MSABI
     38 // expected-error@+3 {{field of type 'NoDestroy' has private destructor}}
     39 #endif
     40 struct E : public virtual A {
     41   NoDestroy x; // expected-error {{field of type 'NoDestroy' has private destructor}}
     42 };
     43 #ifdef MSABI
     44 // expected-note@+2 {{implicit default constructor for 'E' first required here}}
     45 #endif
     46 struct F : public E { // expected-note {{implicit destructor for 'E' first required here}}
     47 };
     48 #ifdef MSABI
     49 // expected-note@+2 {{implicit default constructor for 'F' first required here}}
     50 #endif
     51 struct G : public virtual F {
     52   virtual void foo();
     53   ~G();
     54 };
     55 #ifdef MSABI
     56 G g; // expected-note {{implicit default constructor for 'G' first required here}}
     57 #else
     58 void G::foo() { // expected-note {{implicit destructor for 'F' first required here}}
     59 }
     60 #endif
     61 
     62 #ifdef MSABI
     63 // expected-note@+3 {{'H' declared here}}
     64 // expected-error@+3 {{field of type 'NoDestroy' has private destructor}}
     65 #endif
     66 struct H : public virtual A {
     67   NoDestroy x; // expected-error {{field of type 'NoDestroy' has private destructor}}
     68 };
     69 #ifdef MSABI
     70 // expected-error@+3 {{implicit default constructor for 'I' must explicitly initialize the base class 'H' which does not have a default constructor}}
     71 // expected-note@+2 {{implicit destructor for 'H' first required here}}
     72 #endif
     73 struct I : public virtual H {
     74   ~I();
     75 };
     76 #ifdef MSABI
     77 // expected-note@+3 {{implicit default constructor for 'H' first required here}}
     78 // expected-note@+2 {{implicit default constructor for 'I' first required here}}
     79 #endif
     80 struct J : public I {
     81   virtual void foo();
     82   ~J();
     83 };
     84 #ifdef MSABI
     85 J j; // expected-note {{implicit default constructor for 'J' first required here}}
     86 #else
     87 void J::foo() { // expected-note {{implicit destructor for 'H' first required here}}
     88 }
     89 #endif
     90