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