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:
parent
ff0236af5a
commit
536333d40b
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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;
|
Loading…
Reference in New Issue