| // 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 |
| |
| struct A { |
| virtual ~A(); |
| #if __cplusplus >= 201103L |
| // expected-note@-2 3 {{overridden virtual function is here}} |
| #endif |
| }; |
| |
| struct B : A { |
| #if __cplusplus <= 199711L |
| // expected-error@-2 {{no suitable member 'operator delete' in 'B'}} |
| #else |
| // expected-error@-4 {{deleted function '~B' cannot override a non-deleted function}} |
| // expected-note@-5 {{virtual destructor requires an unambiguous, accessible 'operator delete'}} |
| #ifdef MSABI |
| // expected-note@-7 {{virtual destructor requires an unambiguous, accessible 'operator delete'}} |
| #endif |
| #endif |
| virtual void f(); |
| |
| void operator delete (void *, int); |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{'operator delete' declared here}} |
| #endif |
| }; |
| |
| #ifdef MSABI |
| B b; |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'B' first required here}} |
| #else |
| // expected-error@-4 {{attempt to use a deleted function}} |
| #endif |
| |
| #else |
| void B::f() { |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'B' first required here}} |
| #endif |
| } |
| #endif |
| |
| struct C : A { |
| #if __cplusplus <= 199711L |
| // expected-error@-2 {{no suitable member 'operator delete' in 'C'}} |
| #else |
| // expected-error@-4 {{deleted function '~C' cannot override a non-deleted function}} |
| // expected-note@-5 {{virtual destructor requires an unambiguous, accessible 'operator delete'}} |
| #endif |
| |
| C(); |
| void operator delete(void *, int); |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{'operator delete' declared here}} |
| #endif |
| }; |
| |
| C::C() { } |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'C' first required here}} |
| #endif |
| |
| struct D : A { |
| #if __cplusplus <= 199711L |
| // expected-error@-2 {{no suitable member 'operator delete' in 'D'}} |
| #else |
| // expected-error@-4 {{deleted function '~D' cannot override a non-deleted function}} |
| // expected-note@-5 {{virtual destructor requires an unambiguous, accessible 'operator delete'}} |
| #endif |
| void operator delete(void *, int); |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{'operator delete' declared here}} |
| #endif |
| }; |
| |
| void f() { |
| new D; |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'D' first required here}} |
| #endif |
| } |