| // RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=clc++ -fsyntax-only -verify |
| // RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=clc++ -fsyntax-only -verify -DFUNCPTREXT |
| |
| #ifdef FUNCPTREXT |
| #pragma OPENCL EXTENSION __cl_clang_function_pointers : enable |
| //expected-no-diagnostics |
| #endif |
| |
| // Test that virtual functions and abstract classes are rejected |
| // unless specific clang extension is used. |
| class virtual_functions { |
| virtual void bad1() {} |
| #ifndef FUNCPTREXT |
| //expected-error@-2 {{virtual functions are not supported in C++ for OpenCL}} |
| #endif |
| |
| virtual void bad2() = 0; |
| #ifndef FUNCPTREXT |
| //expected-error@-2 {{virtual functions are not supported in C++ for OpenCL}} |
| //expected-error@-3 {{'bad2' is not virtual and cannot be declared pure}} |
| #endif |
| }; |
| |
| template <typename T> |
| class X { |
| virtual T f(); |
| #ifndef FUNCPTREXT |
| //expected-error@-2 {{virtual functions are not supported in C++ for OpenCL}} |
| #endif |
| }; |
| |
| // Test that virtual base classes are allowed. |
| struct A { |
| int a; |
| void foo(); |
| }; |
| |
| struct B : virtual A { |
| int b; |
| }; |
| |
| struct C : public virtual A { |
| int c; |
| }; |
| |
| struct D : B, C { |
| int d; |
| }; |
| |
| kernel void virtual_inheritance() { |
| D d; |
| |
| d.foo(); |
| d.a = 11; |
| d.b = 22; |
| d.c = 33; |
| d.d = 44; |
| } |