aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorJustas Janickas <Justas.Janickas@arm.com>2021-08-06 13:50:13 +0100
committerJustas Janickas <Justas.Janickas@arm.com>2021-08-13 13:55:22 +0100
commitcfdfb75c1ff354471bcea5fad872e40e345016ae (patch)
tree68d21b3c67de54f1cef328df067036155cf330b5 /clang/lib
parentc46546bd521b7c3f98a1620c9227e80dc94a5a3c (diff)
downloadllvm-cfdfb75c1ff354471bcea5fad872e40e345016ae.zip
llvm-cfdfb75c1ff354471bcea5fad872e40e345016ae.tar.gz
llvm-cfdfb75c1ff354471bcea5fad872e40e345016ae.tar.bz2
[OpenCL] Clang diagnostics allow reporting C++ for OpenCL version.
Some Clang diagnostics could only report OpenCL C version. Because C++ for OpenCL can be used as an alternative to OpenCL C, the text for diagnostics should reflect that. Desrciptions modified for these diagnostics: `err_opencl_unknown_type_specifier` `warn_option_invalid_ocl_version` `err_attribute_requires_opencl_version` `warn_opencl_attr_deprecated_ignored` `ext_opencl_ext_vector_type_rgba_selector` Differential Revision: https://reviews.llvm.org/D107648
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Basic/LangOptions.cpp10
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp5
-rw-r--r--clang/lib/Parse/ParseDecl.cpp5
-rw-r--r--clang/lib/Sema/SemaDecl.cpp3
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp8
5 files changed, 20 insertions, 11 deletions
diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp
index bebf317..169b679 100644
--- a/clang/lib/Basic/LangOptions.cpp
+++ b/clang/lib/Basic/LangOptions.cpp
@@ -56,6 +56,16 @@ void LangOptions::remapPathPrefix(SmallString<256> &Path) const {
break;
}
+std::string LangOptions::getOpenCLVersionString() const {
+ std::string Result;
+ {
+ llvm::raw_string_ostream Out(Result);
+ Out << (OpenCLCPlusPlus ? "C++ for OpenCL" : "OpenCL C") << " version "
+ << getOpenCLVersionTuple().getAsString();
+ }
+ return Result;
+}
+
FPOptions FPOptions::defaultWithoutTrailingStorage(const LangOptions &LO) {
FPOptions result(LO);
return result;
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 692e685..83dc6ec 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -503,9 +503,10 @@ static bool FixupInvocation(CompilerInvocation &Invocation,
// -cl-strict-aliasing needs to emit diagnostic in the case where CL > 1.0.
// This option should be deprecated for CL > 1.0 because
// this option was added for compatibility with OpenCL 1.0.
- if (Args.getLastArg(OPT_cl_strict_aliasing) && LangOpts.OpenCLVersion > 100)
+ if (Args.getLastArg(OPT_cl_strict_aliasing) &&
+ (LangOpts.OpenCLCPlusPlus || LangOpts.OpenCLVersion > 100))
Diags.Report(diag::warn_option_invalid_ocl_version)
- << LangOpts.getOpenCLVersionTuple().getAsString()
+ << LangOpts.getOpenCLVersionString()
<< Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 22fbfdd..7ff32e2 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -4182,9 +4182,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
<< FixItHint::CreateRemoval(
SourceRange(Loc, DS.getEndLoc()));
else if (DiagID == diag::err_opencl_unknown_type_specifier) {
- Diag(Loc, DiagID) << getLangOpts().OpenCLCPlusPlus
- << getLangOpts().getOpenCLVersionTuple().getAsString()
- << PrevSpec << isStorageClass;
+ Diag(Loc, DiagID) << getLangOpts().getOpenCLVersionString() << PrevSpec
+ << isStorageClass;
} else
Diag(Loc, DiagID) << PrevSpec;
}
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 2f7cbdb..00a4642 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -7330,10 +7330,9 @@ NamedDecl *Sema::ActOnVariableDeclarator(
DeclSpec::TSCS TSC = D.getDeclSpec().getThreadStorageClassSpec();
if (TSC != TSCS_unspecified) {
- bool IsCXX = getLangOpts().OpenCLCPlusPlus;
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
diag::err_opencl_unknown_type_specifier)
- << IsCXX << getLangOpts().getOpenCLVersionTuple().getAsString()
+ << getLangOpts().getOpenCLVersionString()
<< DeclSpec::getSpecifierName(TSC) << 1;
NewVD->setInvalidDecl();
}
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 30132a2..203180d 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -7488,12 +7488,12 @@ static void handleInternalLinkageAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
}
static void handleOpenCLNoSVMAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
- if (S.LangOpts.OpenCLVersion != 200)
+ if (S.LangOpts.OpenCLVersion < 200 && !S.LangOpts.OpenCLCPlusPlusVersion)
S.Diag(AL.getLoc(), diag::err_attribute_requires_opencl_version)
- << AL << "2.0" << 0;
+ << AL << "2.0" << 1;
else
- S.Diag(AL.getLoc(), diag::warn_opencl_attr_deprecated_ignored) << AL
- << "2.0";
+ S.Diag(AL.getLoc(), diag::warn_opencl_attr_deprecated_ignored)
+ << AL << S.LangOpts.getOpenCLVersionString();
}
static void handleOpenCLAccessAttr(Sema &S, Decl *D, const ParsedAttr &AL) {