aboutsummaryrefslogtreecommitdiff
path: root/test/CXX/expr/expr.unary/expr.new/p20-0x.cpp
diff options
context:
space:
mode:
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.cpp57
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