tree.c (mark_local_for_remap_p): Mark variables declared in TARGET_EXPRs as well.

* tree.c (mark_local_for_remap_p): Mark variables declared in
	TARGET_EXPRs as well.

From-SVN: r32675
This commit is contained in:
Mark Mitchell 2000-03-21 20:13:06 +00:00 committed by Mark Mitchell
parent b8de2d021a
commit ec47ccca04
3 changed files with 62 additions and 9 deletions

View File

@ -1,3 +1,8 @@
2000-03-21 Mark Mitchell <mark@codesourcery.com>
* tree.c (mark_local_for_remap_p): Mark variables declared in
TARGET_EXPRs as well.
2000-03-21 Nathan Sidwell <nathan@codesourcery.com>
* typeck.c (require_complete_type, complete_type,

View File

@ -2317,18 +2317,24 @@ mark_local_for_remap_r (tp, walk_subtrees, data)
{
tree t = *tp;
splay_tree st = (splay_tree) data;
tree decl;
if ((TREE_CODE (t) == DECL_STMT
&& nonstatic_local_decl_p (DECL_STMT_DECL (t)))
|| TREE_CODE (t) == LABEL_STMT)
if (TREE_CODE (t) == DECL_STMT
&& nonstatic_local_decl_p (DECL_STMT_DECL (t)))
decl = DECL_STMT_DECL (t);
else if (TREE_CODE (t) == LABEL_STMT)
decl = LABEL_STMT_LABEL (t);
else if (TREE_CODE (t) == TARGET_EXPR
&& nonstatic_local_decl_p (TREE_OPERAND (t, 0)))
decl = TREE_OPERAND (t, 0);
else
decl = NULL_TREE;
if (decl)
{
tree decl;
tree copy;
/* Figure out what's being declared. */
decl = (TREE_CODE (t) == DECL_STMT
? DECL_STMT_DECL (t) : LABEL_STMT_LABEL (t));
/* Make a copy. */
copy = copy_decl_for_inlining (decl,
DECL_CONTEXT (decl),
@ -2344,7 +2350,7 @@ mark_local_for_remap_r (tp, walk_subtrees, data)
}
/* Called via walk_tree when an expression is unsaved. Using the
splay_tree pointed to by ST (which is really a `splay_tree *'),
splay_tree pointed to by ST (which is really a `splay_tree'),
remaps all local declarations to appropriate replacements. */
static tree

View File

@ -0,0 +1,42 @@
// Origin: Mark Mitchell <mitchell@codesourcery.com>
// Special g++ Options: -O2
int i;
int j;
struct A
{
A ();
A (const A&);
~A ();
};
A::A ()
{
++i;
}
A::A (const A&)
{
++i;
}
A::~A ()
{
--i;
}
A f ()
{
return A ();
}
void g (const A&)
{
}
int main ()
{
g (f ());
return i;
}