* decl.c (poplevel): Remove code to handle KEEP == 2.
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 22 Nov 1998 17:50:33 +0000 (17:50 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 22 Nov 1998 17:50:33 +0000 (17:50 +0000)
(finish_function): Don't confuse BLOCK-order when
processing a destructor.

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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.old-deja/g++.other/debug2.C [new file with mode: 0644]

index 2345a06..15b37aa 100644 (file)
@@ -1,3 +1,9 @@
+1998-11-22  Mark Mitchell  <mark@markmitchell.com>
+
+       * decl.c (poplevel): Remove code to handle KEEP == 2.
+       (finish_function): Don't confuse BLOCK-order when
+       processing a destructor.
+
 1998-11-21  Jason Merrill  <jason@yorick.cygnus.com>
 
        * decl.c (require_complete_types_for_parms): Call layout_decl
index 0d95092..d50c5ea 100644 (file)
@@ -1043,12 +1043,6 @@ pushlevel_temporary (tag_transparent)
    and create a "block" (a BLOCK node) for the level
    to record its declarations and subblocks for symbol table output.
 
-   If KEEP == 2, this level's subblocks go to the front,
-   not the back of the current binding level.  This happens,
-   for instance, when code for constructors and destructors
-   need to generate code at the end of a function which must
-   be moved up to the front of the function.
-
    If FUNCTIONBODY is nonzero, this level is the body of a function,
    so create a block as if KEEP were set and also clear out all
    label names.
@@ -1075,6 +1069,11 @@ poplevel (keep, reverse, functionbody)
   tree decl;
   int block_previously_created;
 
+  /* We used to use KEEP == 2 to indicate that the new block should go
+     at the beginning of the list of blocks at this binding level,
+     rather than the end.  This hack is no longer used.  */
+  my_friendly_assert (keep == 0 || keep == 1, 0);
+
   GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
                      (HOST_WIDE_INT) current_binding_level->level_chain,
                      current_binding_level->parm_flag,
@@ -1325,14 +1324,8 @@ poplevel (keep, reverse, functionbody)
      must be carried forward so they will later become subblocks
      of something else.  */
   else if (subblocks)
-    {
-      if (keep == 2)
-       current_binding_level->blocks
-         = chainon (subblocks, current_binding_level->blocks);
-      else
-       current_binding_level->blocks
-         = chainon (current_binding_level->blocks, subblocks);
-    }
+    current_binding_level->blocks
+      = chainon (current_binding_level->blocks, subblocks);
 
   /* Take care of compiler's internal binding structures.  */
   if (tmp == 2)
@@ -13302,7 +13295,7 @@ finish_function (lineno, call_poplevel, nested)
 
          /* End of destructor.  */
          expand_end_bindings (NULL_TREE, getdecls () != NULL_TREE, 0);
-         poplevel (2, 0, 0);   /* XXX change to 1 */
+         poplevel (getdecls () != NULL_TREE, 0, 0);
 
          /* Back to the top of destructor.  */
          /* Don't execute destructor code if `this' is NULL.  */
diff --git a/gcc/testsuite/g++.old-deja/g++.other/debug2.C b/gcc/testsuite/g++.old-deja/g++.other/debug2.C
new file mode 100644 (file)
index 0000000..200aeb3
--- /dev/null
@@ -0,0 +1,31 @@
+// Build don't link:
+// Special g++ Options: -funroll-loops -O2 -g
+
+inline void f()
+{
+  typedef int T;
+}
+
+inline void g()
+{
+  typedef double U;
+}
+
+int n;
+
+struct B
+{
+  ~B() { 
+    for (int i = 0; i < n; ++i)
+      g(); 
+  }
+};
+
+struct D : public B {
+  ~D() { 
+    for (int j = 0; j < n; ++j)
+      f(); 
+  }
+};
+
+D d;