diff options
author | Sven van Haastregt <sven.vanhaastregt@arm.com> | 2018-06-14 09:51:54 +0000 |
---|---|---|
committer | Sven van Haastregt <sven.vanhaastregt@arm.com> | 2018-06-14 09:51:54 +0000 |
commit | eed39401ba51fbb154a4b8adc58ff21a2d8cf790 (patch) | |
tree | d9c05c1397d04fc291ab8837a1df34ab75b861c7 /clang/test/SemaOpenCLCXX | |
parent | e39429dc59f50637eacb7a23a4a307e62e7c9611 (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.cl | 55 |
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; +} |