optimize.c (copy_body_r): Clear the operand three of a TARGET_EXPR when copying it.
* optimize.c (copy_body_r): Clear the operand three of a TARGET_EXPR when copying it. From-SVN: r31435
This commit is contained in:
parent
a2be868fba
commit
ef97bf6bdd
3 changed files with 43 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2000-01-14 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
|
* optimize.c (copy_body_r): Clear the operand three of a
|
||||||
|
TARGET_EXPR when copying it.
|
||||||
|
|
||||||
2000-01-14 Martin v. Löwis <loewis@informatik.hu-berlin.de>
|
2000-01-14 Martin v. Löwis <loewis@informatik.hu-berlin.de>
|
||||||
|
|
||||||
* method.c (build_decl_overload_real): Check whether we are in ::
|
* method.c (build_decl_overload_real): Check whether we are in ::
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Perform optimizations on tree structure.
|
/* Perform optimizations on tree structure.
|
||||||
|
|
||||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
|
||||||
Written by Mark Michell (mark@codesourcery.com).
|
Written by Mark Michell (mark@codesourcery.com).
|
||||||
|
|
||||||
This file is part of GNU CC.
|
This file is part of GNU CC.
|
||||||
|
@ -285,6 +285,9 @@ copy_body_r (tp, walk_subtrees, data)
|
||||||
/* Replace this variable with the copy. */
|
/* Replace this variable with the copy. */
|
||||||
*tp = new_decl;
|
*tp = new_decl;
|
||||||
}
|
}
|
||||||
|
else if (nonstatic_local_decl_p (*tp)
|
||||||
|
&& DECL_CONTEXT (*tp) != VARRAY_TREE (id->fns, 0))
|
||||||
|
my_friendly_abort (0);
|
||||||
else if (TREE_CODE (*tp) == SAVE_EXPR)
|
else if (TREE_CODE (*tp) == SAVE_EXPR)
|
||||||
remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0),
|
remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0),
|
||||||
walk_subtrees);
|
walk_subtrees);
|
||||||
|
@ -303,7 +306,10 @@ copy_body_r (tp, walk_subtrees, data)
|
||||||
/* The copied TARGET_EXPR has never been expanded, even if the
|
/* The copied TARGET_EXPR has never been expanded, even if the
|
||||||
original node was expanded already. */
|
original node was expanded already. */
|
||||||
if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
|
if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
|
||||||
TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
|
{
|
||||||
|
TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
|
||||||
|
TREE_OPERAND (*tp, 3) = NULL_TREE;
|
||||||
|
}
|
||||||
/* Similarly, if we're copying a CALL_EXPR, the RTL for the
|
/* Similarly, if we're copying a CALL_EXPR, the RTL for the
|
||||||
result is no longer valid. */
|
result is no longer valid. */
|
||||||
else if (TREE_CODE (*tp) == CALL_EXPR)
|
else if (TREE_CODE (*tp) == CALL_EXPR)
|
||||||
|
|
30
gcc/testsuite/g++.old-deja/g++.other/inline5.C
Normal file
30
gcc/testsuite/g++.old-deja/g++.other/inline5.C
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// Build don't link:
|
||||||
|
// Origin: Matt Austern <austern@isolde.engr.sgi.com>
|
||||||
|
// Special g++ Options: -O2
|
||||||
|
|
||||||
|
class X;
|
||||||
|
|
||||||
|
extern X* tab1;
|
||||||
|
|
||||||
|
struct Y {
|
||||||
|
explicit Y(int);
|
||||||
|
};
|
||||||
|
|
||||||
|
void* x ();
|
||||||
|
|
||||||
|
Y k (void *);
|
||||||
|
|
||||||
|
inline void f() { k (x ()); }
|
||||||
|
|
||||||
|
inline void* x ()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void g() {
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void h() {
|
||||||
|
f();
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue