1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify -fexceptions %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotypedef __SIZE_TYPE__ size_t;
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Overloaded operator delete with two arguments
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I>
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0 {
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X0();
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t);
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*, size_t) {
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = I; // expected-error{{cannot initialize}}
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X0() {
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new X0<1>; // expected-note{{instantiation}}
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Overloaded operator delete with one argument
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I>
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X1 {
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X1();
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t);
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*) {
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = I; // expected-error{{cannot initialize}}
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X1() {
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new X1<1>; // expected-note{{instantiation}}
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Overloaded operator delete for placement new
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I>
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X2 {
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X2();
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t, double, double);
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t, int, int);
40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*, const int, int) {
42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = I; // expected-error{{cannot initialize}}
43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*, double, double);
46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X2() {
49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new (0, 0) X2<1>; // expected-note{{instantiation}}
50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new
53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X3 {
54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X3();
55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t, double, double);
57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  template<typename T>
59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*, T x, T) {
60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    double *dp = &x;
61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = &x; // expected-error{{cannot initialize}}
62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
64ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
65ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X3() {
66ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new (0, 0) X3; // expected-note{{instantiation}}
67ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
68ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
69ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new in global scope.
70ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X4 {
71ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X4();
72ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t, double, double);
73ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
74ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
75ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
76ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator delete(void*, T x, T) {
77ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  double *dp = &x;
78ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  int *ip = &x; // expected-error{{cannot initialize}}
79ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
80ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
81ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X4() {
82ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new (0, 0) X4; // expected-note{{instantiation}}
83ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
84ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
85ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Useless operator delete hides global operator delete template.
86ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X5 {
87ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X5();
88ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t, double, double);
89ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  void operator delete(void*, double*, double*);
90ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
91ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
92ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X5() {
93ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new (0, 0) X5; // okay, we found X5::operator delete but didn't pick it
94ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
95ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
96ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new
97ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I>
98ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X6 {
99ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X6();
100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t) {
102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return I; // expected-error{{cannot initialize}}
103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*) {
106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = I; // expected-error{{cannot initialize}}
107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X6() {
111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new X6<3>; // expected-note 2{{instantiation}}
112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid *operator new(size_t, double, double, double);
115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T>
117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid operator delete(void*, T x, T, T) {
118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  double *dp = &x;
119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  int *ip = &x; // expected-error{{cannot initialize}}
120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_int_new() {
122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new (1.0, 1.0, 1.0) int; // expected-note{{instantiation}}
123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// We don't need an operator delete if the type has a trivial
126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// constructor, since we know that constructor cannot throw.
127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// FIXME: Is this within the standard? Seems fishy, but both EDG+GCC do it.
128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#if 0
129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I>
130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X7 {
131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t);
132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*, size_t) {
133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = I; // okay, since it isn't instantiated.
134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X7() {
138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new X7<1>;
139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#endif
141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
142