[clang] ccbba2c - [OpenACC] Fix assert when parsing 'bind' clause
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 12 08:51:19 PDT 2025
Author: erichkeane
Date: 2025-05-12T08:51:15-07:00
New Revision: ccbba2cdb96c3814863a7746b81c744d2a6d65d5
URL: https://github.com/llvm/llvm-project/commit/ccbba2cdb96c3814863a7746b81c744d2a6d65d5
DIFF: https://github.com/llvm/llvm-project/commit/ccbba2cdb96c3814863a7746b81c744d2a6d65d5.diff
LOG: [OpenACC] Fix assert when parsing 'bind' clause
I'd misunderstood how the ParseStringLiteralExpression function worked,
so I assumed it would catch non-string literals, however it instead
asserted. This patch now checks for that case and diagnoses.
Fixes: #139346
Added:
Modified:
clang/include/clang/Basic/DiagnosticParseKinds.td
clang/lib/Parse/ParseOpenACC.cpp
clang/test/ParserOpenACC/parse-clauses.c
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 3bbdc49946dac..fd525140d0482 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1469,7 +1469,8 @@ def err_acc_expected_reduction_operator
def err_acc_invalid_reduction_operator
: Error<"invalid reduction operator, expected '+', '*', 'max', 'min', "
"'&', '|', '^', '&&', or '||'">;
-def err_acc_incorrect_bind_arg : Error<"expected identifier or string literal">;
+def err_acc_incorrect_bind_arg
+ : Error<"expected identifier or string literal in OpenACC 'bind' clause">;
def err_acc_modifier
: Error<"%enum_select<ACCModifier>{%Unknown{unknown}|%Duplicate{duplicate}}"
"0 modifier %1 in OpenACC modifier-list on '%2' clause">;
diff --git a/clang/lib/Parse/ParseOpenACC.cpp b/clang/lib/Parse/ParseOpenACC.cpp
index 3843e1ad51cf5..e1da86a3a72fd 100644
--- a/clang/lib/Parse/ParseOpenACC.cpp
+++ b/clang/lib/Parse/ParseOpenACC.cpp
@@ -1429,6 +1429,11 @@ Parser::ParseOpenACCBindClauseArgument() {
return II;
}
+ if (!tok::isStringLiteral(getCurToken().getKind())) {
+ Diag(getCurToken(), diag::err_acc_incorrect_bind_arg);
+ return std::monostate{};
+ }
+
ExprResult Res =
getActions().CorrectDelayedTyposInExpr(ParseStringLiteralExpression(
/*AllowUserDefinedLiteral=*/false, /*Unevaluated=*/true));
diff --git a/clang/test/ParserOpenACC/parse-clauses.c b/clang/test/ParserOpenACC/parse-clauses.c
index 52d5828c510ba..6d771e858d243 100644
--- a/clang/test/ParserOpenACC/parse-clauses.c
+++ b/clang/test/ParserOpenACC/parse-clauses.c
@@ -1345,9 +1345,15 @@ void bar();
#pragma acc routine seq bind
void BCP1();
- // expected-error at +1{{expected identifier or string literal}}
+ // expected-error at +1{{expected identifier or string literal in OpenACC 'bind' clause}}
#pragma acc routine(BCP1) seq bind()
+ // expected-error at +1{{expected identifier or string literal in OpenACC 'bind' clause}}
+#pragma acc routine(BCP1) seq bind(1)
+
+ // expected-error at +1{{expected identifier or string literal in OpenACC 'bind' clause}}
+#pragma acc routine(BCP1) gang bind(0xF)
+
// expected-error at +1{{expected function or lambda declaration for 'routine' construct}}
#pragma acc routine seq bind("ReductionClauseParsing")
More information about the cfe-commits
mailing list