re PR tree-optimization/60895 (error: address taken, but ADDRESSABLE bit not set)
authorRichard Biener <rguenther@suse.de>
Wed, 23 Apr 2014 08:27:00 +0000 (08:27 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 23 Apr 2014 08:27:00 +0000 (08:27 +0000)
2014-04-23  Richard Biener  <rguenther@suse.de>

PR middle-end/60895
* tree-inline.c (declare_return_variable): Use mark_addressable.

* g++.dg/torture/pr60895.C: New testcase.

From-SVN: r209675

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

index bac9f35fa7eb1587cfe0ce64e108ebf65c9e381c..9f8200fcca49c7368b814bb5e08374231fff909b 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-23  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60895
+       * tree-inline.c (declare_return_variable): Use mark_addressable.
+
 2014-04-23  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/60891
index 8f1bfc6bee314958b9b604752fd0381eed49b4f8..d05337748b0092f262e72031350c82ded18fe661 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-23  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60895
+       * g++.dg/torture/pr60895.C: New testcase.
+
 2014-04-23  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/60891
diff --git a/gcc/testsuite/g++.dg/torture/pr60895.C b/gcc/testsuite/g++.dg/torture/pr60895.C
new file mode 100644 (file)
index 0000000..0edd36a
--- /dev/null
@@ -0,0 +1,32 @@
+// { dg-do compile }
+
+struct C
+{
+  double elems[3];
+};
+
+C
+foo ()
+{
+  C a;
+  double *f = a.elems;
+  int b;
+  for (; b;)
+    {
+      *f = 0;
+      ++f;
+    }
+  return a;
+}
+
+struct J
+{
+  C c;
+  __attribute__((always_inline)) J () : c (foo ()) {}
+};
+
+void
+bar ()
+{
+  J ();
+}
index a0832b4e7d429c89c8454add8cfcdf3ec48b84ad..802d25fd71a5260c9652832e6ffb14fdee75a508 100644 (file)
@@ -3120,7 +3120,8 @@ declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest,
        {
          var = return_slot;
          gcc_assert (TREE_CODE (var) != SSA_NAME);
-         TREE_ADDRESSABLE (var) |= TREE_ADDRESSABLE (result);
+         if (TREE_ADDRESSABLE (result))
+           mark_addressable (var);
        }
       if ((TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE
            || TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE)