summaryrefslogtreecommitdiff
path: root/clang/test/SemaOpenCLCXX
diff options
context:
space:
mode:
authorSven van Haastregt <sven.vanhaastregt@arm.com>2018-06-14 09:51:54 +0000
committerSven van Haastregt <sven.vanhaastregt@arm.com>2018-06-14 09:51:54 +0000
commiteed39401ba51fbb154a4b8adc58ff21a2d8cf790 (patch)
treed9c05c1397d04fc291ab8837a1df34ab75b861c7 /clang/test/SemaOpenCLCXX
parente39429dc59f50637eacb7a23a4a307e62e7c9611 (diff)
[OpenCL] Support new/delete in Sema
Reject uses of the default new/delete operators with a diagnostic instead of a crash in OpenCL C++ mode and accept user-defined forms. Differential Revision: https://reviews.llvm.org/D46651
Diffstat (limited to 'clang/test/SemaOpenCLCXX')
-rw-r--r--clang/test/SemaOpenCLCXX/newdelete.cl55
1 files changed, 55 insertions, 0 deletions
diff --git a/clang/test/SemaOpenCLCXX/newdelete.cl b/clang/test/SemaOpenCLCXX/newdelete.cl
new file mode 100644
index 00000000000..ce6273f3be7
--- /dev/null
+++ b/clang/test/SemaOpenCLCXX/newdelete.cl
@@ -0,0 +1,55 @@
+// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=c++ -pedantic -verify -fsyntax-only
+
+class A {
+ public:
+ A() : x(21) {}
+ int x;
+};
+
+typedef __SIZE_TYPE__ size_t;
+
+class B {
+ public:
+ B() : bx(42) {}
+ void *operator new(size_t);
+ void operator delete(void *ptr);
+ int bx;
+};
+
+// There are no global user-defined new operators at this point. Test that clang
+// rejects these gracefully.
+void test_default_new_delete(void *buffer, A **pa) {
+ A *a = new A; // expected-error {{'default new' is not supported in OpenCL C++}}
+ delete a; // expected-error {{'default delete' is not supported in OpenCL C++}}
+ *pa = new (buffer) A; // expected-error {{'default new' is not supported in OpenCL C++}}
+}
+
+// expected-note@+1 {{candidate function not viable: requires 2 arguments, but 1 was provided}}
+void *operator new(size_t _s, void *ptr) noexcept {
+ return ptr;
+}
+
+// expected-note@+1 {{candidate function not viable: requires 2 arguments, but 1 was provided}}
+void *operator new[](size_t _s, void *ptr) noexcept {
+ return ptr;
+}
+
+void test_new_delete(void *buffer, A **a, B **b) {
+ *a = new A; // expected-error {{no matching function for call to 'operator new'}}
+ delete a; // expected-error {{'default delete' is not supported in OpenCL C++}}
+
+ *a = new A[20]; // expected-error {{no matching function for call to 'operator new[]'}}
+ delete[] *a; // expected-error {{'default delete' is not supported in OpenCL C++}}
+
+ // User-defined placement new is supported.
+ *a = new (buffer) A;
+
+ // User-defined placement new[] is supported.
+ *a = new (buffer) A[30];
+
+ // User-defined new is supported.
+ *b = new B;
+
+ // User-defined delete is supported.
+ delete *b;
+}