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