diff options
Diffstat (limited to 'test/CXX/expr/expr.unary/expr.new/p20-0x.cpp')
-rw-r--r-- | test/CXX/expr/expr.unary/expr.new/p20-0x.cpp | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp b/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp index eca1ec790199..13676a8a07ce 100644 --- a/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp +++ b/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp @@ -1,6 +1,10 @@ // 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); @@ -9,5 +13,56 @@ struct S { }; void testS() { - S* p = new (0) S; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}} + 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 |