From 21f9ec0c6ad431e25e58dee6b9e6759ab7e74003 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 10 Mar 2006 17:47:08 -0500 Subject: [PATCH] re PR middle-end/26004 (gcc errors on valid code [SVO]) PR c/26004 * gimplify.c (gimplify_modify_expr_rhs): Don't do return slot opt if the target was declared 'register'. From-SVN: r111947 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 3 ++- gcc/testsuite/gcc.dg/pr26004.c | 11 +++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr26004.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8bb4a2af011..0d90fa2c091 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-03-10 Jason Merrill + + PR c/26004 + * gimplify.c (gimplify_modify_expr_rhs): Don't do return slot opt if + the target was declared 'register'. + 2006-03-10 Adam Nemet * genpreds.c (write_insn_constraint_len): Change definition of diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 4b58201004d..c9498eef95a 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -3295,7 +3295,8 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p, && needs_to_live_in_memory (*to_p)) /* It's OK to use the return slot directly unless it's an NRV. */ use_target = true; - else if (is_gimple_reg_type (TREE_TYPE (*to_p))) + else if (is_gimple_reg_type (TREE_TYPE (*to_p)) + || (DECL_P (*to_p) && DECL_REGISTER (*to_p))) /* Don't force regs into memory. */ use_target = false; else if (TREE_CODE (*to_p) == VAR_DECL diff --git a/gcc/testsuite/gcc.dg/pr26004.c b/gcc/testsuite/gcc.dg/pr26004.c new file mode 100644 index 00000000000..35e6a2feb93 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr26004.c @@ -0,0 +1,11 @@ +/* PR c/26004 */ +/* Bug: the return slot optimization was taking the address of s_3, + causing an error. */ + +struct s_3 { short s[3]; } z_3, s_3; +struct s_3 add_struct_3 (struct s_3 s){} +wack_struct_3 (void) +{ + int i; register struct s_3 u = z_3; + u = add_struct_3 (u); +} -- 2.30.2