// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=clc++ -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 C++ for OpenCL}} delete a; // expected-error {{'default delete' is not supported in C++ for OpenCL}} *pa = new (buffer) A; // expected-error {{use of placement new requires explicit declaration}} } // 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 C++ for OpenCL}} *a = new A[20]; // expected-error {{no matching function for call to 'operator new[]'}} delete[] *a; // expected-error {{'default delete' is not supported in C++ for OpenCL}} // 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; }