1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// RUN: %clang_cc1 -fsyntax-only -verify -fexceptions %s
2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotypedef __SIZE_TYPE__ size_t;
3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new with global lookup
5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I>
6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X0 {
7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X0();
8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new(size_t) {
10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return I; // expected-error{{cannot initialize}}
11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete(void*) {
14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = I; // expected-error{{cannot initialize}}
15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X0() {
19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  // Using the global operator new suppresses the search for a
20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  // operator delete in the class.
21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  ::new X0<2>;
22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new X0<3>; // expected-note 2{{instantiation}}
24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Operator delete template for placement new[] with global lookup
27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<int I>
28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct X1 {
29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  X1();
30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void* operator new[](size_t) {
32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    return I; // expected-error{{cannot initialize}}
33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  static void operator delete[](void*) {
36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao    int *ip = I; // expected-error{{cannot initialize}}
37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  }
38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao};
39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaovoid test_X1() {
41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  // Using the global operator new suppresses the search for a
42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  // operator delete in the class.
43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  ::new X1<2> [17];
44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao
45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao  new X1<3> [17]; // expected-note 2{{instantiation}}
46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}
47