| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s |
| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| |
| struct A { |
| virtual ~A(); |
| #if __cplusplus >= 201103L |
| // expected-note@-2 2 {{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'}} |
| #endif |
| B() { } |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'B' first required here}} |
| #endif |
| |
| void operator delete(void *, int); |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{'operator delete' declared here}} |
| #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 |
| void operator delete(void *, int); |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{'operator delete' declared here}} |
| #endif |
| }; |
| |
| void f() { |
| (void)new B; |
| (void)new C; |
| #if __cplusplus <= 199711L |
| // expected-note@-2 {{implicit destructor for 'C' first required here}} |
| #endif |
| } |
| |
| // Make sure that the key-function computation is consistent when the |
| // first virtual member function of a nested class has an inline body. |
| struct Outer { |
| struct Inner { |
| virtual void f() { } |
| void g(); |
| }; |
| }; |
| |
| void Outer::Inner::g() { } |