new-delete.cpp revision 7002f4c03c2d0544f4e8bea8d3a5636519081e35
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// RUN: %clang_cc1 -fsyntax-only -verify %s 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <stddef.h> 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct S // expected-note {{candidate}} 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov S(int, int, double); // expected-note {{candidate}} 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov S(double, int); // expected-note 2 {{candidate}} 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov S(float, int); // expected-note 2 {{candidate}} 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct T; // expected-note{{forward declaration of 'T'}} 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct U 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // A special new, to verify that the global version isn't used. 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new(size_t, S*); // expected-note {{candidate}} 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct V : U 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PR5823 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(const size_t); // expected-note 2 {{candidate}} 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(size_t, int*); // expected-note 3 {{candidate}} 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(size_t, float*); // expected-note 3 {{candidate}} 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(size_t, S); // expected-note 2 {{candidate}} 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid good_news() 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int *pi = new int; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov float *pf = new (pi) float(); 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pi = new int(1); 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pi = new int('c'); 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const int *pci = new const int(); 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov S *ps = new S(1, 2, 3.4); 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ps = new (pf) (S)(1, 2, 3.4); 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov S *(*paps)[2] = new S*[*pi][2]; 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ps = new (S[3])(1, 2, 3.4); 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov typedef int ia4[4]; 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ia4 *pai = new (int[3][4]); 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pi = ::new int; 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov U *pu = new (ps) U; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov V *pv = new (ps) V; 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pi = new (S(1.0f, 2)) int; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int[true]; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct abstract { 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual ~abstract() = 0; 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid bad_news(int *ip) 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i = 1; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new; // expected-error {{missing type specifier}} 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new 4; // expected-error {{missing type specifier}} 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new () int; // expected-error {{expected expression}} 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}} 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int[1][i]; // expected-error {{only the first dimension}} 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new (int[1][i]); // expected-error {{only the first dimension}} 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new (int[i]); // expected-error {{when type is in parentheses}} 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int(*(S*)0); // expected-error {{no viable conversion from 'S' to 'int'}} 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}} 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new S(1); // expected-error {{no matching constructor}} 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}} 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new const int; // expected-error {{default initialization of an object of const type 'int const'}} 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new float*(ip); // expected-error {{cannot initialize a new value of type 'float *' with an lvalue of type 'int *'}} 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Undefined, but clang should reject it directly. 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int[-1]; // expected-error {{array size is negative}} 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumerated type, not 'S'}} 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)::S::new int; // expected-error {{expected unqualified-id}} 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}} 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}} 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // This must fail, because the member version shouldn't be found. 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}} 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // This must fail, because any member version hides all global versions. 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new U; // expected-error {{no matching function for call to 'operator new'}} 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new (int[]); // expected-error {{array size must be specified in new expressions}} 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}} 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // Some lacking cases due to lack of sema support. 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid good_deletes() 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (int*)0; 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete [](int*)0; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (S*)0; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::delete (int*)0; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid bad_deletes() 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete 0; // expected-error {{cannot delete expression of type 'int'}} 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete [0] (int*)0; // expected-error {{expected ']'}} \ 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov // expected-note {{to match this '['}} 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (void*)0; // expected-error {{cannot delete expression}} 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete (T*)0; // expected-warning {{deleting pointer to incomplete type}} 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ::S::delete (int*)0; // expected-error {{expected unqualified-id}} 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X0 { }; 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X1 { 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov operator int*(); 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov operator float(); 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X2 { 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov operator int*(); // expected-note {{candidate function}} 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov operator float*(); // expected-note {{candidate function}} 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid test_delete_conv(X0 x0, X1 x1, X2 x2) { 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete x0; // expected-error{{cannot delete}} 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete x1; 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete x2; // expected-error{{ambiguous conversion of delete expression of type 'X2' to a pointer}} 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PR4782 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X3 { 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void operator delete(void * mem, size_t size); 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X4 { 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void release(X3 *x); 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void operator delete(void * mem, size_t size); 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid X4::release(X3 *x) { 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete x; 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X5 { 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void Destroy() const { delete this; } 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Base { 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}} 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}} 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Tier {}; 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Comp : public Tier {}; 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Thai : public Base { 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Thai(const Tier *adoptDictionary); 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid loadEngineFor() { 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov const Comp *dict; 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov new Thai(dict); 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate <class T> struct TBase { 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}} 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTBase<int> t1; 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X6 { 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X7 { 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X8 : public X6, public X7 { 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f(X8 *x8) { 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}} 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X9 { 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void operator delete(void*, float); // expected-note {{'operator delete' declared here}} 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f(X9 *x9) { 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}} 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X10 { 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov virtual ~X10(); 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}} 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f() { 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov X11 x11; // expected-note {{implicit default destructor for 'X11' first required here}} 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X12 { 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* operator new(size_t, void*); 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X13 : X12 { 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov using X12::operator new; 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void* f(void* g) 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return new (g) X13(); 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X14 { 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic: 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static void operator delete(void*, const size_t); 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f(X14 *x14a, X14 *x14b) { 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete x14a; 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace PR5918 { // Look for template operator new overloads. 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov struct S { template<typename T> static void* operator new(size_t, T); }; 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void test() { 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)new(0) S; 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov