// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fexceptions %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -fexceptions %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z -fexceptions %s typedef __SIZE_TYPE__ size_t; namespace std { enum class align_val_t : size_t {}; } struct S { // Placement allocation function: static void* operator new(size_t, size_t); // Usual (non-placement) deallocation function: static void operator delete(void*, size_t); // expected-note{{declared here}} }; void testS() { S* p = new (0) S; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}} } struct T { // Placement allocation function: static void* operator new(size_t, size_t); // Usual (non-placement) deallocation function: static void operator delete(void*); // Placement deallocation function: static void operator delete(void*, size_t); }; void testT() { T* p = new (0) T; // ok } #if __cplusplus > 201402L struct U { // Placement allocation function: static void* operator new(size_t, size_t, std::align_val_t); // Placement deallocation function: static void operator delete(void*, size_t, std::align_val_t); // expected-note{{declared here}} }; void testU() { U* p = new (0, std::align_val_t(0)) U; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}} } struct V { // Placement allocation function: static void* operator new(size_t, size_t, std::align_val_t); // Usual (non-placement) deallocation function: static void operator delete(void*, std::align_val_t); // Placement deallocation function: static void operator delete(void*, size_t, std::align_val_t); }; void testV() { V* p = new (0, std::align_val_t(0)) V; } struct W { // Placement allocation function: static void* operator new(size_t, size_t, std::align_val_t); // Usual (non-placement) deallocation functions: static void operator delete(void*); static void operator delete(void*, size_t, std::align_val_t); // expected-note {{declared here}} }; void testW() { W* p = new (0, std::align_val_t(0)) W; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}} } #endif