OSDN Git Service

2013-04-02 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Apr 2013 12:25:00 +0000 (12:25 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Apr 2013 12:25:00 +0000 (12:25 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@197351 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr56768.C [new file with mode: 0644]
gcc/tree-inline.c

index 2249e50..25743df 100644 (file)
@@ -1,3 +1,12 @@
+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.
+
 2013-04-01  Wei Mi  <wmi@google.com>
 
        * config/i386/i386.md (*ashl<mode>3_mask): Rewrite as define_insn.
index d608dd7..bb5eae3 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-02  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/56768
+       * g++.dg/torture/pr56768.C: New testcase.
+
 2013-04-01  Andrey Belevantsev  <abel@ispras.ru>
 
        Backport from mainline
diff --git a/gcc/testsuite/g++.dg/torture/pr56768.C b/gcc/testsuite/g++.dg/torture/pr56768.C
new file mode 100644 (file)
index 0000000..db504c5
--- /dev/null
@@ -0,0 +1,41 @@
+// { dg-do compile }
+// { dg-options "-std=c++0x" }
+
+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))
+{
+}
index 5854bd9..b869364 100644 (file)
@@ -2983,10 +2983,15 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest,
       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