]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
frontend: don't ice with pragma NOVECTOR if loop has no condition [PR113267]
authorTamar Christina <tamar.christina@arm.com>
Tue, 9 Jan 2024 11:19:24 +0000 (11:19 +0000)
committerTamar Christina <tamar.christina@arm.com>
Tue, 9 Jan 2024 11:19:24 +0000 (11:19 +0000)
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
gcc/testsuite/gcc.dg/pr113267.c [new file with mode: 0644]

index e7b74fb07f02d31a34fa1327e689eaaed0a4c99e..878f323dd2f7b8421f49cd69976e632e361f0e9c 100644 (file)
@@ -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 (file)
index 0000000..8b6fa08
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+void f (char *a, int i)
+{
+#pragma GCC novector
+  for (;;i++)
+    a[i] *= 2;
+}