blob: dfe880e34bb8b503d73f115b77923de90332d945 [file] [log] [blame]
Richard Smith0b458fd2012-02-04 05:35:53 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu
Douglas Gregorc83ed042008-11-25 04:08:05 +00002
Sebastian Redlb5a57a62008-12-03 20:26:15 +00003#include <stddef.h>
4
Sebastian Redl4c5d3202008-11-21 19:14:01 +00005struct S // expected-note {{candidate}}
6{
7 S(int, int, double); // expected-note {{candidate}}
Sebastian Redl3cb06922009-02-07 19:52:04 +00008 S(double, int); // expected-note 2 {{candidate}}
9 S(float, int); // expected-note 2 {{candidate}}
Sebastian Redl4c5d3202008-11-21 19:14:01 +000010};
John McCall7c2342d2010-03-10 11:27:22 +000011struct T; // expected-note{{forward declaration of 'T'}}
Sebastian Redl636a7c42008-12-04 17:24:46 +000012struct U
13{
14 // A special new, to verify that the global version isn't used.
Sebastian Redl9afe1302009-05-14 18:11:41 +000015 void* operator new(size_t, S*); // expected-note {{candidate}}
Sebastian Redl636a7c42008-12-04 17:24:46 +000016};
Sebastian Redl7f662392008-12-04 22:20:51 +000017struct V : U
18{
19};
Sebastian Redl4c5d3202008-11-21 19:14:01 +000020
Douglas Gregor6e790ab2009-12-22 23:42:49 +000021// PR5823
22void* operator new(const size_t); // expected-note 2 {{candidate}}
Sebastian Redl3cb06922009-02-07 19:52:04 +000023void* operator new(size_t, int*); // expected-note 3 {{candidate}}
24void* operator new(size_t, float*); // expected-note 3 {{candidate}}
Anders Carlssonfc27d262009-05-31 19:49:47 +000025void* operator new(size_t, S); // expected-note 2 {{candidate}}
Sebastian Redlb5a57a62008-12-03 20:26:15 +000026
Douglas Gregor3caf04e2010-05-16 16:01:03 +000027struct foo { };
28
Sebastian Redl4c5d3202008-11-21 19:14:01 +000029void good_news()
30{
31 int *pi = new int;
32 float *pf = new (pi) float();
33 pi = new int(1);
34 pi = new int('c');
35 const int *pci = new const int();
36 S *ps = new S(1, 2, 3.4);
Sebastian Redlcee63fb2008-12-02 14:43:59 +000037 ps = new (pf) (S)(1, 2, 3.4);
Sebastian Redl4c5d3202008-11-21 19:14:01 +000038 S *(*paps)[2] = new S*[*pi][2];
Sebastian Redl4c5d3202008-11-21 19:14:01 +000039 typedef int ia4[4];
40 ia4 *pai = new (int[3][4]);
Sebastian Redlfb4ccd72008-12-02 16:35:44 +000041 pi = ::new int;
Sebastian Redl636a7c42008-12-04 17:24:46 +000042 U *pu = new (ps) U;
Douglas Gregor5d64e5b2009-09-30 00:03:47 +000043 V *pv = new (ps) V;
Anders Carlssonfc27d262009-05-31 19:49:47 +000044
45 pi = new (S(1.0f, 2)) int;
Anders Carlssonac18b2e2009-09-23 00:37:25 +000046
47 (void)new int[true];
Douglas Gregor3caf04e2010-05-16 16:01:03 +000048
49 // PR7147
50 typedef int a[2];
51 foo* f1 = new foo;
52 foo* f2 = new foo[2];
53 typedef foo x[2];
54 typedef foo y[2][2];
55 x* f3 = new y;
Sebastian Redl4c5d3202008-11-21 19:14:01 +000056}
57
Douglas Gregore7450f52009-03-24 19:52:54 +000058struct abstract {
59 virtual ~abstract() = 0;
60};
61
Douglas Gregorc83ed042008-11-25 04:08:05 +000062void bad_news(int *ip)
Sebastian Redl4c5d3202008-11-21 19:14:01 +000063{
Richard Smith282e7e62012-02-04 09:53:13 +000064 int i = 1; // expected-note 2{{here}}
Nick Lewycky9fa8e562010-11-03 17:52:57 +000065 (void)new; // expected-error {{expected a type}}
66 (void)new 4; // expected-error {{expected a type}}
Sebastian Redl4c5d3202008-11-21 19:14:01 +000067 (void)new () int; // expected-error {{expected expression}}
Richard Smithf39aec12012-02-04 07:07:42 +000068 (void)new int[1.1]; // expected-error {{array size expression must have integral or enumeration type, not 'double'}}
Richard Smith282e7e62012-02-04 09:53:13 +000069 (void)new int[1][i]; // expected-error {{only the first dimension}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
70 (void)new (int[1][i]); // expected-error {{only the first dimension}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
Douglas Gregor4bd40312010-07-13 15:54:32 +000071 (void)new (int[i]); // expected-warning {{when type is in parentheses}}
John McCall7c2342d2010-03-10 11:27:22 +000072 (void)new int(*(S*)0); // expected-error {{no viable conversion from 'S' to 'int'}}
Douglas Gregor99a2e602009-12-16 01:38:02 +000073 (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}}
Sebastian Redl4c5d3202008-11-21 19:14:01 +000074 (void)new S(1); // expected-error {{no matching constructor}}
John McCall7c2342d2010-03-10 11:27:22 +000075 (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}}
Chris Lattner58f9e132010-09-05 00:04:01 +000076 (void)new const int; // expected-error {{default initialization of an object of const type 'const int'}}
Anders Carlssona729bbb2010-01-23 05:47:27 +000077 (void)new float*(ip); // expected-error {{cannot initialize a new value of type 'float *' with an lvalue of type 'int *'}}
Sebastian Redlcee63fb2008-12-02 14:43:59 +000078 // Undefined, but clang should reject it directly.
79 (void)new int[-1]; // expected-error {{array size is negative}}
Richard Smith0b458fd2012-02-04 05:35:53 +000080 (void)new int[2000000000]; // expected-error {{array is too large}}
Richard Smithf39aec12012-02-04 07:07:42 +000081 (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumeration type, not 'S'}}
Sebastian Redlfb4ccd72008-12-02 16:35:44 +000082 (void)::S::new int; // expected-error {{expected unqualified-id}}
Sebastian Redlb5a57a62008-12-03 20:26:15 +000083 (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}}
Sebastian Redl7f662392008-12-04 22:20:51 +000084 (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}}
Sebastian Redl636a7c42008-12-04 17:24:46 +000085 // This must fail, because the member version shouldn't be found.
86 (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}}
Sebastian Redl9afe1302009-05-14 18:11:41 +000087 // This must fail, because any member version hides all global versions.
88 (void)new U; // expected-error {{no matching function for call to 'operator new'}}
Sebastian Redl00e68e22009-02-09 18:24:27 +000089 (void)new (int[]); // expected-error {{array size must be specified in new expressions}}
90 (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}}
Sebastian Redl4c5d3202008-11-21 19:14:01 +000091 // Some lacking cases due to lack of sema support.
92}
93
94void good_deletes()
95{
96 delete (int*)0;
97 delete [](int*)0;
98 delete (S*)0;
Sebastian Redlfb4ccd72008-12-02 16:35:44 +000099 ::delete (int*)0;
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000100}
101
102void bad_deletes()
103{
104 delete 0; // expected-error {{cannot delete expression of type 'int'}}
105 delete [0] (int*)0; // expected-error {{expected ']'}} \
Chris Lattner28eb7e92008-11-23 23:17:07 +0000106 // expected-note {{to match this '['}}
Douglas Gregor94a61572010-05-24 17:01:56 +0000107 delete (void*)0; // expected-warning {{cannot delete expression with pointer-to-'void' type 'void *'}}
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000108 delete (T*)0; // expected-warning {{deleting pointer to incomplete type}}
Sebastian Redlfb4ccd72008-12-02 16:35:44 +0000109 ::S::delete (int*)0; // expected-error {{expected unqualified-id}}
Sebastian Redl4c5d3202008-11-21 19:14:01 +0000110}
Douglas Gregor9cd9f3f2009-09-09 23:39:55 +0000111
112struct X0 { };
113
114struct X1 {
115 operator int*();
116 operator float();
117};
118
119struct X2 {
Fariborz Jahanianf6527932009-09-15 17:21:47 +0000120 operator int*(); // expected-note {{candidate function}}
121 operator float*(); // expected-note {{candidate function}}
Douglas Gregor9cd9f3f2009-09-09 23:39:55 +0000122};
123
124void test_delete_conv(X0 x0, X1 x1, X2 x2) {
125 delete x0; // expected-error{{cannot delete}}
126 delete x1;
John McCall7c2342d2010-03-10 11:27:22 +0000127 delete x2; // expected-error{{ambiguous conversion of delete expression of type 'X2' to a pointer}}
Fariborz Jahanianf6527932009-09-15 17:21:47 +0000128}
Douglas Gregor90916562009-09-29 18:16:17 +0000129
130// PR4782
131class X3 {
132public:
Eli Friedman5e6214b2009-11-16 05:14:40 +0000133 static void operator delete(void * mem, size_t size);
Douglas Gregor90916562009-09-29 18:16:17 +0000134};
135
136class X4 {
137public:
138 static void release(X3 *x);
Eli Friedman5e6214b2009-11-16 05:14:40 +0000139 static void operator delete(void * mem, size_t size);
Douglas Gregor90916562009-09-29 18:16:17 +0000140};
141
142
143void X4::release(X3 *x) {
144 delete x;
145}
Douglas Gregor1070c9f2009-09-29 21:38:53 +0000146
Douglas Gregor5d64e5b2009-09-30 00:03:47 +0000147class X5 {
Douglas Gregor1070c9f2009-09-29 21:38:53 +0000148public:
149 void Destroy() const { delete this; }
150};
Fariborz Jahanianb03bfa52009-11-10 23:47:18 +0000151
152class Base {
153public:
Anders Carlsson156c78e2009-12-13 17:53:43 +0000154 static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}}
155 static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}}
Fariborz Jahanianb03bfa52009-11-10 23:47:18 +0000156};
157
158class Tier {};
159class Comp : public Tier {};
160
161class Thai : public Base {
162public:
163 Thai(const Tier *adoptDictionary);
164};
165
166void loadEngineFor() {
167 const Comp *dict;
168 new Thai(dict);
169}
170
171template <class T> struct TBase {
Douglas Gregor2fa98002010-02-16 19:28:15 +0000172 void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}}
Fariborz Jahanianb03bfa52009-11-10 23:47:18 +0000173};
174
Douglas Gregor2fa98002010-02-16 19:28:15 +0000175TBase<int> t1;
Fariborz Jahanianb03bfa52009-11-10 23:47:18 +0000176
Anders Carlsson0ba63ea2009-11-14 03:17:38 +0000177class X6 {
178public:
179 static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
180};
181
182class X7 {
183public:
184 static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
185};
186
187class X8 : public X6, public X7 {
188};
189
Anders Carlsson50724302009-11-15 16:43:15 +0000190void f(X8 *x8) {
Anders Carlsson0ba63ea2009-11-14 03:17:38 +0000191 delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}}
192}
193
Anders Carlsson50724302009-11-15 16:43:15 +0000194class X9 {
John McCall7002f4c2010-04-09 19:03:51 +0000195public:
Anders Carlsson50724302009-11-15 16:43:15 +0000196 static void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
197 static void operator delete(void*, float); // expected-note {{'operator delete' declared here}}
198};
199
200void f(X9 *x9) {
201 delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}}
202}
Anders Carlsson37909802009-11-30 21:24:50 +0000203
204struct X10 {
205 virtual ~X10();
206};
207
208struct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}}
209 void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
210};
211
212void f() {
John McCall7c2342d2010-03-10 11:27:22 +0000213 X11 x11; // expected-note {{implicit default destructor for 'X11' first required here}}
Anders Carlsson37909802009-11-30 21:24:50 +0000214}
Anders Carlssoneac81392009-12-09 07:39:44 +0000215
216struct X12 {
217 void* operator new(size_t, void*);
218};
219
220struct X13 : X12 {
221 using X12::operator new;
222};
223
224static void* f(void* g)
225{
226 return new (g) X13();
227}
Chandler Carruth4a73ea92010-02-03 11:02:14 +0000228
Chandler Carruthe228ba92010-02-08 18:54:05 +0000229class X14 {
John McCall7002f4c2010-04-09 19:03:51 +0000230public:
Chandler Carruthe228ba92010-02-08 18:54:05 +0000231 static void operator delete(void*, const size_t);
232};
233
234void f(X14 *x14a, X14 *x14b) {
235 delete x14a;
236}
237
Douglas Gregord880f522011-02-01 15:50:11 +0000238class X15 {
239private:
240 X15(); // expected-note {{declared private here}}
241 ~X15(); // expected-note {{declared private here}}
242};
243
244void f(X15* x) {
245 new X15(); // expected-error {{calling a private constructor}}
246 delete x; // expected-error {{calling a private destructor}}
247}
248
Chandler Carruth4a73ea92010-02-03 11:02:14 +0000249namespace PR5918 { // Look for template operator new overloads.
250 struct S { template<typename T> static void* operator new(size_t, T); };
251 void test() {
252 (void)new(0) S;
253 }
254}
Anders Carlsson48c95012010-05-03 15:45:23 +0000255
256namespace Test1 {
257
258void f() {
259 (void)new int[10](1, 2); // expected-error {{array 'new' cannot have initialization arguments}}
Anders Carlsson55cbd6e2010-05-16 16:24:20 +0000260
261 typedef int T[10];
262 (void)new T(1, 2); // expected-error {{array 'new' cannot have initialization arguments}}
Anders Carlsson48c95012010-05-03 15:45:23 +0000263}
264
265template<typename T>
266void g(unsigned i) {
267 (void)new T[1](i); // expected-error {{array 'new' cannot have initialization arguments}}
268}
269
270template<typename T>
271void h(unsigned i) {
272 (void)new T(i); // expected-error {{array 'new' cannot have initialization arguments}}
273}
274template void h<unsigned>(unsigned);
275template void h<unsigned[10]>(unsigned); // expected-note {{in instantiation of function template specialization 'Test1::h<unsigned int [10]>' requested here}}
276
277}
Chandler Carruth23893242010-06-28 00:30:51 +0000278
279// Don't diagnose access for overload candidates that aren't selected.
280namespace PR7436 {
281struct S1 {
282 void* operator new(size_t);
283 void operator delete(void* p);
284
285private:
286 void* operator new(size_t, void*); // expected-note {{declared private here}}
287 void operator delete(void*, void*);
288};
289class S2 {
290 void* operator new(size_t); // expected-note {{declared private here}}
291 void operator delete(void* p); // expected-note {{declared private here}}
292};
293
294void test(S1* s1, S2* s2) {
295 delete s1;
296 delete s2; // expected-error {{is a private member}}
297 (void)new S1();
298 (void)new (0L) S1(); // expected-error {{is a private member}}
299 (void)new S2(); // expected-error {{is a private member}}
300}
301}
Douglas Gregor6bc574d2010-06-30 00:20:43 +0000302
Douglas Gregor4bd40312010-07-13 15:54:32 +0000303namespace rdar8018245 {
304 struct X0 {
305 static const int value = 17;
306 };
307
308 const int X0::value;
309
310 struct X1 {
311 static int value;
312 };
313
314 int X1::value;
315
316 template<typename T>
317 int *f() {
318 return new (int[T::value]); // expected-warning{{when type is in parentheses, array cannot have dynamic size}}
319 }
320
321 template int *f<X0>();
322 template int *f<X1>(); // expected-note{{in instantiation of}}
323
324}
Douglas Gregor254a9422010-07-29 14:44:35 +0000325
326// <rdar://problem/8248780>
327namespace Instantiate {
328 template<typename T> struct X {
329 operator T*();
330 };
331
332 void f(X<int> &xi) {
333 delete xi;
334 }
335}
Sebastian Redl58e55392010-08-05 00:45:34 +0000336
337namespace PR7810 {
338 struct X {
339 // cv is ignored in arguments
340 static void operator delete(void *const);
341 };
342 struct Y {
343 // cv is ignored in arguments
344 static void operator delete(void *volatile);
345 };
346}
Chandler Carruth09556fd2010-08-08 07:04:00 +0000347
348// Don't crash on template delete operators
349namespace TemplateDestructors {
350 struct S {
351 virtual ~S() {}
352
353 void* operator new(const size_t size);
354 template<class T> void* operator new(const size_t, const int, T*);
355 void operator delete(void*, const size_t);
356 template<class T> void operator delete(void*, const size_t, const int, T*);
357 };
358}
Douglas Gregor520441e2010-08-27 21:39:15 +0000359
360namespace DeleteParam {
361 struct X {
362 void operator delete(X*); // expected-error{{first parameter of 'operator delete' must have type 'void *'}}
363 };
364
365 struct Y {
366 void operator delete(void* const);
367 };
368}
John McCalledeb6c92010-09-14 21:34:24 +0000369
370// <rdar://problem/8427878>
371// Test that the correct 'operator delete' is selected to pair with
372// the unexpected placement 'operator new'.
373namespace PairedDelete {
374 template <class T> struct A {
375 A();
376 void *operator new(size_t s, double d = 0);
377 void operator delete(void *p, double d);
378 void operator delete(void *p) {
379 T::dealloc(p);
380 }
381 };
382
383 A<int> *test() {
384 return new A<int>();
385 }
386}
Nick Lewycky9fa8e562010-11-03 17:52:57 +0000387
388namespace PR7702 {
389 void test1() {
390 new DoesNotExist; // expected-error {{expected a type}}
391 }
392}
John McCall84ff0fc2011-07-13 20:12:57 +0000393
394namespace ArrayNewNeedsDtor {
395 struct A { A(); private: ~A(); }; // expected-note {{declared private here}}
396 struct B { B(); A a; }; // expected-error {{field of type 'ArrayNewNeedsDtor::A' has private destructor}}
397 B *test9() {
398 return new B[5]; // expected-note {{implicit default destructor for 'ArrayNewNeedsDtor::B' first required here}}
399 }
400}
Eli Friedmane52c9142011-07-26 22:25:31 +0000401
402namespace DeleteIncompleteClass {
403 struct A; // expected-note {{forward declaration}}
404 extern A x;
405 void f() { delete x; } // expected-error {{deleting incomplete class type}}
406}
407
408namespace DeleteIncompleteClassPointerError {
409 struct A; // expected-note {{forward declaration}}
410 void f(A *x) { 1+delete x; } // expected-warning {{deleting pointer to incomplete type}} \
411 // expected-error {{invalid operands to binary expression}}
412}
Eli Friedmane33f6432011-07-26 22:50:18 +0000413
414namespace PR10504 {
415 struct A {
416 virtual void foo() = 0;
417 };
Eli Friedmanef8c79c2011-07-26 23:27:24 +0000418 void f(A *x) { delete x; } // expected-warning {{delete called on 'PR10504::A' that is abstract but has non-virtual destructor}}
Eli Friedmane33f6432011-07-26 22:50:18 +0000419}
Sebastian Redl2aed8b82012-02-16 12:22:20 +0000420
421struct PlacementArg {};
422inline void *operator new[](size_t, const PlacementArg &) throw () {
423 return 0;
424}
425inline void operator delete[](void *, const PlacementArg &) throw () {
426}
427
428namespace r150682 {
429
430 template <typename X>
431 struct S {
432 struct Inner {};
433 S() { new Inner[1]; }
434 };
435
436 struct T {
437 };
438
439 template<typename X>
440 void tfn() {
441 new (*(PlacementArg*)0) T[1];
442 }
443
444 void fn() {
445 tfn<int>();
446 }
447
448}