new-delete.cpp revision 6e790ab61bf4835944971955e84279112833ef0c
172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// RUN: %clang_cc1 -fsyntax-only -verify %s 272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include <stddef.h> 472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstruct S // expected-note {{candidate}} 672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer{ 772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer S(int, int, double); // expected-note {{candidate}} 872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer S(double, int); // expected-note 2 {{candidate}} 972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer S(float, int); // expected-note 2 {{candidate}} 1072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}; 1172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstruct T; // expected-note{{forward declaration of 'struct T'}} 1272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstruct U 1372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer{ 1472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // A special new, to verify that the global version isn't used. 1572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer void* operator new(size_t, S*); // expected-note {{candidate}} 1672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}; 1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstruct V : U 1872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer{ 1972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}; 2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// PR5823 2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid* operator new(const size_t); // expected-note 2 {{candidate}} 2372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid* operator new(size_t, int*); // expected-note 3 {{candidate}} 2472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid* operator new(size_t, float*); // expected-note 3 {{candidate}} 2572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid* operator new(size_t, S); // expected-note 2 {{candidate}} 2672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid good_news() 2872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer{ 2972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer int *pi = new int; 3072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer float *pf = new (pi) float(); 3172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer pi = new int(1); 3272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer pi = new int('c'); 3372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const int *pci = new const int(); 3472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer S *ps = new S(1, 2, 3.4); 3572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ps = new (pf) (S)(1, 2, 3.4); 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines S *(*paps)[2] = new S*[*pi][2]; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ps = new (S[3])(1, 2, 3.4); 3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer typedef int ia4[4]; 3972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ia4 *pai = new (int[3][4]); 4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer pi = ::new int; 4172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer U *pu = new (ps) U; 4272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer V *pv = new (ps) V; 4372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines pi = new (S(1.0f, 2)) int; 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (void)new int[true]; 4772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 4872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 4972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstruct abstract { 5072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer virtual ~abstract() = 0; 5172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}; 5272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 5372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid bad_news(int *ip) 5472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer{ 5572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer int i = 1; 5672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new; // expected-error {{missing type specifier}} 574aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer (void)new 4; // expected-error {{missing type specifier}} 584aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer (void)new () int; // expected-error {{expected expression}} 5972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}} 6072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new int[1][i]; // expected-error {{only the first dimension}} 6172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new (int[1][i]); // expected-error {{only the first dimension}} 6272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new (int[i]); // expected-error {{when type is in parentheses}} 6372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new int(*(S*)0); // expected-error {{no viable conversion from 'struct S' to 'int'}} 6472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}} 6572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new S(1); // expected-error {{no matching constructor}} 6672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new S(1, 1); // expected-error {{call to constructor of 'struct S' is ambiguous}} 6772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new const int; // expected-error {{default initialization of an object of const type 'int const'}} 6872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new float*(ip); // expected-error {{cannot initialize a value of type 'float *' with an lvalue of type 'int *'}} 694aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer // Undefined, but clang should reject it directly. 7072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new int[-1]; // expected-error {{array size is negative}} 7172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumerated type, not 'struct S'}} 7272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)::S::new int; // expected-error {{expected unqualified-id}} 734aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}} 7472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}} 7572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // This must fail, because the member version shouldn't be found. 7672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}} 774aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer // This must fail, because any member version hides all global versions. 7872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new U; // expected-error {{no matching function for call to 'operator new'}} 7972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new (int[]); // expected-error {{array size must be specified in new expressions}} 8072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}} 8172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Some lacking cases due to lack of sema support. 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid good_deletes() 8572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer{ 8672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer delete (int*)0; 8772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer delete [](int*)0; 8872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer delete (S*)0; 8972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ::delete (int*)0; 904aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer} 9172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 924aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramervoid bad_deletes() 934aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer{ 944aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer delete 0; // expected-error {{cannot delete expression of type 'int'}} 9572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer delete [0] (int*)0; // expected-error {{expected ']'}} \ 964aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer // expected-note {{to match this '['}} 974aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer delete (void*)0; // expected-error {{cannot delete expression}} 9872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer delete (T*)0; // expected-warning {{deleting pointer to incomplete type}} 9972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ::S::delete (int*)0; // expected-error {{expected unqualified-id}} 1004aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer} 10172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 10272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerstruct X0 { }; 10372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 104struct X1 { 105 operator int*(); 106 operator float(); 107}; 108 109struct X2 { 110 operator int*(); // expected-note {{candidate function}} 111 operator float*(); // expected-note {{candidate function}} 112}; 113 114void test_delete_conv(X0 x0, X1 x1, X2 x2) { 115 delete x0; // expected-error{{cannot delete}} 116 delete x1; 117 delete x2; // expected-error{{ambiguous conversion of delete expression of type 'struct X2' to a pointer}} 118} 119 120// PR4782 121class X3 { 122public: 123 static void operator delete(void * mem, size_t size); 124}; 125 126class X4 { 127public: 128 static void release(X3 *x); 129 static void operator delete(void * mem, size_t size); 130}; 131 132 133void X4::release(X3 *x) { 134 delete x; 135} 136 137class X5 { 138public: 139 void Destroy() const { delete this; } 140}; 141 142class Base { 143public: 144 static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}} 145 static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}} 146}; 147 148class Tier {}; 149class Comp : public Tier {}; 150 151class Thai : public Base { 152public: 153 Thai(const Tier *adoptDictionary); 154}; 155 156void loadEngineFor() { 157 const Comp *dict; 158 new Thai(dict); 159} 160 161template <class T> struct TBase { 162 void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}}\ 163 // expected-error {{'operator new' takes type size_t}} 164}; 165 166// FIXME: We should not try to instantiate operator new, since it is invalid. 167TBase<int> t1; // expected-note {{in instantiation of template class 'struct TBase<int>' requested here}} 168 169class X6 { 170public: 171 static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 172}; 173 174class X7 { 175public: 176 static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 177}; 178 179class X8 : public X6, public X7 { 180}; 181 182void f(X8 *x8) { 183 delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}} 184} 185 186class X9 { 187 static void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 188 static void operator delete(void*, float); // expected-note {{'operator delete' declared here}} 189}; 190 191void f(X9 *x9) { 192 delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}} 193} 194 195struct X10 { 196 virtual ~X10(); 197}; 198 199struct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}} 200 void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 201}; 202 203void f() { 204 X11 x11; // expected-note {{implicit default destructor for 'struct X11' first required here}} 205} 206 207struct X12 { 208 void* operator new(size_t, void*); 209}; 210 211struct X13 : X12 { 212 using X12::operator new; 213}; 214 215static void* f(void* g) 216{ 217 return new (g) X13(); 218} 219