From ba09d11a9d0ae2382bab715b102a7746d20dea6d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek 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 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/c-family/c-common.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'gcc/c-family/c-common.c') diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 088626d..d227686 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -4553,7 +4553,7 @@ build_va_arg (location_t loc, tree expr, tree type) if (canon_va_type == NULL_TREE) error_at (loc, "first argument to % not of type %"); - /* Let's handle things neutrallly, if expr: + /* Let's handle things neutrally, if expr: - has undeclared type, or - is not an va_list type. */ return build_va_arg_1 (loc, type, error_mark_node); @@ -4565,7 +4565,7 @@ build_va_arg (location_t loc, tree expr, tree type) /* Take the address, to get '&ap'. Note that &ap is not a va_list type. */ - mark_addressable (expr); + c_common_mark_addressable_vec (expr); expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (expr)), expr); return build_va_arg_1 (loc, type, expr); @@ -4627,7 +4627,7 @@ build_va_arg (location_t loc, tree expr, tree type) /* Take the address, to get '&ap'. Make sure it's a pointer to array elem type. */ - mark_addressable (expr); + c_common_mark_addressable_vec (expr); expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (canon_va_type)), expr); -- cgit v1.1