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
BB19   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 
f()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 {
fOuter::Inner55     virtual void f() { }
56     void g();
57   };
58 };
59 
g()60 void Outer::Inner::g() { }
61