new-delete.cpp revision 4bd40318cbea15310a37343db46de96c4fcc15e6
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// RUN: %clang_cc1 -fsyntax-only -verify %s
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stddef.h>
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct S // expected-note {{candidate}}
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S(int, int, double); // expected-note {{candidate}}
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S(double, int); // expected-note 2 {{candidate}}
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S(float, int); // expected-note 2 {{candidate}}
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct T; // expected-note{{forward declaration of 'T'}}
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct U
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // A special new, to verify that the global version isn't used.
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  void* operator new(size_t, S*); // expected-note {{candidate}}
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct V : U
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// PR5823
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(const size_t); // expected-note 2 {{candidate}}
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(size_t, int*); // expected-note 3 {{candidate}}
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(size_t, float*); // expected-note 3 {{candidate}}
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid* operator new(size_t, S); // expected-note 2 {{candidate}}
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct foo { };
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid good_news()
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  int *pi = new int;
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  float *pf = new (pi) float();
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = new int(1);
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = new int('c');
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const int *pci = new const int();
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S *ps = new S(1, 2, 3.4);
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ps = new (pf) (S)(1, 2, 3.4);
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  S *(*paps)[2] = new S*[*pi][2];
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  typedef int ia4[4];
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ia4 *pai = new (int[3][4]);
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = ::new int;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  U *pu = new (ps) U;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  V *pv = new (ps) V;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  pi = new (S(1.0f, 2)) int;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[true];
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // PR7147
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  typedef int a[2];
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  foo* f1 = new foo;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  foo* f2 = new foo[2];
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  typedef foo x[2];
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  typedef foo y[2][2];
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  x* f3 = new y;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct abstract {
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  virtual ~abstract() = 0;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid bad_news(int *ip)
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  int i = 1;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new; // expected-error {{missing type specifier}}
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new 4; // expected-error {{missing type specifier}}
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new () int; // expected-error {{expected expression}}
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}}
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[1][i]; // expected-error {{only the first dimension}}
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (int[1][i]); // expected-error {{only the first dimension}}
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (int[i]); // expected-warning {{when type is in parentheses}}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int(*(S*)0); // expected-error {{no viable conversion from 'S' to 'int'}}
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}}
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new S(1); // expected-error {{no matching constructor}}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}}
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new const int; // expected-error {{default initialization of an object of const type 'int const'}}
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new float*(ip); // expected-error {{cannot initialize a new value of type 'float *' with an lvalue of type 'int *'}}
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // Undefined, but clang should reject it directly.
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[-1]; // expected-error {{array size is negative}}
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumerated type, not 'S'}}
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)::S::new int; // expected-error {{expected unqualified-id}}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}}
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}}
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // This must fail, because the member version shouldn't be found.
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}}
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // This must fail, because any member version hides all global versions.
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new U; // expected-error {{no matching function for call to 'operator new'}}
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new (int[]); // expected-error {{array size must be specified in new expressions}}
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}}
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  // Some lacking cases due to lack of sema support.
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid good_deletes()
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (int*)0;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete [](int*)0;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (S*)0;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ::delete (int*)0;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid bad_deletes()
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete 0; // expected-error {{cannot delete expression of type 'int'}}
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete [0] (int*)0; // expected-error {{expected ']'}} \
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      // expected-note {{to match this '['}}
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (void*)0; // expected-warning {{cannot delete expression with pointer-to-'void' type 'void *'}}
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  delete (T*)0; // expected-warning {{deleting pointer to incomplete type}}
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ::S::delete (int*)0; // expected-error {{expected unqualified-id}}
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct X0 { };
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct X1 {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  operator int*();
115  operator float();
116};
117
118struct X2 {
119  operator int*(); // expected-note {{candidate function}}
120  operator float*(); // expected-note {{candidate function}}
121};
122
123void test_delete_conv(X0 x0, X1 x1, X2 x2) {
124  delete x0; // expected-error{{cannot delete}}
125  delete x1;
126  delete x2; // expected-error{{ambiguous conversion of delete expression of type 'X2' to a pointer}}
127}
128
129// PR4782
130class X3 {
131public:
132  static void operator delete(void * mem, size_t size);
133};
134
135class X4 {
136public:
137  static void release(X3 *x);
138  static void operator delete(void * mem, size_t size);
139};
140
141
142void X4::release(X3 *x) {
143  delete x;
144}
145
146class X5 {
147public:
148  void Destroy() const { delete this; }
149};
150
151class Base {
152public:
153  static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}}
154  static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}}
155};
156
157class Tier {};
158class Comp : public Tier {};
159
160class Thai : public Base {
161public:
162  Thai(const Tier *adoptDictionary);
163};
164
165void loadEngineFor() {
166  const Comp *dict;
167  new Thai(dict);
168}
169
170template <class T> struct TBase {
171  void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}}
172};
173
174TBase<int> t1;
175
176class X6 {
177public:
178  static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
179};
180
181class X7 {
182public:
183  static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
184};
185
186class X8 : public X6, public X7 {
187};
188
189void f(X8 *x8) {
190  delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}}
191}
192
193class X9 {
194public:
195  static void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
196  static void operator delete(void*, float); // expected-note {{'operator delete' declared here}}
197};
198
199void f(X9 *x9) {
200  delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}}
201}
202
203struct X10 {
204  virtual ~X10();
205};
206
207struct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}}
208  void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
209};
210
211void f() {
212  X11 x11; // expected-note {{implicit default destructor for 'X11' first required here}}
213}
214
215struct X12 {
216  void* operator new(size_t, void*);
217};
218
219struct X13 : X12 {
220  using X12::operator new;
221};
222
223static void* f(void* g)
224{
225    return new (g) X13();
226}
227
228class X14 {
229public:
230  static void operator delete(void*, const size_t);
231};
232
233void f(X14 *x14a, X14 *x14b) {
234  delete x14a;
235}
236
237namespace PR5918 { // Look for template operator new overloads.
238  struct S { template<typename T> static void* operator new(size_t, T); };
239  void test() {
240    (void)new(0) S;
241  }
242}
243
244namespace Test1 {
245
246void f() {
247  (void)new int[10](1, 2); // expected-error {{array 'new' cannot have initialization arguments}}
248
249  typedef int T[10];
250  (void)new T(1, 2); // expected-error {{array 'new' cannot have initialization arguments}}
251}
252
253template<typename T>
254void g(unsigned i) {
255  (void)new T[1](i); // expected-error {{array 'new' cannot have initialization arguments}}
256}
257
258template<typename T>
259void h(unsigned i) {
260  (void)new T(i); // expected-error {{array 'new' cannot have initialization arguments}}
261}
262template void h<unsigned>(unsigned);
263template void h<unsigned[10]>(unsigned); // expected-note {{in instantiation of function template specialization 'Test1::h<unsigned int [10]>' requested here}}
264
265}
266
267// Don't diagnose access for overload candidates that aren't selected.
268namespace PR7436 {
269struct S1 {
270  void* operator new(size_t);
271  void operator delete(void* p);
272
273private:
274  void* operator new(size_t, void*); // expected-note {{declared private here}}
275  void operator delete(void*, void*);
276};
277class S2 {
278  void* operator new(size_t); // expected-note {{declared private here}}
279  void operator delete(void* p); // expected-note {{declared private here}}
280};
281
282void test(S1* s1, S2* s2) {
283  delete s1;
284  delete s2; // expected-error {{is a private member}}
285  (void)new S1();
286  (void)new (0L) S1(); // expected-error {{is a private member}}
287  (void)new S2(); // expected-error {{is a private member}}
288}
289}
290
291namespace rdar8018245 {
292  struct X0 {
293    static const int value = 17;
294  };
295
296  const int X0::value;
297
298  struct X1 {
299    static int value;
300  };
301
302  int X1::value;
303
304  template<typename T>
305  int *f() {
306    return new (int[T::value]); // expected-warning{{when type is in parentheses, array cannot have dynamic size}}
307  }
308
309  template int *f<X0>();
310  template int *f<X1>(); // expected-note{{in instantiation of}}
311
312}
313