1 // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify -std=c++98 %s
2 // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify -std=c++98 %s
3 // RUN: %clang_cc1 -fsyntax-only -triple %itanium_abi_triple -verify -std=c++11 %s
4 // RUN: %clang_cc1 -fsyntax-only -triple %ms_abi_triple -DMSABI -verify -std=c++11 %s
6 typedef __typeof(sizeof(int)) size_t;
12 static void operator delete(void *p
) {};
16 class B
: protected A
{
21 class C
: protected B
{
23 using B::operator delete;
27 // Shouldn't have an error.
34 static void operator delete(void *p
) {};
38 class B
: protected A
{
40 static void operator delete(void *, size_t) {};
44 class C
: protected B
{
46 using A::operator delete;
47 using B::operator delete;
52 // We assume that the intent is to treat C::operator delete(void*, size_t) as
53 // /not/ being a usual deallocation function, as it would be if it were
54 // declared with in C directly.
58 void operator delete(void*); // expected-note {{member 'operator delete' declared here}}
59 void operator delete(void*, ...); // expected-note {{member 'operator delete' declared here}}
62 // FIXME: The standard doesn't say this is ill-formed, but presumably either
63 // it should be or the variadic operator delete should not be a usual
64 // deallocation function.
65 D::~D() {} // expected-error {{multiple suitable 'operator delete' functions in 'D'}}
68 // ...at the point of definition of a virtual destructor...
72 static void operator delete(void*, const int &);
77 static void operator delete(void*, const int &); // expected-note {{declared here}}
79 B::~B() {} // expected-error {{no suitable member 'operator delete' in 'B'}}
81 #if __cplusplus < 201103L
82 struct CBase
{ virtual ~CBase(); };
83 struct C
: CBase
{ // expected-error {{no suitable member 'operator delete' in 'C'}}
84 static void operator delete(void*, const int &); // expected-note {{declared here}}
87 C c
; // expected-note {{first required here}}
90 struct CBase
{ virtual ~CBase(); }; // expected-note {{overridden virtual function is here}}
91 struct C
: CBase
{ // expected-error {{deleted function '~C' cannot override a non-deleted function}} expected-note 2{{requires an unambiguous, accessible 'operator delete'}}
92 static void operator delete(void*, const int &);
95 C c
; // expected-error {{attempt to use a deleted function}}
104 // expected-error@+2 {{no suitable member 'operator delete' in 'A'}}
108 // expected-note@+2 {{declared here}}
110 static void operator delete(void*, const int &);
115 static void operator delete(void*);
120 // expected-note@+2 {{implicit default constructor for 'test3::B' first required here}}