decl.c (poplevel): Remove code to handle KEEP == 2.

* decl.c (poplevel): Remove code to handle KEEP == 2.
	(finish_function): Don't confuse BLOCK-order when
	processing a destructor.

From-SVN: r23755
This commit is contained in:
Mark Mitchell 1998-11-22 17:50:33 +00:00 committed by Mark Mitchell
parent ff0236af5a
commit 536333d40b
3 changed files with 45 additions and 15 deletions

View 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> 1998-11-21 Jason Merrill <jason@yorick.cygnus.com>
* decl.c (require_complete_types_for_parms): Call layout_decl * decl.c (require_complete_types_for_parms): Call layout_decl

View File

@ -1043,12 +1043,6 @@ pushlevel_temporary (tag_transparent)
and create a "block" (a BLOCK node) for the level and create a "block" (a BLOCK node) for the level
to record its declarations and subblocks for symbol table output. 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, 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 so create a block as if KEEP were set and also clear out all
label names. label names.
@ -1075,6 +1069,11 @@ poplevel (keep, reverse, functionbody)
tree decl; tree decl;
int block_previously_created; 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, GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
(HOST_WIDE_INT) current_binding_level->level_chain, (HOST_WIDE_INT) current_binding_level->level_chain,
current_binding_level->parm_flag, current_binding_level->parm_flag,
@ -1325,14 +1324,8 @@ poplevel (keep, reverse, functionbody)
must be carried forward so they will later become subblocks must be carried forward so they will later become subblocks
of something else. */ of something else. */
else if (subblocks) else if (subblocks)
{ current_binding_level->blocks
if (keep == 2) = chainon (current_binding_level->blocks, subblocks);
current_binding_level->blocks
= chainon (subblocks, current_binding_level->blocks);
else
current_binding_level->blocks
= chainon (current_binding_level->blocks, subblocks);
}
/* Take care of compiler's internal binding structures. */ /* Take care of compiler's internal binding structures. */
if (tmp == 2) if (tmp == 2)
@ -13302,7 +13295,7 @@ finish_function (lineno, call_poplevel, nested)
/* End of destructor. */ /* End of destructor. */
expand_end_bindings (NULL_TREE, getdecls () != NULL_TREE, 0); 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. */ /* Back to the top of destructor. */
/* Don't execute destructor code if `this' is NULL. */ /* Don't execute destructor code if `this' is NULL. */

View File

@ -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;