https://gcc.gnu.org/g:b368dd5de53fc981b5b20e2fd6d7de9116e82331

commit r15-9745-gb368dd5de53fc981b5b20e2fd6d7de9116e82331
Author: Sandra Loosemore <sloosem...@baylibre.com>
Date:   Sat May 24 03:21:18 2025 +0000

    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.
    
    (cherry picked from commit 65e0ed2310a1b0d1a3255583bbfb8a8d86c5aea5)

Diff:
---
 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(-)

diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index 22ec0f849b74..d825e059a94d 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -29247,7 +29247,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:
@@ -29259,8 +29262,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 3628cfefa07c..93ec030d8566 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -51568,7 +51568,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:
@@ -51580,8 +51583,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 000000000000..cb5a0d5a8191
--- /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<blksize; k++)
+    {
+#pragma omp metadirective when(user={condition(0)}: simd) default() // { 
dg-error "intervening code must not contain OpenMP directives" }
+      for (i=0; i<nq; i++)
+        qq[k*nq + i] = 0.0;
+    }
+  return 0;
+}

Reply via email to