From 65e0ed2310a1b0d1a3255583bbfb8a8d86c5aea5 Mon Sep 17 00:00:00 2001 From: Sandra Loosemore Date: Sat, 24 May 2025 03:21:18 +0000 Subject: [PATCH] OpenMP: Fix ICE in metadirective recovery after error [PR120180] It's not clear whether a metadirective in a loop nest is supposed to be valid, but GCC certainly shouldn't be ICE'ing after diagnosing it as an error. gcc/c/ChangeLog PR c/120180 * c-parser.cc (c_parser_omp_metadirective): Only consume the token if it is the expected close paren. gcc/cp/ChangeLog PR c/120180 * parser.cc (cp_parser_omp_metadirective): Only consume the token if it is the expected close paren. gcc/testsuite/ChangeLog PR c/120180 * c-c++-common/gomp/pr120180.c: New. --- gcc/c/c-parser.cc | 7 ++++--- gcc/cp/parser.cc | 7 ++++--- gcc/testsuite/c-c++-common/gomp/pr120180.c | 22 ++++++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/gomp/pr120180.c diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 0d79f5832bf..92c94558ecc 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -29296,7 +29296,10 @@ c_parser_omp_metadirective (c_parser *parser, bool *if_p) goto add; case CPP_CLOSE_PAREN: if (nesting_depth-- == 0) - break; + { + c_parser_consume_token (parser); + break; + } goto add; default: add: @@ -29308,8 +29311,6 @@ c_parser_omp_metadirective (c_parser *parser, bool *if_p) break; } - c_parser_consume_token (parser); - if (!skip) { c_token eol_token; diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index d9fc5f76bc3..bac958fe145 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -51616,7 +51616,10 @@ cp_parser_omp_metadirective (cp_parser *parser, cp_token *pragma_tok, goto add; case CPP_CLOSE_PAREN: if (nesting_depth-- == 0) - break; + { + cp_lexer_consume_token (parser->lexer); + break; + } goto add; default: add: @@ -51628,8 +51631,6 @@ cp_parser_omp_metadirective (cp_parser *parser, cp_token *pragma_tok, break; } - cp_lexer_consume_token (parser->lexer); - if (!skip) { cp_token eol_token = {}; diff --git a/gcc/testsuite/c-c++-common/gomp/pr120180.c b/gcc/testsuite/c-c++-common/gomp/pr120180.c new file mode 100644 index 00000000000..cb5a0d5a819 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr120180.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +/* This test used to ICE after erroring on the metadirective in the + loop nest. */ + +int main() +{ + int blksize = 15000; + double *qq; + int i, k, nq; + + #pragma omp metadirective when(user={condition(0)}: target teams distribute parallel for collapse(2) map(qq[:0]) private(i)) \ + when(user={condition(0)}: target teams distribute parallel for map(qq[:0]) private(i)) \ + when(user={condition(1)}: target teams loop collapse(2) map(qq[:0]) private(i)) + for(k=0; k