Set fail parse state when parens.require_open fails for OpenMP for loop.

Fixes ICE present since GCC 14 (r14-3490-g53891f18f32588).
Compile (g++) the program below with fopenmp to see an
assertion error on cp_parser_omp_for_loop.

  void ice(){
    #pragma omp for
    for;
  }

        PR 125691

Successfully bootstrapped on my Intel machine.

gcc/cp/ChangeLog:

        * parser.cc (cp_parser_omp_loop_nest): Set error when
        a for loop does not open parenthesis.

gcc/testsuite/ChangeLog:

        * c-c++-common/gomp/pr125691.c: New test for PR 125691.

Signed-off-by: Léo Hardt <[email protected]>

---
 gcc/cp/parser.cc                           |  5 ++++-
 gcc/testsuite/c-c++-common/gomp/pr125691.c | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/c-c++-common/gomp/pr125691.c

diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 720dec6841e..aa4efbf64ea 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -49960,7 +49960,10 @@ cp_parser_omp_loop_nest (cp_parser *parser, bool *if_p)

   matching_parens parens;
   if (!parens.require_open (parser))
-    return NULL;
+    {
+      omp_for_parse_state->fail = true;
+      return NULL_TREE;
+    }

   init_placeholder = build_stmt (input_location, EXPR_STMT,
                                 integer_zero_node);
diff --git a/gcc/testsuite/c-c++-common/gomp/pr125691.c b/gcc/testsuite/c-c++-common/gomp/pr125691.c
new file mode 100644
index 00000000000..3a372fea44e
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/pr125691.c
@@ -0,0 +1,22 @@
+void f1_simd(){
+  #pragma omp simd
+  for; /* { dg-error {expected '\(' before} } */
+}
+
+void f2_simd(){
+  int i;
+  #pragma omp simd
+  for i = 0; /* { dg-error {expected '\(' before} } */
+}
+
+
+void f1_for(){
+  #pragma omp for
+  for; /* { dg-error {expected '\(' before} } */
+}
+
+void f2_for(){
+  int i;
+  #pragma omp for
+  for i = 0; /* { dg-error {expected '\(' before} } */
+}
--
2.47.3


Reply via email to