|  | // RUN: %clang_cc1 %s -triple spir-unknown-unknown -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; | 
|  | } |