new-delete.cpp revision 0ba63ea5be2c90ef62d1350ea4a0a0c415a785f1
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// RUN: clang-cc -fsyntax-only -verify %s 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stddef.h> 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct S // expected-note {{candidate}} 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S(int, int, double); // expected-note {{candidate}} 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S(double, int); // expected-note 2 {{candidate}} 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S(float, int); // expected-note 2 {{candidate}} 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct T; // expected-note{{forward declaration of 'struct T'}} 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct U 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // A special new, to verify that the global version isn't used. 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org void* operator new(size_t, S*); // expected-note {{candidate}} 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct V : U 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid* operator new(size_t); // expected-note 2 {{candidate}} 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid* operator new(size_t, int*); // expected-note 3 {{candidate}} 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid* operator new(size_t, float*); // expected-note 3 {{candidate}} 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid* operator new(size_t, S); // expected-note 2 {{candidate}} 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid good_news() 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int *pi = new int; 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org float *pf = new (pi) float(); 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pi = new int(1); 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pi = new int('c'); 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int *pci = new const int(); 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S *ps = new S(1, 2, 3.4); 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ps = new (pf) (S)(1, 2, 3.4); 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S *(*paps)[2] = new S*[*pi][2]; 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ps = new (S[3])(1, 2, 3.4); 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typedef int ia4[4]; 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ia4 *pai = new (int[3][4]); 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pi = ::new int; 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org U *pu = new (ps) U; 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org V *pv = new (ps) V; 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pi = new (S(1.0f, 2)) int; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int[true]; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct abstract { 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org virtual ~abstract() = 0; 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid bad_news(int *ip) 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i = 1; 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new; // expected-error {{missing type specifier}} 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new 4; // expected-error {{missing type specifier}} 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new () int; // expected-error {{expected expression}} 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}} 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int[1][i]; // expected-error {{only the first dimension}} 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new (int[1][i]); // expected-error {{only the first dimension}} 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new (int[i]); // expected-error {{when type is in parentheses}} 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int(*(S*)0); // expected-error {{incompatible type initializing}} 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int(1, 2); // expected-error {{initializer of a builtin type can only take one argument}} 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new S(1); // expected-error {{no matching constructor}} 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}} 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new const int; // expected-error {{must provide an initializer}} 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new float*(ip); // expected-error {{incompatible type initializing 'int *', expected 'float *'}} 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Undefined, but clang should reject it directly. 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int[-1]; // expected-error {{array size is negative}} 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumerated type, not 'struct S'}} 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)::S::new int; // expected-error {{expected unqualified-id}} 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}} 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}} 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This must fail, because the member version shouldn't be found. 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}} 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // This must fail, because any member version hides all global versions. 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new U; // expected-error {{no matching function for call to 'operator new'}} 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new (int[]); // expected-error {{array size must be specified in new expressions}} 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}} 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Some lacking cases due to lack of sema support. 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid good_deletes() 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete (int*)0; 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete [](int*)0; 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete (S*)0; 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ::delete (int*)0; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid bad_deletes() 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete 0; // expected-error {{cannot delete expression of type 'int'}} 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete [0] (int*)0; // expected-error {{expected ']'}} \ 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // expected-note {{to match this '['}} 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete (void*)0; // expected-error {{cannot delete expression}} 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete (T*)0; // expected-warning {{deleting pointer to incomplete type}} 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ::S::delete (int*)0; // expected-error {{expected unqualified-id}} 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct X0 { }; 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct X1 { 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org operator int*(); 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org operator float(); 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct X2 { 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org operator int*(); // expected-note {{candidate function}} 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org operator float*(); // expected-note {{candidate function}} 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid test_delete_conv(X0 x0, X1 x1, X2 x2) { 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete x0; // expected-error{{cannot delete}} 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete x1; 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete x2; // expected-error{{ambiguous conversion of delete expression of type 'struct X2' to a pointer}} 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// PR4782 120class X3 { 121public: 122 static void operator delete(void * mem, unsigned long size); 123}; 124 125class X4 { 126public: 127 static void release(X3 *x); 128 static void operator delete(void * mem, unsigned long size); 129}; 130 131 132void X4::release(X3 *x) { 133 delete x; 134} 135 136class X5 { 137public: 138 void Destroy() const { delete this; } 139}; 140 141class Base { 142public: 143 static int operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}} \ 144 // expected-error {{operator new' must return type 'void *'}} 145 static int operator new[] (signed char) throw(); // expected-error {{'operator new[]' takes type size_t}} \ 146 // expected-error {{operator new[]' must return type 'void *'}} 147}; 148 149class Tier {}; 150class Comp : public Tier {}; 151 152class Thai : public Base { 153public: 154 Thai(const Tier *adoptDictionary); 155}; 156 157void loadEngineFor() { 158 const Comp *dict; 159 new Thai(dict); 160} 161 162template <class T> struct TBase { 163 void* operator new(T size, int); // expected-error {{'operator new' takes type size_t}} 164}; 165 166TBase<int> t1; // expected-note {{in instantiation of template class 'struct TBase<int>' requested here}} 167 168class X6 { 169public: 170 static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 171}; 172 173class X7 { 174public: 175 static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 176}; 177 178class X8 : public X6, public X7 { 179}; 180 181void f(X8* x8) { 182 delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}} 183} 184 185