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@+1{{expected identifier or string literal}} + // expected-error@+1{{expected identifier or string literal in OpenACC 'bind' clause}} #pragma acc routine(BCP1) seq bind() + // expected-error@+1{{expected identifier or string literal in OpenACC 'bind' clause}} +#pragma acc routine(BCP1) seq bind(1) + + // expected-error@+1{{expected identifier or string literal in OpenACC 'bind' clause}} +#pragma acc routine(BCP1) gang bind(0xF) + // expected-error@+1{{expected function or lambda declaration for 'routine' construct}} #pragma acc routine seq bind("ReductionClauseParsing") _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits