From d217355ec70102e776f09159d3831277b729affd Mon Sep 17 00:00:00 2001 From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Fri, 10 Mar 2006 22:47:08 +0000 Subject: [PATCH] PR c/26004 * gimplify.c (gimplify_modify_expr_rhs): Don't do return slot opt if the target was declared 'register'. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@111947 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 8bb4a2af011a..0d90fa2c0912 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-03-10 Jason Merrill <jason@redhat.com> + + 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 <anemet@caviumnetworks.com> * genpreds.c (write_insn_constraint_len): Change definition of diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 4b58201004d2..c9498eef95af 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 000000000000..35e6a2feb932 --- /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); +} -- GitLab