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