summaryrefslogtreecommitdiff
path: root/test/CXX/expr/expr.unary/expr.delete/p10.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/CXX/expr/expr.unary/expr.delete/p10.cpp')
-rw-r--r--test/CXX/expr/expr.unary/expr.delete/p10.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/test/CXX/expr/expr.unary/expr.delete/p10.cpp b/test/CXX/expr/expr.unary/expr.delete/p10.cpp
new file mode 100644
index 000000000000..aad2747dd32f
--- /dev/null
+++ b/test/CXX/expr/expr.unary/expr.delete/p10.cpp
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -std=c++1z -verify %s
+
+using size_t = decltype(sizeof(0));
+namespace std { enum class align_val_t : size_t {}; }
+
+// Aligned version is preferred over unaligned version,
+// unsized version is preferred over sized version.
+template<unsigned Align>
+struct alignas(Align) A {
+ void operator delete(void*);
+ void operator delete(void*, std::align_val_t) = delete; // expected-note {{here}}
+
+ void operator delete(void*, size_t) = delete;
+ void operator delete(void*, size_t, std::align_val_t) = delete;
+};
+void f(A<__STDCPP_DEFAULT_NEW_ALIGNMENT__> *p) { delete p; }
+void f(A<__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2> *p) { delete p; } // expected-error {{deleted}}
+
+template<unsigned Align>
+struct alignas(Align) B {
+ void operator delete(void*, size_t);
+ void operator delete(void*, size_t, std::align_val_t) = delete; // expected-note {{here}}
+};
+void f(B<__STDCPP_DEFAULT_NEW_ALIGNMENT__> *p) { delete p; }
+void f(B<__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2> *p) { delete p; } // expected-error {{deleted}}