PR middle-end/15054
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 May 2004 11:37:39 +0000 (11:37 +0000)
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 1 May 2004 11:37:39 +0000 (11:37 +0000)
* expr.c (expand_expr_real): Do not call preserve_temp_slots
on a TARGET_EXPR temp.
* function.c (assign_stack_temp_for_type): Set 'keep' flag for
TARGET_EXPR temp slots.

PR middle-end/15054
* g++.dg/opt/pr15054.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@81384 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr15054.C [new file with mode: 0644]

index 445e736..85f3b6c 100644 (file)
@@ -1,3 +1,11 @@
+2004-05-01  Ulrich Weigand  <uweigand@de.ibm.com>
+       
+       PR middle-end/15054
+       * expr.c (expand_expr_real): Do not call preserve_temp_slots 
+       on a TARGET_EXPR temp.
+       * function.c (assign_stack_temp_for_type): Set 'keep' flag for
+       TARGET_EXPR temp slots.
+
 2004-05-01  Paolo Bonzini  <bonzini@gnu.org>
 
        * simplify-rtx.c (simplify_ternary_operation): When
index 9f246dc..c19741b 100644 (file)
@@ -8537,8 +8537,6 @@ expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
            else
              {
                target = assign_temp (type, 2, 0, 1);
-               /* All temp slots at this level must not conflict.  */
-               preserve_temp_slots (target);
                SET_DECL_RTL (slot, target);
                if (TREE_ADDRESSABLE (slot))
                  put_var_into_stack (slot, /*rescan=*/false);
index b1f888f..8eeebfb 100644 (file)
@@ -780,7 +780,7 @@ assign_stack_temp_for_type (enum machine_mode mode, HOST_WIDE_INT size, int keep
   if (keep == 2)
     {
       p->level = target_temp_slot_level;
-      p->keep = 0;
+      p->keep = 1;
     }
   else if (keep == 3)
     {
index e8f8eed..596e8ed 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-01  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       PR middle-end/15054
+       * g++.dg/opt/pr15054.C: New test.
+
 2004-04-30  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * gcc.dg/torture/builtin-rounding-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/pr15054.C b/gcc/testsuite/g++.dg/opt/pr15054.C
new file mode 100644 (file)
index 0000000..cfc48cf
--- /dev/null
@@ -0,0 +1,36 @@
+// PR middle-end/15054
+// This used to abort due to overlapping stack temporaries.
+
+// { dg-do run }
+// { dg-options "-O" }
+
+extern "C" void abort (void);
+
+struct pointer
+{
+  void* ptr;
+
+  pointer(void* x = 0) : ptr(x) {}
+  pointer(const pointer& x) : ptr(x.ptr) {}
+};
+
+struct element
+{
+  int canary;
+
+  element() : canary(123) { }
+  ~element() { pointer(); if (canary != 123) abort (); }
+};
+
+inline pointer
+insert(const element& x)
+{
+  return pointer(new element(x));
+}
+
+int
+main (void)
+{
+  insert(element());
+  return 0;
+}