| // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify %s |
| // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify -std=c++98 %s |
| // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify -std=c++11 %s |
| // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify %s |
| // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify -std=c++98 %s |
| // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify -std=c++11 %s |
| // PR7800 |
| |
| // The Microsoft ABI doesn't have the concept of key functions, so we have different |
| // expectations about when functions are first required for that case. |
| |
| class NoDestroy { ~NoDestroy(); }; |
| #if __cplusplus <= 199711L |
| // expected-note@-2 3 {{declared private here}} |
| #ifdef MSABI |
| // expected-note@-4 3 {{declared private here}} |
| #endif |
| #endif |
| |
| struct A { |
| virtual ~A(); |
| #if __cplusplus >= 201103L |
| // expected-note@-2 3 {{overridden virtual function is here}} |
| #endif |
| }; |
| |
| struct B : public virtual A { |
| #if __cplusplus >= 201103L |
| // expected-error@-2 {{deleted function '~B' cannot override a non-deleted function}} |
| // expected-note@-3 {{overridden virtual function is here}} |
| #endif |
| |
| NoDestroy x; |
| #if __cplusplus <= 199711L |
| // expected-error@-2 {{field of type 'NoDestroy' has private destructor}} |
| #ifdef MSABI |
| // expected-error@-4 {{field of type 'NoDestroy' has private destructor}} |
| #endif |
| #else |
| // expected-note@-7 {{destructor of 'B' is implicitly deleted because field 'x' has an inaccessible destructor}} |
| #ifdef MSABI |
| // expected-note@-9 {{default constructor of 'B' is implicitly deleted because field 'x' has an inaccessible destructor}} |
| #endif |
| #endif |
| }; |
| |
| struct D : public virtual B { |
| #if __cplusplus <= 199711L |
| #ifdef MSABI |
| // expected-note@-3 {{implicit default constructor for 'B' first required here}} |
| // expected-note@-4 {{implicit destructor for 'B' first required here}} |
| #endif |
| #else |
| #ifdef MSABI |
| // expected-note@-8 {{default constructor of 'D' is implicitly deleted because base class 'B' has a deleted default constructor}} |
| #endif |
| #endif |
| virtual void foo(); |
| ~D(); |
| #if __cplusplus >= 201103L |
| //expected-error@-2 {{non-deleted function '~D' cannot override a deleted function}} |
| #endif |
| }; |
| |
| #ifdef MSABI |
| D d; |
| #if __cplusplus <= 199711L |
| // expected-note@-2 2{{implicit default constructor for 'D' first required here}} |
| #else |
| // expected-error@-4 {{call to implicitly-deleted default constructor of 'D'}} |
| #endif |
| #else |
| void D::foo() { |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'B' first required here}} |
| #endif |
| } |
| #endif |
| |
| struct E : public virtual A { |
| #if __cplusplus >= 201103L |
| // expected-error@-2 {{deleted function '~E' cannot override a non-deleted function}} |
| // expected-note@-3 {{overridden virtual function is here}} |
| #endif |
| |
| NoDestroy x; |
| #if __cplusplus <= 199711L |
| // expected-error@-2 {{field of type 'NoDestroy' has private destructor}} |
| #ifdef MSABI |
| // expected-error@-4 {{field of type 'NoDestroy' has private destructor}} |
| #endif |
| #else |
| // expected-note@-7 {{destructor of 'E' is implicitly deleted because field 'x' has an inaccessible destructor}} |
| #ifdef MSABI |
| // expected-note@-9 {{default constructor of 'E' is implicitly deleted because field 'x' has an inaccessible destructor}} |
| #endif |
| #endif |
| }; |
| |
| struct F : public E { |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'E' first required here}} |
| #ifdef MSABI |
| // expected-note@-4 {{implicit default constructor for 'E' first required here}} |
| #endif |
| #else |
| // expected-error@-7 {{non-deleted function '~F' cannot override a deleted function}} |
| // expected-note@-8 {{while declaring the implicit destructor for 'F'}} |
| // expected-note@-9 {{overridden virtual function is here}} |
| #ifdef MSABI |
| // expected-note@-11 {{default constructor of 'F' is implicitly deleted because base class 'E' has a deleted default constructor}} |
| #endif |
| #endif |
| }; |
| |
| |
| struct G : public virtual F { |
| #ifdef MSABI |
| #if __cplusplus <= 199711L |
| // expected-note@-3 {{implicit default constructor for 'F' first required here}} |
| // expected-note@-4 {{implicit destructor for 'F' first required here}} |
| #else |
| // expected-note@-6 {{default constructor of 'G' is implicitly deleted because base class 'F' has a deleted default constructor}} |
| #endif |
| #endif |
| |
| virtual void foo(); |
| ~G(); |
| #if __cplusplus >= 201103L |
| //expected-error@-2 {{non-deleted function '~G' cannot override a deleted function}} |
| #endif |
| }; |
| |
| #ifdef MSABI |
| G g; |
| #if __cplusplus <= 199711L |
| // expected-note@-2 2{{implicit default constructor for 'G' first required here}} |
| #else |
| // expected-error@-4 {{call to implicitly-deleted default constructor of 'G'}} |
| #endif |
| #else |
| void G::foo() { |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'F' first required here}} |
| #endif |
| } |
| #endif |
| |
| struct H : public virtual A { |
| #if __cplusplus >= 201103L |
| // expected-error@-2 {{deleted function '~H' cannot override a non-deleted function}} |
| // expected-note@-3 {{overridden virtual function is here}} |
| #endif |
| |
| NoDestroy x; |
| #if __cplusplus <= 199711L |
| // expected-error@-2 {{field of type 'NoDestroy' has private destructor}} |
| #ifdef MSABI |
| // expected-error@-4 {{field of type 'NoDestroy' has private destructor}} |
| #endif |
| #else |
| // expected-note@-7 {{destructor of 'H' is implicitly deleted because field 'x' has an inaccessible destructor}} |
| #ifdef MSABI |
| // expected-note@-9 {{default constructor of 'H' is implicitly deleted because field 'x' has an inaccessible destructor}} |
| #endif |
| #endif |
| }; |
| |
| struct I : public virtual H { |
| #ifdef MSABI |
| #if __cplusplus > 199711L |
| // expected-note@-3 {{default constructor of 'I' is implicitly deleted because base class 'H' has a deleted default constructor}} |
| #endif |
| #endif |
| |
| ~I(); |
| #if __cplusplus >= 201103L |
| // expected-error@-2 {{non-deleted function '~I' cannot override a deleted function}} |
| #endif |
| }; |
| |
| struct J : public I { |
| #ifdef MSABI |
| #if __cplusplus <= 199711L |
| // expected-note@-3 {{implicit default constructor for 'H' first required here}} |
| // expected-note@-4 {{implicit destructor for 'H' first required here}} |
| #else |
| // expected-note@-6 {{default constructor of 'J' is implicitly deleted because base class 'I' has a deleted default constructor}} |
| #endif |
| #endif |
| |
| virtual void foo(); |
| ~J(); |
| }; |
| |
| #ifdef MSABI |
| J j; |
| #if __cplusplus <= 199711L |
| // expected-note@-2 2{{implicit default constructor for 'J' first required here}} |
| #else |
| // expected-error@-4 {{call to implicitly-deleted default constructor of 'J'}} |
| #endif |
| |
| #else |
| void J::foo() { |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'H' first required here}} |
| #endif |
| } |
| #endif |