new-delete.cpp revision 7002f4c03c2d0544f4e8bea8d3a5636519081e35
1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// RUN: %clang_cc1 -fsyntax-only -verify %s
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include <stddef.h>
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct S // expected-note {{candidate}}
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  S(int, int, double); // expected-note {{candidate}}
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  S(double, int); // expected-note 2 {{candidate}}
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  S(float, int); // expected-note 2 {{candidate}}
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct T; // expected-note{{forward declaration of 'T'}}
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct U
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // A special new, to verify that the global version isn't used.
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void* operator new(size_t, S*); // expected-note {{candidate}}
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct V : U
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PR5823
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(const size_t); // expected-note 2 {{candidate}}
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(size_t, int*); // expected-note 3 {{candidate}}
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(size_t, float*); // expected-note 3 {{candidate}}
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid* operator new(size_t, S); // expected-note 2 {{candidate}}
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid good_news()
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int *pi = new int;
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  float *pf = new (pi) float();
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  pi = new int(1);
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  pi = new int('c');
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const int *pci = new const int();
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  S *ps = new S(1, 2, 3.4);
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ps = new (pf) (S)(1, 2, 3.4);
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  S *(*paps)[2] = new S*[*pi][2];
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ps = new (S[3])(1, 2, 3.4);
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  typedef int ia4[4];
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ia4 *pai = new (int[3][4]);
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  pi = ::new int;
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  U *pu = new (ps) U;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  V *pv = new (ps) V;
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  pi = new (S(1.0f, 2)) int;
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int[true];
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct abstract {
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual ~abstract() = 0;
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid bad_news(int *ip)
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  int i = 1;
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new; // expected-error {{missing type specifier}}
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new 4; // expected-error {{missing type specifier}}
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new () int; // expected-error {{expected expression}}
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int[1.1]; // expected-error {{array size expression must have integral or enumerated type, not 'double'}}
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int[1][i]; // expected-error {{only the first dimension}}
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new (int[1][i]); // expected-error {{only the first dimension}}
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new (int[i]); // expected-error {{when type is in parentheses}}
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int(*(S*)0); // expected-error {{no viable conversion from 'S' to 'int'}}
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int(1, 2); // expected-error {{excess elements in scalar initializer}}
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new S(1); // expected-error {{no matching constructor}}
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new S(1, 1); // expected-error {{call to constructor of 'S' is ambiguous}}
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new const int; // expected-error {{default initialization of an object of const type 'int const'}}
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new float*(ip); // expected-error {{cannot initialize a new value of type 'float *' with an lvalue of type 'int *'}}
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // Undefined, but clang should reject it directly.
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int[-1]; // expected-error {{array size is negative}}
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumerated type, not 'S'}}
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)::S::new int; // expected-error {{expected unqualified-id}}
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}}
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}}
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // This must fail, because the member version shouldn't be found.
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)::new ((S*)0) U; // expected-error {{no matching function for call to 'operator new'}}
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // This must fail, because any member version hides all global versions.
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new U; // expected-error {{no matching function for call to 'operator new'}}
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new (int[]); // expected-error {{array size must be specified in new expressions}}
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  (void)new int&; // expected-error {{cannot allocate reference type 'int &' with new}}
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  // Some lacking cases due to lack of sema support.
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid good_deletes()
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete (int*)0;
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete [](int*)0;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete (S*)0;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ::delete (int*)0;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid bad_deletes()
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete 0; // expected-error {{cannot delete expression of type 'int'}}
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete [0] (int*)0; // expected-error {{expected ']'}} \
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      // expected-note {{to match this '['}}
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete (void*)0; // expected-error {{cannot delete expression}}
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete (T*)0; // expected-warning {{deleting pointer to incomplete type}}
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  ::S::delete (int*)0; // expected-error {{expected unqualified-id}}
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X0 { };
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X1 {
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  operator int*();
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  operator float();
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X2 {
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  operator int*(); // expected-note {{candidate function}}
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  operator float*(); // expected-note {{candidate function}}
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid test_delete_conv(X0 x0, X1 x1, X2 x2) {
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete x0; // expected-error{{cannot delete}}
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete x1;
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete x2; // expected-error{{ambiguous conversion of delete expression of type 'X2' to a pointer}}
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// PR4782
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X3 {
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void operator delete(void * mem, size_t size);
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X4 {
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void release(X3 *x);
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void operator delete(void * mem, size_t size);
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid X4::release(X3 *x) {
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete x;
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X5 {
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void Destroy() const { delete this; }
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Base {
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void *operator new(signed char) throw(); // expected-error {{'operator new' takes type size_t}}
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static int operator new[] (size_t) throw(); // expected-error {{operator new[]' must return type 'void *'}}
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Tier {};
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Comp : public Tier {};
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Thai : public Base {
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Thai(const Tier *adoptDictionary);
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid loadEngineFor() {
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  const Comp *dict;
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  new Thai(dict);
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtemplate <class T> struct TBase {
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void* operator new(T size, int); // expected-error {{'operator new' cannot take a dependent type as first parameter; use size_t}}
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovTBase<int> t1;
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X6 {
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X7 {
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void operator delete(void*, int); // expected-note {{member found by ambiguous name lookup}}
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X8 : public X6, public X7 {
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f(X8 *x8) {
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete x8; // expected-error {{member 'operator delete' found in multiple base classes of different types}}
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X9 {
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void operator delete(void*, float); // expected-note {{'operator delete' declared here}}
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f(X9 *x9) {
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete x9; // expected-error {{no suitable member 'operator delete' in 'X9'}}
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X10 {
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  virtual ~X10();
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}}
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void operator delete(void*, int); // expected-note {{'operator delete' declared here}}
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f() {
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  X11 x11; // expected-note {{implicit default destructor for 'X11' first required here}}
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X12 {
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void* operator new(size_t, void*);
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstruct X13 : X12 {
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  using X12::operator new;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovstatic void* f(void* g)
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return new (g) X13();
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass X14 {
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static void operator delete(void*, const size_t);
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid f(X14 *x14a, X14 *x14b) {
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  delete x14a;
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovnamespace PR5918 { // Look for template operator new overloads.
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  struct S { template<typename T> static void* operator new(size_t, T); };
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  void test() {
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    (void)new(0) S;
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov