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