r330579 - [OpenCL] Reject virtual functions for OpenCL C++
Sven van Haastregt via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 23 04:23:47 PDT 2018
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 at -1 {{virtual functions are not supported in OpenCL C++}}
+
+ virtual void bad2() = 0;
+ //expected-error at -1 {{virtual functions are not supported in OpenCL C++}}
+ //expected-error at -2 {{'bad2' is not virtual and cannot be declared pure}}
+};
+
+template <typename T>
+class X {
+ virtual T f();
+ //expected-error at -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;
+}
More information about the cfe-commits
mailing list