Commit 536333d4 by Mark Mitchell Committed by Mark Mitchell

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
parent ff0236af
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
......
......@@ -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. */
......
// 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment