c: [PR32122] Require pointer types for computed gotos
authorAndrew Pinski <apinski@marvell.com>
Fri, 17 Sep 2021 04:59:03 +0000 (04:59 +0000)
committerAndrew Pinski <apinski@marvell.com>
Tue, 28 Sep 2021 20:01:14 +0000 (20:01 +0000)
commite12f66d96fe41c8ef8a0d01b6a8394cd6bce3978
treefa2b27371e00155ebf3f6ee89a78f8cee7ffb4a1
parentc44c5f3d9f46705a262911c2098c1568d7e8ac2d
c: [PR32122] Require pointer types for computed gotos

So GCC has always accepted non-pointer types in computed gotos but
that was wrong based on the documentation:
Any expression of type void * is allowed.

So this fixes the problem by requiring the type to
be a pointer type.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

PR c/32122

gcc/c/ChangeLog:

* c-parser.c (c_parser_statement_after_labels): Pass
the c_expr instead of the tree to c_finish_goto_ptr.
* c-typeck.c (c_finish_goto_ptr): Change the second
argument type to c_expr.
* c-tree.h (c_finish_goto_ptr): Likewise.
Error out if the expression was not of a pointer type.

gcc/testsuite/ChangeLog:

* gcc.dg/comp-goto-5.c: New test.
* gcc.dg/comp-goto-6.c: New test.
gcc/c/c-parser.c
gcc/c/c-tree.h
gcc/c/c-typeck.c
gcc/testsuite/gcc.dg/comp-goto-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/comp-goto-6.c [new file with mode: 0644]