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

Reply via email to