1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify -fexceptions %s 2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotypedef __SIZE_TYPE__ size_t; 3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Overloaded operator delete with two arguments 5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I> 6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0 { 7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X0(); 8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t); 9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void operator delete(void*, size_t) { 10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = I; // expected-error{{cannot initialize}} 11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X0() { 15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new X0<1>; // expected-note{{instantiation}} 16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Overloaded operator delete with one argument 19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I> 20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X1 { 21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X1(); 22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t); 24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void operator delete(void*) { 25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = I; // expected-error{{cannot initialize}} 26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X1() { 30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new X1<1>; // expected-note{{instantiation}} 31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Overloaded operator delete for placement new 34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I> 35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X2 { 36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X2(); 37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t, double, double); 39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t, int, int); 40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void operator delete(void*, const int, int) { 42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = I; // expected-error{{cannot initialize}} 43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void operator delete(void*, double, double); 46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X2() { 49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new (0, 0) X2<1>; // expected-note{{instantiation}} 50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new 53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X3 { 54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X3(); 55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t, double, double); 57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<typename T> 59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void operator delete(void*, T x, T) { 60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao double *dp = &x; 61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = &x; // expected-error{{cannot initialize}} 62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 64ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 65ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X3() { 66ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new (0, 0) X3; // expected-note{{instantiation}} 67ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 68ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 69ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new in global scope. 70ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X4 { 71ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X4(); 72ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t, double, double); 73ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 74ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 75ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T> 76ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator delete(void*, T x, T) { 77ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao double *dp = &x; 78ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = &x; // expected-error{{cannot initialize}} 79ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 80ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 81ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X4() { 82ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new (0, 0) X4; // expected-note{{instantiation}} 83ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 84ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 85ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Useless operator delete hides global operator delete template. 86ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X5 { 87ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X5(); 88ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t, double, double); 89ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void operator delete(void*, double*, double*); 90ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 91ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 92ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X5() { 93ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new (0, 0) X5; // okay, we found X5::operator delete but didn't pick it 94ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 95ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 96ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new 97ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I> 98ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X6 { 99ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao X6(); 100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t) { 102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return I; // expected-error{{cannot initialize}} 103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void operator delete(void*) { 106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = I; // expected-error{{cannot initialize}} 107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X6() { 111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new X6<3>; // expected-note 2{{instantiation}} 112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid *operator new(size_t, double, double, double); 115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T> 117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator delete(void*, T x, T, T) { 118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao double *dp = &x; 119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = &x; // expected-error{{cannot initialize}} 120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_int_new() { 122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new (1.0, 1.0, 1.0) int; // expected-note{{instantiation}} 123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// We don't need an operator delete if the type has a trivial 126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// constructor, since we know that constructor cannot throw. 127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// FIXME: Is this within the standard? Seems fishy, but both EDG+GCC do it. 128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#if 0 129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I> 130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X7 { 131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void* operator new(size_t); 132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void operator delete(void*, size_t) { 133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao int *ip = I; // okay, since it isn't instantiated. 134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X7() { 138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao new X7<1>; 139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#endif 141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 142