Hi All, It looks like I forgot to check in the C++ frontend if a condition exist for the loop being adorned with novector. This causes a segfault because cond isn't expected to be null.
This fixes it by issuing the same kind of diagnostics we issue for the other pragmas. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Ok for master? and backport to GCC-14? Thanks, Tamar gcc/cp/ChangeLog: PR c++/115623 * parser.cc (cp_parser_c_for): Add check for C++ cond. gcc/testsuite/ChangeLog: PR c++/115623 * g++.dg/vect/vect-novector-pragma_2.cc: New test. --- diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index e7409b856f1127e303c6515a3bb2d61a10e7c378..24d7b0e4992fdff69951ac5955f304e473f53374 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -14107,6 +14107,12 @@ cp_parser_c_for (cp_parser *parser, tree scope, tree init, bool ivdep, "%<GCC unroll%> pragma"); condition = error_mark_node; } + else if (novector) + { + cp_parser_error (parser, "missing loop condition in loop with " + "%<GCC novector%> pragma"); + condition = error_mark_node; + } finish_for_cond (condition, stmt, ivdep, unroll, novector); /* Look for the `;'. */ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); diff --git a/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc b/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc new file mode 100644 index 0000000000000000000000000000000000000000..05dba4db1c6544bc53cd05482d1b2e767052cf43 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +void f (char *a, int i) +{ +#pragma GCC novector + for (;;i++) + a[i] *= 2; +} + +/* { dg-error "missing loop condition in loop with 'GCC novector' pragma before ';' token" "" { target *-*-* } 6 } */ --
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index e7409b856f1127e303c6515a3bb2d61a10e7c378..24d7b0e4992fdff69951ac5955f304e473f53374 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -14107,6 +14107,12 @@ cp_parser_c_for (cp_parser *parser, tree scope, tree init, bool ivdep, "%<GCC unroll%> pragma"); condition = error_mark_node; } + else if (novector) + { + cp_parser_error (parser, "missing loop condition in loop with " + "%<GCC novector%> pragma"); + condition = error_mark_node; + } finish_for_cond (condition, stmt, ivdep, unroll, novector); /* Look for the `;'. */ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); diff --git a/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc b/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc new file mode 100644 index 0000000000000000000000000000000000000000..05dba4db1c6544bc53cd05482d1b2e767052cf43 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/vect-novector-pragma_2.cc @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +void f (char *a, int i) +{ +#pragma GCC novector + for (;;i++) + a[i] *= 2; +} + +/* { dg-error "missing loop condition in loop with 'GCC novector' pragma before ';' token" "" { target *-*-* } 6 } */