Author: svenvh Date: Mon Apr 23 04:23:47 2018 New Revision: 330579 URL: http://llvm.org/viewvc/llvm-project?rev=330579&view=rev Log: [OpenCL] Reject virtual functions for OpenCL C++
Differential Revision: https://reviews.llvm.org/D45873 Added: cfe/trunk/test/Parser/opencl-cxx-virtual.cl Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td cfe/trunk/include/clang/Basic/LangOptions.def cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/lib/Parse/ParseDecl.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=330579&r1=330578&r2=330579&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Mon Apr 23 04:23:47 2018 @@ -1073,6 +1073,10 @@ def err_opencl_taking_function_address_p def err_opencl_logical_exclusive_or : Error< "^^ is a reserved operator in OpenCL">; +// OpenCL C++. +def err_openclcxx_virtual_function : Error< + "virtual functions are not supported in OpenCL C++">; + // OpenMP support. def warn_pragma_omp_ignored : Warning< "unexpected '#pragma omp ...' in program">, InGroup<SourceUsesOpenMP>, DefaultIgnore; Modified: cfe/trunk/include/clang/Basic/LangOptions.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=330579&r1=330578&r2=330579&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/LangOptions.def (original) +++ cfe/trunk/include/clang/Basic/LangOptions.def Mon Apr 23 04:23:47 2018 @@ -189,6 +189,7 @@ LANGOPT(ShortEnums , 1, 0, "short LANGOPT(OpenCL , 1, 0, "OpenCL") LANGOPT(OpenCLVersion , 32, 0, "OpenCL C version") +LANGOPT(OpenCLCPlusPlus , 1, 0, "OpenCL C++") LANGOPT(OpenCLCPlusPlusVersion , 32, 0, "OpenCL C++ version") LANGOPT(NativeHalfType , 1, 0, "Native half type support") LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns") Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=330579&r1=330578&r2=330579&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Apr 23 04:23:47 2018 @@ -1927,6 +1927,7 @@ void CompilerInvocation::setLangDefaults Opts.setDefaultFPContractMode(LangOptions::FPC_On); Opts.NativeHalfType = 1; Opts.NativeHalfArgsAndReturns = 1; + Opts.OpenCLCPlusPlus = Opts.CPlusPlus; // Include default header file for OpenCL. if (Opts.IncludeDefaultHeader) { PPOpts.Includes.push_back("opencl-c.h"); Modified: cfe/trunk/lib/Parse/ParseDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=330579&r1=330578&r2=330579&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) +++ cfe/trunk/lib/Parse/ParseDecl.cpp Mon Apr 23 04:23:47 2018 @@ -3466,7 +3466,15 @@ void Parser::ParseDeclarationSpecifiers( isInvalid = DS.setFunctionSpecInline(Loc, PrevSpec, DiagID); break; case tok::kw_virtual: - isInvalid = DS.setFunctionSpecVirtual(Loc, PrevSpec, DiagID); + // OpenCL C++ v1.0 s2.9: the virtual function qualifier is not supported. + if (getLangOpts().OpenCLCPlusPlus) { + DiagID = diag::err_openclcxx_virtual_function; + PrevSpec = Tok.getIdentifierInfo()->getNameStart(); + isInvalid = true; + } + else { + isInvalid = DS.setFunctionSpecVirtual(Loc, PrevSpec, DiagID); + } break; case tok::kw_explicit: isInvalid = DS.setFunctionSpecExplicit(Loc, PrevSpec, DiagID); Added: cfe/trunk/test/Parser/opencl-cxx-virtual.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/opencl-cxx-virtual.cl?rev=330579&view=auto ============================================================================== --- cfe/trunk/test/Parser/opencl-cxx-virtual.cl (added) +++ cfe/trunk/test/Parser/opencl-cxx-virtual.cl Mon Apr 23 04:23:47 2018 @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 %s -triple spir-unknown-unknown -cl-std=c++ -fsyntax-only -verify + +// Test that virtual functions and abstract classes are rejected. +class virtual_functions { + virtual void bad1() {} + //expected-error@-1 {{virtual functions are not supported in OpenCL C++}} + + virtual void bad2() = 0; + //expected-error@-1 {{virtual functions are not supported in OpenCL C++}} + //expected-error@-2 {{'bad2' is not virtual and cannot be declared pure}} +}; + +template <typename T> +class X { + virtual T f(); + //expected-error@-1 {{virtual functions are not supported in OpenCL C++}} +}; + +// 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; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits