[clang] 0eb8a92 - [OpenMP] Fix tentative parsing crash with metadirective (#139901)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 14 07:19:28 PDT 2025
Author: Aaron Ballman
Date: 2025-05-14T10:19:24-04:00
New Revision: 0eb8a92ce9a55059b06bf456b53971bb62246a9f
URL: https://github.com/llvm/llvm-project/commit/0eb8a92ce9a55059b06bf456b53971bb62246a9f
DIFF: https://github.com/llvm/llvm-project/commit/0eb8a92ce9a55059b06bf456b53971bb62246a9f.diff
LOG: [OpenMP] Fix tentative parsing crash with metadirective (#139901)
There were two crashes that have the same root cause: not correctly
handling unexpected tokens. In one case, we were failing to return early
which caused us to parse a paren as a regular token instead of a special
token, causing an assertion. The other case was failing to commit or
revert the tentative parse action when not getting a paren when one was
expected.
Fixes #139665
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Parse/ParseOpenMP.cpp
clang/test/OpenMP/metadirective_messages.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 81cf369fe4440..191cb5e95f125 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -946,6 +946,10 @@ OpenMP Support
- Fixed a crashing bug with a malformed ``cancel`` directive. (#GH139360)
- Fixed a crashing bug with ``omp distribute dist_schedule`` if the argument to
``dist_schedule`` was not strictly positive. (#GH139266)
+- Fixed two crashing bugs with a malformed ``metadirective`` directive. One was
+ a crash if the next token after ``metadirective`` was a paren, bracket, or
+ brace. The other was if the next token after the meta directive was not an
+ open parenthesis. (#GH139665)
Improvements
^^^^^^^^^^^^
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index c409409602e75..d7840d97e8d9b 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -2666,8 +2666,12 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
? OMPC_unknown
: getOpenMPClauseKind(PP.getSpelling(Tok));
// Check if the clause is unrecognized.
- if (CKind == OMPC_unknown)
+ if (CKind == OMPC_unknown) {
Diag(Tok, diag::err_omp_expected_clause) << "metadirective";
+ TPA.Revert();
+ SkipUntil(tok::annot_pragma_openmp_end);
+ return Directive;
+ }
if (getLangOpts().OpenMP < 52 && CKind == OMPC_otherwise)
Diag(Tok, diag::err_omp_unexpected_clause)
<< getOpenMPClauseName(CKind) << "metadirective";
@@ -2678,8 +2682,11 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
// Parse '('.
if (T.expectAndConsume(diag::err_expected_lparen_after,
- getOpenMPClauseName(CKind).data()))
+ getOpenMPClauseName(CKind).data())) {
+ TPA.Revert();
+ SkipUntil(tok::annot_pragma_openmp_end);
return Directive;
+ }
OMPTraitInfo &TI = Actions.getASTContext().getNewOMPTraitInfo();
if (CKind == OMPC_when) {
diff --git a/clang/test/OpenMP/metadirective_messages.cpp b/clang/test/OpenMP/metadirective_messages.cpp
index a248e9a4e82a9..9d2934f8b1e10 100644
--- a/clang/test/OpenMP/metadirective_messages.cpp
+++ b/clang/test/OpenMP/metadirective_messages.cpp
@@ -49,3 +49,13 @@ void foo() {
;
#endif
}
+
+namespace GH139665 {
+void f(){
+#pragma omp metadirective( // expected-error {{expected at least one clause on '#pragma omp metadirective' directive}}
+}
+
+void g() {
+#pragma omp metadirective align // expected-error {{expected '(' after 'align'}}
+}
+} // namespace GH139665
More information about the cfe-commits
mailing list