From ba09d11a9d0ae2382bab715b102a7746d20dea6d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek <jakub@redhat.com> Date: Wed, 3 Mar 2021 09:55:19 +0100 Subject: c-family: Avoid ICE on va_arg [PR99324] build_va_arg calls the middle-end mark_addressable, which e.g. requires that cfun is non-NULL. The following patch calls instead c_common_mark_addressable_vec which is the c-family variant similarly to the FE c_mark_addressable and cxx_mark_addressable, except that it doesn't error on addresses of register variables. As the taking of the address is artificial for the .VA_ARG ifn and when that is lowered goes away, it is similar case to the vector subscripting for which c_common_mark_addressable_vec has been added. 2021-03-03 Jakub Jelinek <jakub@redhat.com> PR c/99324 * c-common.c (build_va_arg): Call c_common_mark_addressable_vec instead of mark_addressable. Fix a comment typo - neutrallly -> neutrally. * gcc.c-torture/compile/pr99324.c: New test. --- gcc/testsuite/gcc.c-torture/compile/pr99324.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr99324.c (limited to 'gcc/testsuite/gcc.c-torture') diff --git a/gcc/testsuite/gcc.c-torture/compile/pr99324.c b/gcc/testsuite/gcc.c-torture/compile/pr99324.c new file mode 100644 index 0000000..7a41e5c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr99324.c @@ -0,0 +1,19 @@ +/* PR c/99324 */ + +#include <stdarg.h> + +int +foo (int x, ...) +{ + va_list a; + va_start (a, x); + int b[6] = {}; + int bar (c) + int c[1][va_arg (a, int)]; + { + return sizeof c[0]; + } + int r = bar (b); + va_end (a); + return r; +} -- cgit v1.1