summaryrefslogtreecommitdiffstats
path: root/clang/test/CXX/expr/expr.unary/expr.delete/p10.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-10-10 18:54:32 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-10-10 18:54:32 +0000
commitb2f0f057421309b628d51b4c260392d228c4993a (patch)
treea84dd329ce0b998b0c23edfd026e2c7c85156e7e /clang/test/CXX/expr/expr.unary/expr.delete/p10.cpp
parent50a92304aaa558130521129ab81fc8397efd5ee0 (diff)
downloadbcm5719-llvm-b2f0f057421309b628d51b4c260392d228c4993a.tar.gz
bcm5719-llvm-b2f0f057421309b628d51b4c260392d228c4993a.zip
Re-commit r283722, reverted in r283750, with a fix for a CUDA-specific use of
past-the-end iterator. Original commit message: P0035R4: Semantic analysis and code generation for C++17 overaligned allocation. llvm-svn: 283789
Diffstat (limited to 'clang/test/CXX/expr/expr.unary/expr.delete/p10.cpp')
-rw-r--r--clang/test/CXX/expr/expr.unary/expr.delete/p10.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/test/CXX/expr/expr.unary/expr.delete/p10.cpp b/clang/test/CXX/expr/expr.unary/expr.delete/p10.cpp
new file mode 100644
index 00000000000..aad2747dd32
--- /dev/null
+++ b/clang/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}}
OpenPOWER on IntegriCloud