From 109f2316725bd74d85279fa749e5ea59686ad320 Mon Sep 17 00:00:00 2001 From: Tamar Christina Date: Tue, 9 Jan 2024 11:19:24 +0000 Subject: [PATCH] frontend: don't ice with pragma NOVECTOR if loop has no condition [PR113267] In C you can have loops without a condition, the original version of the patch was rejecting the use of #pragma GCC novector, however during review it was changed to not due this with the reason that we didn't want to give a compile error with such cases. However because annotations seem to be only be allowed on conditions (unless I'm mistaken?) the attached example ICEs because there's no condition. This will have it ignore the pragma instead of ICEing. I don't know if this is the best solution, but as far as I can tell we can't attach the annotation to anything else. gcc/c/ChangeLog: PR c/113267 * c-parser.cc (c_parser_for_statement): Skip the pragma is no cond. gcc/testsuite/ChangeLog: PR c/113267 * gcc.dg/pr113267.c: New test. --- gcc/c/c-parser.cc | 2 +- gcc/testsuite/gcc.dg/pr113267.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr113267.c diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index e7b74fb07f0..878f323dd2f 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -8445,7 +8445,7 @@ c_parser_for_statement (c_parser *parser, bool ivdep, unsigned short unroll, build_int_cst (integer_type_node, annot_expr_unroll_kind), build_int_cst (integer_type_node, unroll)); - if (novector && cond != error_mark_node) + if (novector && cond && cond != error_mark_node) cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond, build_int_cst (integer_type_node, annot_expr_no_vector_kind), diff --git a/gcc/testsuite/gcc.dg/pr113267.c b/gcc/testsuite/gcc.dg/pr113267.c new file mode 100644 index 00000000000..8b6fa08324e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr113267.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ + +void f (char *a, int i) +{ +#pragma GCC novector + for (;;i++) + a[i] *= 2; +}