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