diff options
Diffstat (limited to 'test/SemaCXX/implicit-virtual-member-functions.cpp')
-rw-r--r-- | test/SemaCXX/implicit-virtual-member-functions.cpp | 74 |
1 files changed, 64 insertions, 10 deletions
diff --git a/test/SemaCXX/implicit-virtual-member-functions.cpp b/test/SemaCXX/implicit-virtual-member-functions.cpp index f88a55c3d5b4..319cad75864e 100644 --- a/test/SemaCXX/implicit-virtual-member-functions.cpp +++ b/test/SemaCXX/implicit-virtual-member-functions.cpp @@ -1,33 +1,87 @@ // 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 { // expected-error {{no suitable member 'operator delete' in 'B'}} +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); // expected-note {{'operator delete' declared here}} + void operator delete (void *, int); +#if __cplusplus <= 199711L +// expected-note@-2 {{'operator delete' declared here}} +#endif }; #ifdef MSABI -B b; // expected-note {{implicit destructor for 'B' first required here}} +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() { // expected-note {{implicit destructor for 'B' first required here}} +void B::f() { +#if __cplusplus <= 199711L +// expected-note@-2 {{implicit destructor for 'B' first required here}} +#endif } #endif -struct C : A { // expected-error {{no suitable member 'operator delete' in 'C'}} +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); // expected-note {{'operator delete' declared here}} + void operator delete(void *, int); +#if __cplusplus <= 199711L +// expected-note@-2 {{'operator delete' declared here}} +#endif }; -C::C() { } // expected-note {{implicit destructor for 'C' first required here}} +C::C() { } +#if __cplusplus <= 199711L +// expected-note@-2 {{implicit destructor for 'C' first required here}} +#endif -struct D : A { // expected-error {{no suitable member 'operator delete' in 'D'}} - void operator delete(void *, int); // expected-note {{'operator delete' declared here}} +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; // expected-note {{implicit destructor for 'D' first required here}} + new D; +#if __cplusplus <= 199711L +// expected-note@-2 {{implicit destructor for 'D' first required here}} +#endif } |