// 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 }