1 // RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null
2 // RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++98
3 // RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++11
4 
5 #include <stddef.h>
6 
7 #if __cplusplus >= 201103L
8 // expected-note@+2 {{candidate constructor (the implicit move constructor) not viable}}
9 #endif
10 struct S // expected-note {{candidate}}
11 {
12   S(int, int, double); // expected-note {{candidate}}
13   S(double, int); // expected-note 2 {{candidate}}
14   S(float, int); // expected-note 2 {{candidate}}
15 };
16 struct T; // expected-note{{forward declaration of 'T'}}
17 struct U
18 {
19   // A special new, to verify that the global version isn't used.
20   void* operator new(size_t, S*); // expected-note {{candidate}}
21 };
22 struct V : U
23 {
24 };
25 
26 inline void operator delete(void *); // expected-warning {{replacement function 'operator delete' cannot be declared 'inline'}}
27 
28 __attribute__((used))
operator new(size_t)29 inline void *operator new(size_t) { // no warning, due to __attribute__((used))
30   return 0;
31 }
32 
33 // PR5823
34 void* operator new(const size_t); // expected-note 2 {{candidate}}
35 void* operator new(size_t, int*); // expected-note 3 {{candidate}}
36 void* operator new(size_t, float*); // expected-note 3 {{candidate}}
37 void* operator new(size_t, S); // expected-note 2 {{candidate}}
38 
39 struct foo { };
40 
good_news()41 void good_news()
42 {
43   int *pi = new int;
44   float *pf = new (pi) float();
45   pi = new int(1);
46   pi = new int('c');
47   const int *pci = new const int();
48   S *ps = new S(1, 2, 3.4);
49   ps = new (pf) (S)(1, 2, 3.4);
50   S *(*paps)[2] = new S*[*pi][2];
51   typedef int ia4[4];
52   ia4 *pai = new (int[3][4]);
53   pi = ::new int;
54   U *pu = new (ps) U;
55   V *pv = new (ps) V;
56 
57   pi = new (S(1.0f, 2)) int;
58 
59   (void)new int[true];
60 
61   // PR7147
62   typedef int a[2];
63   foo* f1 = new foo;
64   foo* f2 = new foo[2];
65   typedef foo x[2];
66   typedef foo y[2][2];
67   x* f3 = new y;
68 }
69 
70 struct abstract {
71   virtual ~abstract() = 0;
72 };
73 
bad_news(int * ip)74 void bad_news(int *ip)
75 {
76   int i = 1; // expected-note 2{{here}}
77   (void)new; // expected-error {{expected a type}}
78   (void)new 4; // expected-error {{expected a type}}
79   (void)new () int; // expected-error {{expected expression}}
80   (void)new int[1.1];
81 #if __cplusplus <= 199711L
82   // expected-error@-2 {{array size expression must have integral or enumeration type, not 'double'}}
83 #elif __cplusplus <= 201103L
84   // expected-error@-4 {{array size expression must have integral or unscoped enumeration type, not 'double'}}
85 #else
86   // expected-warning@-6 {{implicit conversion from 'double' to 'unsigned int' changes value from 1.1 to 1}}
87 #endif
88 
89   (void)new int[1][i];  // expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
90   (void)new (int[1][i]); // expected-note {{read of non-const variable 'i' is not allowed in a constant expression}}
91 #if __cplusplus <= 201103L
92   // expected-error@-3 {{only the first dimension}}
93   // expected-error@-3 {{only the first dimension}}
94 #else
95   // expected-error@-6 {{array size is not a constant expression}}
96   // expected-error@-6 {{array size is not a constant expression}}
97 #endif
98   (void)new (int[i]); // expected-warning {{when type is in parentheses}}
99   (void)new int(*(S*)0); // expected-error {{no viable conversion from 'S' to 'int'}}
100   (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}}
101   (void)new S(1); // expected-error {{no matching constructor}}
102   (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}}
103   (void)new const int; // expected-error {{default initialization of an object of const type 'const int'}}
104   (void)new float*(ip); // expected-error {{cannot initialize a new value of type 'float *' with an lvalue of type 'int *'}}
105   // Undefined, but clang should reject it directly.
106   (void)new int[-1];
107 #if __cplusplus <= 201103L
108   // expected-error@-2 {{array size is negative}}
109 #else
110   // expected-error@-4 {{array is too large}}
111 #endif
112   (void)new int[2000000000]; // expected-error {{array is too large}}
113   (void)new int[*(S*)0];
114 #if __cplusplus <= 199711L
115   // expected-error@-2 {{array size expression must have integral or enumeration type, not 'S'}}
116 #elif __cplusplus <= 201103L
117   // expected-error@-4 {{array size expression must have integral or unscoped enumeration type, not 'S'}}
118 #else
119   // expected-error@-6 {{converting 'S' to incompatible type}}
120 #endif
121 
122   (void)::S::new int; // expected-error {{expected unqualified-id}}
123   (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}}
124   (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}}
125   // This must fail, because the member version shouldn't be found.
126   (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}}
127   // This must fail, because any member version hides all global versions.
128   (void)new U; // expected-error {{no matching function for call to 'operator new'}}
129   (void)new (int[]); // expected-error {{array size must be specified in new expressions}}
130   (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}}
131   // Some lacking cases due to lack of sema support.
132 }
133 
good_deletes()134 void good_deletes()
135 {
136   delete (int*)0;
137   delete [](int*)0;
138   delete (S*)0;
139   ::delete (int*)0;
140 }
141 
bad_deletes()142 void bad_deletes()
143 {
144   delete 0; // expected-error {{cannot delete expression of type 'int'}}
145   delete [0] (int*)0;
146 #if __cplusplus <= 199711L
147   // expected-error@-2 {{expected expression}}
148 #else
149   // expected-error@-4 {{expected variable name or 'this' in lambda capture list}}
150 #endif
151   delete (void*)0; // expected-warning {{cannot delete expression with pointer-to-'void' type 'void *'}}
152   delete (T*)0; // expected-warning {{deleting pointer to incomplete type}}
153   ::S::delete (int*)0; // expected-error {{expected unqualified-id}}
154 }
155 
156 struct X0 { };
157 
158 struct X1 {
159   operator int*();
160   operator float();
161 };
162 
163 struct X2 {
164   operator int*(); // expected-note {{conversion}}
165   operator float*(); // expected-note {{conversion}}
166 };
167 
test_delete_conv(X0 x0,X1 x1,X2 x2)168 void test_delete_conv(X0 x0, X1 x1, X2 x2) {
169   delete x0; // expected-error{{cannot delete}}
170   delete x1;
171   delete x2; // expected-error{{ambiguous conversion of delete expression of type 'X2' to a pointer}}
172 }
173 
174 // PR4782
175 class X3 {
176 public:
177   static void operator delete(void * mem, size_t size);
178 };
179 
180 class X4 {
181 public:
182   static void release(X3 *x);
183   static void operator delete(void * mem, size_t size);
184 };
185 
186 
release(X3 * x)187 void X4::release(X3 *x) {
188   delete x;
189 }
190 
191 class X5 {
192 public:
Destroy() const193   void Destroy() const { delete this; }
194 };
195 
196 class Base {
197 public:
198   static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}}
199   static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}}
200 };
201 
202 class Tier {};
203 class Comp : public Tier {};
204 
205 class Thai : public Base {
206 public:
207   Thai(const Tier *adoptDictionary);
208 };
209 
loadEngineFor()210 void loadEngineFor() {
211   const Comp *dict;
212   new Thai(dict);
213 }
214 
215 template <class T> struct TBase {
216   void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}}
217 };
218 
219 TBase<int> t1;
220 
221 class X6 {
222 public:
223   static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
224 };
225 
226 class X7 {
227 public:
228   static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
229 };
230 
231 class X8 : public X6, public X7 {
232 };
233 
f(X8 * x8)234 void f(X8 *x8) {
235   delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}}
236 }
237 
238 class X9 {
239 public:
240   static void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
241   static void operator delete(void*, float); // expected-note {{'operator delete' declared here}}
242 };
243 
f(X9 * x9)244 void f(X9 *x9) {
245   delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}}
246 }
247 
248 struct X10 {
249   virtual ~X10();
250 #if __cplusplus >= 201103L
251   // expected-note@-2 {{overridden virtual function is here}}
252 #endif
253 };
254 
255 struct X11 : X10 {
256 #if __cplusplus <= 199711L
257 // expected-error@-2 {{no suitable member 'operator delete' in 'X11'}}
258 #else
259 // expected-error@-4 {{deleted function '~X11' cannot override a non-deleted function}}
260 // expected-note@-5 2 {{virtual destructor requires an unambiguous, accessible 'operator delete'}}
261 #endif
262   void operator delete(void*, int);
263 #if __cplusplus <= 199711L
264   // expected-note@-2 {{'operator delete' declared here}}
265 #endif
266 };
267 
f()268 void f() {
269   X11 x11;
270 #if __cplusplus <= 199711L
271   // expected-note@-2 {{implicit destructor for 'X11' first required here}}
272 #else
273   // expected-error@-4 {{attempt to use a deleted function}}
274 #endif
275 }
276 
277 struct X12 {
278   void* operator new(size_t, void*);
279 };
280 
281 struct X13 : X12 {
282   using X12::operator new;
283 };
284 
f(void * g)285 static void* f(void* g)
286 {
287     return new (g) X13();
288 }
289 
290 class X14 {
291 public:
292   static void operator delete(void*, const size_t);
293 };
294 
f(X14 * x14a,X14 * x14b)295 void f(X14 *x14a, X14 *x14b) {
296   delete x14a;
297 }
298 
299 class X15 {
300 private:
301   X15(); // expected-note {{declared private here}}
302   ~X15(); // expected-note {{declared private here}}
303 };
304 
f(X15 * x)305 void f(X15* x) {
306   new X15(); // expected-error {{calling a private constructor}}
307   delete x; // expected-error {{calling a private destructor}}
308 }
309 
310 namespace PR5918 { // Look for template operator new overloads.
311   struct S { template<typename T> static void* operator new(size_t, T); };
test()312   void test() {
313     (void)new(0) S;
314   }
315 }
316 
317 namespace Test1 {
318 
f()319 void f() {
320   (void)new int[10](1, 2); // expected-error {{array 'new' cannot have initialization arguments}}
321 
322   typedef int T[10];
323   (void)new T(1, 2); // expected-error {{array 'new' cannot have initialization arguments}}
324 }
325 
326 template<typename T>
g(unsigned i)327 void g(unsigned i) {
328   (void)new T[1](i); // expected-error {{array 'new' cannot have initialization arguments}}
329 }
330 
331 template<typename T>
h(unsigned i)332 void h(unsigned i) {
333   (void)new T(i); // expected-error {{array 'new' cannot have initialization arguments}}
334 }
335 template void h<unsigned>(unsigned);
336 template void h<unsigned[10]>(unsigned); // expected-note {{in instantiation of function template specialization 'Test1::h<unsigned int [10]>' requested here}}
337 
338 }
339 
340 // Don't diagnose access for overload candidates that aren't selected.
341 namespace PR7436 {
342 struct S1 {
343   void* operator new(size_t);
344   void operator delete(void* p);
345 
346 private:
347   void* operator new(size_t, void*); // expected-note {{declared private here}}
348   void operator delete(void*, void*);
349 };
350 class S2 {
351   void* operator new(size_t); // expected-note {{declared private here}}
352   void operator delete(void* p); // expected-note {{declared private here}}
353 };
354 
test(S1 * s1,S2 * s2)355 void test(S1* s1, S2* s2) {
356   delete s1;
357   delete s2; // expected-error {{is a private member}}
358   (void)new S1();
359   (void)new (0L) S1(); // expected-error {{is a private member}}
360   (void)new S2(); // expected-error {{is a private member}}
361 }
362 }
363 
364 namespace rdar8018245 {
365   struct X0 {
366     static const int value = 17;
367   };
368 
369   const int X0::value;
370 
371   struct X1 {
372     static int value;
373   };
374 
375   int X1::value;
376 
377   template<typename T>
f()378   int *f() {
379     return new (int[T::value]); // expected-warning{{when type is in parentheses, array cannot have dynamic size}}
380   }
381 
382   template int *f<X0>();
383   template int *f<X1>(); // expected-note{{in instantiation of}}
384 
385 }
386 
387 // <rdar://problem/8248780>
388 namespace Instantiate {
389   template<typename T> struct X {
390     operator T*();
391   };
392 
f(X<int> & xi)393   void f(X<int> &xi) {
394     delete xi;
395   }
396 }
397 
398 namespace PR7810 {
399   struct X {
400     // cv is ignored in arguments
401     static void operator delete(void *const);
402   };
403   struct Y {
404     // cv is ignored in arguments
405     static void operator delete(void *volatile);
406   };
407 }
408 
409 // Don't crash on template delete operators
410 namespace TemplateDestructors {
411   struct S {
~STemplateDestructors::S412     virtual ~S() {}
413 
414     void* operator new(const size_t size);
415     template<class T> void* operator new(const size_t, const int, T*);
416     void operator delete(void*, const size_t);
417     template<class T> void operator delete(void*, const size_t, const int, T*);
418   };
419 }
420 
421 namespace DeleteParam {
422   struct X {
423     void operator delete(X*); // expected-error{{first parameter of 'operator delete' must have type 'void *'}}
424   };
425 
426   struct Y {
427     void operator delete(void* const);
428   };
429 }
430 
431 // <rdar://problem/8427878>
432 // Test that the correct 'operator delete' is selected to pair with
433 // the unexpected placement 'operator new'.
434 namespace PairedDelete {
435   template <class T> struct A {
436     A();
437     void *operator new(size_t s, double d = 0);
438     void operator delete(void *p, double d);
operator deletePairedDelete::A439     void operator delete(void *p) {
440       T::dealloc(p);
441     }
442   };
443 
test()444   A<int> *test() {
445     return new A<int>();
446   }
447 }
448 
449 namespace PR7702 {
test1()450   void test1() {
451     new DoesNotExist; // expected-error {{unknown type name 'DoesNotExist'}}
452   }
453 }
454 
455 namespace ArrayNewNeedsDtor {
456   struct A { A(); private: ~A(); };
457 #if __cplusplus <= 199711L
458   // expected-note@-2 {{declared private here}}
459 #endif
460   struct B { B(); A a; };
461 #if __cplusplus <= 199711L
462   // expected-error@-2 {{field of type 'ArrayNewNeedsDtor::A' has private destructor}}
463 #else
464   // expected-note@-4 {{destructor of 'B' is implicitly deleted because field 'a' has an inaccessible destructor}}
465 #endif
466 
test9()467   B *test9() {
468     return new B[5];
469 #if __cplusplus <= 199711L
470     // expected-note@-2 {{implicit destructor for 'ArrayNewNeedsDtor::B' first required here}}
471 #else
472     // expected-error@-4 {{attempt to use a deleted function}}
473 #endif
474   }
475 }
476 
477 namespace DeleteIncompleteClass {
478   struct A; // expected-note {{forward declaration}}
479   extern A x;
f()480   void f() { delete x; } // expected-error {{deleting incomplete class type}}
481 }
482 
483 namespace DeleteIncompleteClassPointerError {
484   struct A; // expected-note {{forward declaration}}
f(A * x)485   void f(A *x) { 1+delete x; } // expected-warning {{deleting pointer to incomplete type}} \
486                                // expected-error {{invalid operands to binary expression}}
487 }
488 
489 namespace PR10504 {
490   struct A {
491     virtual void foo() = 0;
492   };
f(A * x)493   void f(A *x) { delete x; } // expected-warning {{delete called on 'PR10504::A' that is abstract but has non-virtual destructor}}
494 }
495 
496 struct PlacementArg {};
operator new[](size_t,const PlacementArg &)497 inline void *operator new[](size_t, const PlacementArg &) throw () {
498   return 0;
499 }
operator delete[](void *,const PlacementArg &)500 inline void operator delete[](void *, const PlacementArg &) throw () {
501 }
502 
503 namespace r150682 {
504 
505   template <typename X>
506   struct S {
507     struct Inner {};
Sr150682::S508     S() { new Inner[1]; }
509   };
510 
511   struct T {
512   };
513 
514   template<typename X>
tfn()515   void tfn() {
516     new (*(PlacementArg*)0) T[1]; // expected-warning 2 {{binding dereferenced null pointer to reference has undefined behavior}}
517   }
518 
fn()519   void fn() {
520     tfn<int>();  // expected-note {{in instantiation of function template specialization 'r150682::tfn<int>' requested here}}
521   }
522 
523 }
524 
525 namespace P12023 {
526   struct CopyCounter
527   {
528       CopyCounter();
529       CopyCounter(const CopyCounter&);
530   };
531 
main()532   int main()
533   {
534     CopyCounter* f = new CopyCounter[10](CopyCounter()); // expected-error {{cannot have initialization arguments}}
535       return 0;
536   }
537 }
538 
539 namespace PR12061 {
540   template <class C> struct scoped_array {
541     scoped_array(C* p = __null);
542   };
543   template <class Payload> struct Foo {
FooPR12061::Foo544     Foo() : a_(new scoped_array<int>[5]) { }
545     scoped_array< scoped_array<int> > a_;
546   };
547   class Bar {};
548   Foo<Bar> x;
549 
550   template <class C> struct scoped_array2 {
551     scoped_array2(C* p = __null, C* q = __null);
552   };
553   template <class Payload> struct Foo2 {
Foo2PR12061::Foo2554     Foo2() : a_(new scoped_array2<int>[5]) { }
555     scoped_array2< scoped_array2<int> > a_;
556   };
557   class Bar2 {};
558   Foo2<Bar2> x2;
559 
560   class MessageLoop {
561   public:
562     explicit MessageLoop(int type = 0);
563   };
564   template <class CookieStoreTestTraits>
565   class CookieStoreTest {
566   protected:
CookieStoreTest()567     CookieStoreTest() {
568       new MessageLoop;
569     }
570   };
571   struct CookieMonsterTestTraits {
572   };
573   class DeferredCookieTaskTest : public CookieStoreTest<CookieMonsterTestTraits>
574   {
DeferredCookieTaskTest()575     DeferredCookieTaskTest() {}
576   };
577 }
578 
579 class DeletingPlaceholder {
f()580   int* f() {
581     delete f; // expected-error {{reference to non-static member function must be called; did you mean to call it with no arguments?}}
582     return 0;
583   }
g(int,int)584   int* g(int, int) {
585     delete g; // expected-error {{reference to non-static member function must be called}}
586     return 0;
587   }
588 };
589 
590 namespace PR18544 {
591   inline void *operator new(size_t); // expected-error {{'operator new' cannot be declared inside a namespace}}
592 }
593 
594 // PR19968
595 inline void* operator new(); // expected-error {{'operator new' must have at least one parameter}}
596 
597 namespace {
598 template <class C>
599 struct A {
f__anon805b79610111::A600   void f() { this->::new; } // expected-error {{expected unqualified-id}}
g__anon805b79610111::A601   void g() { this->::delete; } // expected-error {{expected unqualified-id}}
602 };
603 }
604