69 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fexceptions %s2// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -fexceptions %s3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z -fexceptions %s4typedef __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; // ok30}31 32#if __cplusplus > 201402L33struct 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#endif69