new-delete.cpp revision e33f643230738400f0bf5503a87d886e9bc635de
1655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod// RUN: %clang_cc1 -fsyntax-only -verify %s 211138ccff71f442da1fcf64faa0e1d22e083e775Behdad Esfahbod 3655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod#include <stddef.h> 4655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod 5655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodstruct S // expected-note {{candidate}} 6655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod{ 7655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod S(int, int, double); // expected-note {{candidate}} 8655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod S(double, int); // expected-note 2 {{candidate}} 9655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod S(float, int); // expected-note 2 {{candidate}} 10655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod}; 11655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodstruct T; // expected-note{{forward declaration of 'T'}} 12655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodstruct U 13655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod{ 14655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod // A special new, to verify that the global version isn't used. 15655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod void* operator new(size_t, S*); // expected-note {{candidate}} 16655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod}; 17655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodstruct V : U 18655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod{ 19655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod}; 20655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod 21655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod// PR5823 22655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodvoid* operator new(const size_t); // expected-note 2 {{candidate}} 23655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodvoid* operator new(size_t, int*); // expected-note 3 {{candidate}} 24655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodvoid* operator new(size_t, float*); // expected-note 3 {{candidate}} 25655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodvoid* operator new(size_t, S); // expected-note 2 {{candidate}} 26655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod 2711138ccff71f442da1fcf64faa0e1d22e083e775Behdad Esfahbodstruct foo { }; 280736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 29655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodvoid good_news() 30655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod{ 31655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod int *pi = new int; 325d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod float *pf = new (pi) float(); 335d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod pi = new int(1); 345d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod pi = new int('c'); 355d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod const int *pci = new const int(); 365d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod S *ps = new S(1, 2, 3.4); 375d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod ps = new (pf) (S)(1, 2, 3.4); 38c346671b6b9b05fa51b95c16212eb29ac69510faBehdad Esfahbod S *(*paps)[2] = new S*[*pi][2]; 39c346671b6b9b05fa51b95c16212eb29ac69510faBehdad Esfahbod typedef int ia4[4]; 40c346671b6b9b05fa51b95c16212eb29ac69510faBehdad Esfahbod ia4 *pai = new (int[3][4]); 41c346671b6b9b05fa51b95c16212eb29ac69510faBehdad Esfahbod pi = ::new int; 425d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod U *pu = new (ps) U; 435d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod V *pv = new (ps) V; 44947c9a778c0d4b428b58806f98c34ede59b7439cBehdad Esfahbod 455d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod pi = new (S(1.0f, 2)) int; 465d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod 475d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod (void)new int[true]; 485d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod 495d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod // PR7147 505d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod typedef int a[2]; 515d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod foo* f1 = new foo; 525d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod foo* f2 = new foo[2]; 535d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod typedef foo x[2]; 545d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod typedef foo y[2][2]; 555d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod x* f3 = new y; 565d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod} 575d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod 58947c9a778c0d4b428b58806f98c34ede59b7439cBehdad Esfahbodstruct abstract { 595d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod virtual ~abstract() = 0; 605d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod}; 6155deff7595ef357d000fef83559c74c9f8acad00Behdad Esfahbod 62c346671b6b9b05fa51b95c16212eb29ac69510faBehdad Esfahbodvoid bad_news(int *ip) 63e3b2e077f549b04779c08a9fedb1f35b9f11075cBehdad Esfahbod{ 6455deff7595ef357d000fef83559c74c9f8acad00Behdad Esfahbod int i = 1; 655d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod (void)new; // expected-error {{expected a type}} 66378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod (void)new 4; // expected-error {{expected a type}} 6784186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new () int; // expected-error {{expected expression}} 6884186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}} 6984186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new int[1][i]; // expected-error {{only the first dimension}} 705d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod (void)new (int[1][i]); // expected-error {{only the first dimension}} 7184186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new (int[i]); // expected-warning {{when type is in parentheses}} 7284186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new int(*(S*)0); // expected-error {{no viable conversion from 'S' to 'int'}} 7384186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}} 7484186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new S(1); // expected-error {{no matching constructor}} 7584186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}} 7684186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new const int; // expected-error {{default initialization of an object of const type 'const int'}} 7784186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new float*(ip); // expected-error {{cannot initialize a new value of type 'float *' with an lvalue of type 'int *'}} 7884186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod // Undefined, but clang should reject it directly. 7984186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new int[-1]; // expected-error {{array size is negative}} 8084186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumerated type, not 'S'}} 8184186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)::S::new int; // expected-error {{expected unqualified-id}} 8284186a64004e5dcd2ce98b564d0e0a09aa5d68b2Behdad Esfahbod (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}} 835d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}} 845d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod // This must fail, because the member version shouldn't be found. 85eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}} 86eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod // This must fail, because any member version hides all global versions. 870736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod (void)new U; // expected-error {{no matching function for call to 'operator new'}} 880736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod (void)new (int[]); // expected-error {{array size must be specified in new expressions}} 890736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}} 90428dfcab6634ff264570a0a5d715efb8048c3db5Behdad Esfahbod // Some lacking cases due to lack of sema support. 91eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod} 92428dfcab6634ff264570a0a5d715efb8048c3db5Behdad Esfahbod 93428dfcab6634ff264570a0a5d715efb8048c3db5Behdad Esfahbodvoid good_deletes() 94eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod{ 95eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod delete (int*)0; 960736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod delete [](int*)0; 970736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod delete (S*)0; 980736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod ::delete (int*)0; 99428dfcab6634ff264570a0a5d715efb8048c3db5Behdad Esfahbod} 100eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod 101428dfcab6634ff264570a0a5d715efb8048c3db5Behdad Esfahbodvoid bad_deletes() 102428dfcab6634ff264570a0a5d715efb8048c3db5Behdad Esfahbod{ 103b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod delete 0; // expected-error {{cannot delete expression of type 'int'}} 104b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod delete [0] (int*)0; // expected-error {{expected ']'}} \ 105b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod // expected-note {{to match this '['}} 10607d682806349aee81f53114778ce0beb23909ed7Behdad Esfahbod delete (void*)0; // expected-warning {{cannot delete expression with pointer-to-'void' type 'void *'}} 107b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod delete (T*)0; // expected-warning {{deleting pointer to incomplete type}} 108b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod ::S::delete (int*)0; // expected-error {{expected unqualified-id}} 1098d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod} 110b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 111c311d852080b50ffc85e80168de62abb05a6be59Behdad Esfahbodstruct X0 { }; 112b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 1138d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbodstruct X1 { 11499c2695759a6af855d565f4994bbdf220570bb48Behdad Esfahbod operator int*(); 115c311d852080b50ffc85e80168de62abb05a6be59Behdad Esfahbod operator float(); 11645412523dc295cb5ee12e096bfacb282cc925843Behdad Esfahbod}; 1178d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod 118b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbodstruct X2 { 1198d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod operator int*(); // expected-note {{candidate function}} 120b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod operator float*(); // expected-note {{candidate function}} 1218d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod}; 1228d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod 1238d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbodvoid test_delete_conv(X0 x0, X1 x1, X2 x2) { 1248d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod delete x0; // expected-error{{cannot delete}} 1258d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod delete x1; 1268d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod delete x2; // expected-error{{ambiguous conversion of delete expression of type 'X2' to a pointer}} 1278d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod} 1288d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod 1298d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod// PR4782 130f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodclass X3 { 131f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodpublic: 132eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod static void operator delete(void * mem, size_t size); 133655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod}; 134b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 13545412523dc295cb5ee12e096bfacb282cc925843Behdad Esfahbodclass X4 { 136eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbodpublic: 1370736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod static void release(X3 *x); 138f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod static void operator delete(void * mem, size_t size); 13945412523dc295cb5ee12e096bfacb282cc925843Behdad Esfahbod}; 1400736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 1414ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod 1424ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbodvoid X4::release(X3 *x) { 1430736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod delete x; 144f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod} 1450736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 146f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodclass X5 { 147f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodpublic: 148f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod void Destroy() const { delete this; } 1494ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod}; 150655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod 151f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodclass Base { 1520736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbodpublic: 153f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}} 1540736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}} 155f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod}; 156f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod 157f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodclass Tier {}; 1584ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbodclass Comp : public Tier {}; 15945412523dc295cb5ee12e096bfacb282cc925843Behdad Esfahbod 1604ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbodclass Thai : public Base { 1610736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbodpublic: 162f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod Thai(const Tier *adoptDictionary); 1630736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod}; 164f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod 165f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodvoid loadEngineFor() { 166f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod const Comp *dict; 16745412523dc295cb5ee12e096bfacb282cc925843Behdad Esfahbod new Thai(dict); 16845412523dc295cb5ee12e096bfacb282cc925843Behdad Esfahbod} 169f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod 1705c6f5982d78e2d7fadc2fbb8b4f3a4be9420c59aBehdad Esfahbodtemplate <class T> struct TBase { 1715c6f5982d78e2d7fadc2fbb8b4f3a4be9420c59aBehdad Esfahbod void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}} 172f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod}; 173f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod 174eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad EsfahbodTBase<int> t1; 175d6b9c6d20041b4f4fa11befc179aee757c41904dBehdad Esfahbod 176378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbodclass X6 { 177378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbodpublic: 178b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 179378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod}; 1800736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 181378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbodclass X7 { 182f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodpublic: 183378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}} 184378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod}; 1850736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 186f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodclass X8 : public X6, public X7 { 187378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod}; 188378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod 1890736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbodvoid f(X8 *x8) { 190378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}} 191f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod} 192d6b9c6d20041b4f4fa11befc179aee757c41904dBehdad Esfahbod 193d6b9c6d20041b4f4fa11befc179aee757c41904dBehdad Esfahbodclass X9 { 194f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodpublic: 1956e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod static void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 196eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod static void operator delete(void*, float); // expected-note {{'operator delete' declared here}} 1975c6f5982d78e2d7fadc2fbb8b4f3a4be9420c59aBehdad Esfahbod}; 1980736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 1994ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbodvoid f(X9 *x9) { 2004ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}} 201378d279bbf692195c4654e312dae854ab3be04cfBehdad Esfahbod} 2020736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 203b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbodstruct X10 { 2046e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod virtual ~X10(); 2058d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod}; 2060736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 207b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbodstruct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}} 2086e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod void operator delete(void*, int); // expected-note {{'operator delete' declared here}} 2098d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod}; 21007d682806349aee81f53114778ce0beb23909ed7Behdad Esfahbod 21107d682806349aee81f53114778ce0beb23909ed7Behdad Esfahbodvoid f() { 212b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod X11 x11; // expected-note {{implicit default destructor for 'X11' first required here}} 213b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod} 214b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 215eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbodstruct X12 { 216b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod void* operator new(size_t, void*); 2170736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod}; 218b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 219b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbodstruct X13 : X12 { 220b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod using X12::operator new; 2210736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod}; 222b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 223b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbodstatic void* f(void* g) 2240736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod{ 225b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod return new (g) X13(); 226b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod} 227b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 228b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbodclass X14 { 2290736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbodpublic: 230b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod static void operator delete(void*, const size_t); 231b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod}; 232655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod 233655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodvoid f(X14 *x14a, X14 *x14b) { 234f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod delete x14a; 2356e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod} 236eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod 237655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodclass X15 { 2380736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbodprivate: 2395d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod X15(); // expected-note {{declared private here}} 24011138ccff71f442da1fcf64faa0e1d22e083e775Behdad Esfahbod ~X15(); // expected-note {{declared private here}} 241208f70f0553d73d2908b21b9552298029482a8b9Behdad Esfahbod}; 2420736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 2436e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbodvoid f(X15* x) { 244af913c5788e600e36d29f44fe4e77db84cf8c442Behdad Esfahbod new X15(); // expected-error {{calling a private constructor}} 245d6b9c6d20041b4f4fa11befc179aee757c41904dBehdad Esfahbod delete x; // expected-error {{calling a private destructor}} 24611138ccff71f442da1fcf64faa0e1d22e083e775Behdad Esfahbod} 2470736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 248f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodnamespace PR5918 { // Look for template operator new overloads. 249f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod struct S { template<typename T> static void* operator new(size_t, T); }; 2506e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod void test() { 251eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod (void)new(0) S; 252f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod } 2530736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod} 2546e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod 255f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodnamespace Test1 { 2566e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod 257655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodvoid f() { 258655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod (void)new int[10](1, 2); // expected-error {{array 'new' cannot have initialization arguments}} 259f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbod 26045d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbod typedef int T[10]; 26145d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbod (void)new T(1, 2); // expected-error {{array 'new' cannot have initialization arguments}} 26245d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbod} 263d1deaa2f5bd028e8076265cba92cffa4fa2834acBehdad Esfahbod 264d1deaa2f5bd028e8076265cba92cffa4fa2834acBehdad Esfahbodtemplate<typename T> 26545d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbodvoid g(unsigned i) { 26645d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbod (void)new T[1](i); // expected-error {{array 'new' cannot have initialization arguments}} 26745d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbod} 26845d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbod 269f4cb4762986a28634fa7de9b706f9d37859b881eBehdad Esfahbodtemplate<typename T> 27045412523dc295cb5ee12e096bfacb282cc925843Behdad Esfahbodvoid h(unsigned i) { 271eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod (void)new T(i); // expected-error {{array 'new' cannot have initialization arguments}} 2720736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod} 2730736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbodtemplate void h<unsigned>(unsigned); 274655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbodtemplate void h<unsigned[10]>(unsigned); // expected-note {{in instantiation of function template specialization 'Test1::h<unsigned int [10]>' requested here}} 275eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod 276eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod} 2770736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 278eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod// Don't diagnose access for overload candidates that aren't selected. 279eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbodnamespace PR7436 { 2800736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbodstruct S1 { 2810736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod void* operator new(size_t); 282eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod void operator delete(void* p); 283eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod 284eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbodprivate: 2850736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod void* operator new(size_t, void*); // expected-note {{declared private here}} 2860736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod void operator delete(void*, void*); 287b85800f9de8976a7418ef9df467d3080c6ab0199Behdad Esfahbod}; 288b85800f9de8976a7418ef9df467d3080c6ab0199Behdad Esfahbodclass S2 { 28934c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod void* operator new(size_t); // expected-note {{declared private here}} 2905d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod void operator delete(void* p); // expected-note {{declared private here}} 291c311d852080b50ffc85e80168de62abb05a6be59Behdad Esfahbod}; 2925389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod 2935389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbodvoid test(S1* s1, S2* s2) { 2945389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod delete s1; 2955389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod delete s2; // expected-error {{is a private member}} 2965d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod (void)new S1(); 29734c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod (void)new (0L) S1(); // expected-error {{is a private member}} 2984ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod (void)new S2(); // expected-error {{is a private member}} 2994ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod} 3005389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod} 30134c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod 302468e9cb25c9bc14781b7013e447d763f93bf76a3Behdad Esfahbodnamespace rdar8018245 { 3035d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod struct X0 { 304655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod static const int value = 17; 305468e9cb25c9bc14781b7013e447d763f93bf76a3Behdad Esfahbod }; 30699c2695759a6af855d565f4994bbdf220570bb48Behdad Esfahbod 307655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod const int X0::value; 3085d90a342e319068716429bf7af76c3896b61a0e5Behdad Esfahbod 3096e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod struct X1 { 310655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod static int value; 311468e9cb25c9bc14781b7013e447d763f93bf76a3Behdad Esfahbod }; 3124ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod 31334c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod int X1::value; 3144ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod 3154ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod template<typename T> 31634c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod int *f() { 31734c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod return new (int[T::value]); // expected-warning{{when type is in parentheses, array cannot have dynamic size}} 31834c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod } 319d1deaa2f5bd028e8076265cba92cffa4fa2834acBehdad Esfahbod 32034c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod template int *f<X0>(); 32134c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod template int *f<X1>(); // expected-note{{in instantiation of}} 32234c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod 32334c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod} 324d1deaa2f5bd028e8076265cba92cffa4fa2834acBehdad Esfahbod 32534c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod// <rdar://problem/8248780> 32634c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbodnamespace Instantiate { 32734c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod template<typename T> struct X { 32834c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod operator T*(); 32934c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod }; 33034c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod 33134c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod void f(X<int> &xi) { 33234c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod delete xi; 33334c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod } 33434c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod} 33545d6f29f15f1d2323bcaa2498aed23ff0c8a1567Behdad Esfahbod 33634c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbodnamespace PR7810 { 33734c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod struct X { 33834c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod // cv is ignored in arguments 33934c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod static void operator delete(void *const); 3404ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod }; 341b85800f9de8976a7418ef9df467d3080c6ab0199Behdad Esfahbod struct Y { 3425389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod // cv is ignored in arguments 3435389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod static void operator delete(void *volatile); 3444ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod }; 34534c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod} 3465389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod 3475389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod// Don't crash on template delete operators 3484ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbodnamespace TemplateDestructors { 3495389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod struct S { 3505389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod virtual ~S() {} 3515389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod 352b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod void* operator new(const size_t size); 3535389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod template<class T> void* operator new(const size_t, const int, T*); 3545389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod void operator delete(void*, const size_t); 3555389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod template<class T> void operator delete(void*, const size_t, const int, T*); 356968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod }; 3576e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod} 3586e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod 3596e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbodnamespace DeleteParam { 360968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod struct X { 3616e74c64211b6aaac48bae8c87f9420d8dc03fd93Behdad Esfahbod void operator delete(X*); // expected-error{{first parameter of 'operator delete' must have type 'void *'}} 362968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod }; 363968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod 364968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod struct Y { 36599c2695759a6af855d565f4994bbdf220570bb48Behdad Esfahbod void operator delete(void* const); 366968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod }; 367eba312c8d1b2bbe8cb9b6414e843e78d2c521aa4Behdad Esfahbod} 3680736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod 3690736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod// <rdar://problem/8427878> 3700736915b8ed789a209205fec762997af3a8af89cBehdad Esfahbod// Test that the correct 'operator delete' is selected to pair with 371968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod// the unexpected placement 'operator new'. 3728fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbodnamespace PairedDelete { 3735389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod template <class T> struct A { 374bc8357ea7b4c0d7c715aae353176434fb9460205Behdad Esfahbod A(); 375b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod void *operator new(size_t s, double d = 0); 376bc8357ea7b4c0d7c715aae353176434fb9460205Behdad Esfahbod void operator delete(void *p, double d); 377bc8357ea7b4c0d7c715aae353176434fb9460205Behdad Esfahbod void operator delete(void *p) { 378bc8357ea7b4c0d7c715aae353176434fb9460205Behdad Esfahbod T::dealloc(p); 3798d1eef3f32fb539de2a72804fa3834acc18daab5Behdad Esfahbod } 380bc8357ea7b4c0d7c715aae353176434fb9460205Behdad Esfahbod }; 381b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod 382d1deaa2f5bd028e8076265cba92cffa4fa2834acBehdad Esfahbod A<int> *test() { 383e02d9257863b49e33ab5942971266349d3c548f6Behdad Esfahbod return new A<int>(); 3845389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod } 3855389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod} 3865389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbod 387e02d9257863b49e33ab5942971266349d3c548f6Behdad Esfahbodnamespace PR7702 { 388b00321ea78793d9b3592b5173a9800e6322424feBehdad Esfahbod void test1() { 389968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod new DoesNotExist; // expected-error {{expected a type}} 39099c2695759a6af855d565f4994bbdf220570bb48Behdad Esfahbod } 391968318455304804dc53045e8ba0cd4d76800c02dBehdad Esfahbod} 3924ff0d2d9dfc4f7e4880a4e964ca9872624508ea0Behdad Esfahbod 3935389ff4dbc46c76c9483e3c95f22524b60e21166Behdad Esfahbodnamespace ArrayNewNeedsDtor { 39434c22f816808d061a980cffca12de03beb437fa0Behdad Esfahbod struct A { A(); private: ~A(); }; // expected-note {{declared private here}} 395655586fe5e1fadf2a2ef7826e61ee9a445ffa37aBehdad Esfahbod struct B { B(); A a; }; // expected-error {{field of type 'ArrayNewNeedsDtor::A' has private destructor}} 396 B *test9() { 397 return new B[5]; // expected-note {{implicit default destructor for 'ArrayNewNeedsDtor::B' first required here}} 398 } 399} 400 401namespace DeleteIncompleteClass { 402 struct A; // expected-note {{forward declaration}} 403 extern A x; 404 void f() { delete x; } // expected-error {{deleting incomplete class type}} 405} 406 407namespace DeleteIncompleteClassPointerError { 408 struct A; // expected-note {{forward declaration}} 409 void f(A *x) { 1+delete x; } // expected-warning {{deleting pointer to incomplete type}} \ 410 // expected-error {{invalid operands to binary expression}} 411} 412 413namespace PR10504 { 414 struct A { 415 virtual void foo() = 0; 416 }; 417 void f(A *x) { delete x; } // expected-error {{cannot delete 'PR10504::A', which is abstract and does not have a virtual destructor}} 418} 419