• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
4 typedef __SIZE_TYPE__ size_t;
5 
6 namespace std { enum class align_val_t : size_t {}; }
7 
8 struct 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 
testS()15 void testS() {
16   S* p = new (0) S; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}}
17 }
18 
19 struct 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 
testT()28 void testT() {
29   T* p = new (0) T; // ok
30 }
31 
32 #if __cplusplus > 201402L
33 struct 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 
testU()40 void 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 
44 struct 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 
testV()53 void testV() {
54   V* p = new (0, std::align_val_t(0)) V;
55 }
56 
57 struct 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 
testW()65 void 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