// 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 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; }