Clang Project

clang_source_code/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fexceptions %s
2// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -fexceptions %s
3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z -fexceptions %s
4typedef __SIZE_TYPE__ size_t;
5
6namespace std { enum class align_val_t : size_t {}; }
7
8struct S {
9  // Placement allocation function:
10  static void* operator new(size_t, size_t);
11  // Usual (non-placement) deallocation function:
12  static void operator delete(void*, size_t); // expected-note{{declared here}}
13};
14
15void testS() {
16  S* p = new (0) S; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}}
17}
18
19struct T {
20  // Placement allocation function:
21  static void* operator new(size_t, size_t);
22  // Usual (non-placement) deallocation function:
23  static void operator delete(void*);
24  // Placement deallocation function:
25  static void operator delete(void*, size_t);
26};
27
28void testT() {
29  T* p = new (0) T; // ok
30}
31
32#if __cplusplus > 201402L
33struct U {
34  // Placement allocation function:
35  static void* operator new(size_t, size_t, std::align_val_t);
36  // Placement deallocation function:
37  static void operator delete(void*, size_t, std::align_val_t); // expected-note{{declared here}}
38};
39
40void testU() {
41  U* p = new (0, std::align_val_t(0)) U; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}}
42}
43
44struct V {
45  // Placement allocation function:
46  static void* operator new(size_t, size_t, std::align_val_t);
47  // Usual (non-placement) deallocation function:
48  static void operator delete(void*, std::align_val_t);
49  // Placement deallocation function:
50  static void operator delete(void*, size_t, std::align_val_t);
51};
52
53void testV() {
54  V* p = new (0, std::align_val_t(0)) V;
55}
56
57struct W {
58  // Placement allocation function:
59  static void* operator new(size_t, size_t, std::align_val_t);
60  // Usual (non-placement) deallocation functions:
61  static void operator delete(void*);
62  static void operator delete(void*, size_t, std::align_val_t); // expected-note {{declared here}}
63};
64
65void testW() {
66  W* p = new (0, std::align_val_t(0)) W; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}}
67}
68#endif
69