Author: OHNope Date: 2026-08-02T14:06:31Z New Revision: 7ed5bbedff3fa9dae894c2d939c7936f7a51a91f
URL: https://github.com/llvm/llvm-project/commit/7ed5bbedff3fa9dae894c2d939c7936f7a51a91f DIFF: https://github.com/llvm/llvm-project/commit/7ed5bbedff3fa9dae894c2d939c7936f7a51a91f.diff LOG: [Clang][OpenMP] Skip Sema actions for invalid assumption clauses (#212822) Do not call the Sema actions for absent, contains, and nullary assumption clauses after the parser has diagnosed that the clause is not allowed on the current directive. Add assertions documenting that these Sema actions must only receive clauses allowed on the current directive, and add tests covering all affected clause kinds. Fixes #212780. Added: clang/test/SemaOpenMP/invalid-clause-on-directive.c Modified: clang/lib/Parse/ParseOpenMP.cpp Removed: clang/test/SemaOpenMP/gh197162.c ################################################################################ diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index dd2dc60a99156..6b4a6017669b2 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -3569,8 +3569,9 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, } while (TryConsumeToken(tok::comma)); RLoc = Tok.getLocation(); T.consumeClose(); - Clause = Actions.OpenMP().ActOnOpenMPDirectivePresenceClause( - CKind, DKVec, Loc, LLoc, RLoc); + if (!WrongDirective) + Clause = Actions.OpenMP().ActOnOpenMPDirectivePresenceClause( + CKind, DKVec, Loc, LLoc, RLoc); break; } case OMPC_no_openmp: @@ -3584,8 +3585,9 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, ErrorFound = true; } SourceLocation Loc = ConsumeToken(); - Clause = Actions.OpenMP().ActOnOpenMPNullaryAssumptionClause( - CKind, Loc, Tok.getLocation()); + if (!WrongDirective) + Clause = Actions.OpenMP().ActOnOpenMPNullaryAssumptionClause( + CKind, Loc, Tok.getLocation()); break; } case OMPC_ompx_attribute: diff --git a/clang/test/SemaOpenMP/gh197162.c b/clang/test/SemaOpenMP/gh197162.c deleted file mode 100644 index ffdf2ec3c3d8e..0000000000000 --- a/clang/test/SemaOpenMP/gh197162.c +++ /dev/null @@ -1,6 +0,0 @@ -// RUN: %clang_cc1 -fopenmp -fsyntax-only -verify %s - -void foo() { -#pragma omp taskloop transparent // expected-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} - for(int i = 0; i < 2; i++); -} diff --git a/clang/test/SemaOpenMP/invalid-clause-on-directive.c b/clang/test/SemaOpenMP/invalid-clause-on-directive.c new file mode 100644 index 0000000000000..a7c60f1b8224e --- /dev/null +++ b/clang/test/SemaOpenMP/invalid-clause-on-directive.c @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fsyntax-only -verify %s + +void test(void) { +#pragma omp taskloop transparent // expected-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}} + for (int i = 0; i < 2; ++i) + ; + +#pragma omp parallel absent(target) // expected-error {{unexpected OpenMP clause 'absent' in directive '#pragma omp parallel'}} + {} + +#pragma omp parallel contains(target) // expected-error {{unexpected OpenMP clause 'contains' in directive '#pragma omp parallel'}} + {} + +#pragma omp parallel no_openmp // expected-error {{unexpected OpenMP clause 'no_openmp' in directive '#pragma omp parallel'}} + {} + +#pragma omp parallel no_openmp_routines // expected-error {{unexpected OpenMP clause 'no_openmp_routines' in directive '#pragma omp parallel'}} + {} + +#pragma omp parallel no_openmp_constructs // expected-error {{unexpected OpenMP clause 'no_openmp_constructs' in directive '#pragma omp parallel'}} + {} + +#pragma omp parallel no_parallelism // expected-error {{unexpected OpenMP clause 'no_parallelism' in directive '#pragma omp parallel'}} + {} +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
