This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR56768
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 2 Apr 2013 13:55:58 +0200 (CEST)
- Subject: [PATCH] Fix PR56768
This backports a fix to fix PR56768.
Bootstrapped on the 4.7 branch, testing in progress.
Richard.
2013-04-02 Richard Biener <rguenther@suse.de>
PR middle-end/56768
Backport from mainline
2012-05-16 Richard Guenther <rguenther@suse.de>
* tree-inline.c (declare_return_variable): Properly handle
DECL_BY_REFERENCE return vars in SSA form.
* g++.dg/torture/pr56768.C: New testcase.
Index: gcc/tree-inline.c
===================================================================
--- gcc/tree-inline.c (revision 196818)
+++ gcc/tree-inline.c (working copy)
@@ -2983,10 +2983,15 @@ declare_return_variable (copy_body_data
if (gimple_in_ssa_p (id->src_cfun))
add_referenced_var (temp);
insert_decl_map (id, result, temp);
- /* When RESULT_DECL is in SSA form, we need to use it's default_def
- SSA_NAME. */
- if (gimple_in_ssa_p (id->src_cfun) && gimple_default_def (id->src_cfun, result))
- temp = remap_ssa_name (gimple_default_def (id->src_cfun, result), id);
+ /* When RESULT_DECL is in SSA form, we need to remap and initialize
+ it's default_def SSA_NAME. */
+ if (gimple_in_ssa_p (id->src_cfun)
+ && is_gimple_reg (result))
+ {
+ temp = make_ssa_name (temp, NULL);
+ insert_decl_map (id, gimple_default_def (id->src_cfun, result),
+ temp);
+ }
insert_init_stmt (id, entry_bb, gimple_build_assign (temp, var));
}
else
Index: gcc/testsuite/g++.dg/torture/pr56768.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr56768.C (revision 0)
+++ gcc/testsuite/g++.dg/torture/pr56768.C (working copy)
@@ -0,0 +1,40 @@
+// { dg-do compile }
+
+struct Iter
+{
+ int& operator* ();
+ void operator++ ();
+};
+
+bool operator!= (Iter &, Iter &) { }
+
+struct Container
+{
+ Iter begin () const;
+ Iter end () const;
+};
+
+struct J
+{
+ virtual J *mutable_child ();
+};
+
+struct M
+{
+ M (const Container &);
+ J ns_;
+};
+namespace
+{
+ J MakeNamespace (const Container &src)
+ {
+ J a;
+ J *b = 0;
+ for (const int &c: src)
+ b = b ? b->mutable_child () : &a;
+ return a;
+ }
+}
+M::M (const Container &ns):ns_ (MakeNamespace (ns))
+{
+}