1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4 5 struct A { 6 virtual ~A(); 7 #if __cplusplus >= 201103L 8 // expected-note@-2 2 {{overridden virtual function is here}} 9 #endif 10 }; 11 12 struct B : A { 13 #if __cplusplus <= 199711L 14 // expected-error@-2 {{no suitable member 'operator delete' in 'B'}} 15 #else 16 // expected-error@-4 {{deleted function '~B' cannot override a non-deleted function}} 17 // expected-note@-5 {{virtual destructor requires an unambiguous, accessible 'operator delete'}} 18 #endif 19 B() { } 20 #if __cplusplus <= 199711L 21 // expected-note@-2 {{implicit destructor for 'B' first required here}} 22 #endif 23 24 void operator delete(void *, int); 25 #if __cplusplus <= 199711L 26 // expected-note@-2 {{'operator delete' declared here}} 27 #endif 28 }; 29 30 struct C : A { 31 #if __cplusplus <= 199711L 32 // expected-error@-2 {{no suitable member 'operator delete' in 'C'}} 33 #else 34 // expected-error@-4 {{deleted function '~C' cannot override a non-deleted function}} 35 // expected-note@-5 {{virtual destructor requires an unambiguous, accessible 'operator delete'}} 36 #endif 37 void operator delete(void *, int); 38 #if __cplusplus <= 199711L 39 // expected-note@-2 {{'operator delete' declared here}} 40 #endif 41 }; 42 43 void f() { 44 (void)new B; 45 (void)new C; 46 #if __cplusplus <= 199711L 47 // expected-note@-2 {{implicit destructor for 'C' first required here}} 48 #endif 49 } 50 51 // Make sure that the key-function computation is consistent when the 52 // first virtual member function of a nested class has an inline body. 53 struct Outer { 54 struct Inner { 55 virtual void f() { } 56 void g(); 57 }; 58 }; 59 60 void Outer::Inner::g() { } 61