tree.c (get_callee_fndecl): Only use DECL_ABSTRACT_ORIGIN if it has DECL_SAVED_TREE.
* tree.c (get_callee_fndecl): Only use DECL_ABSTRACT_ORIGIN if it has DECL_SAVED_TREE. From-SVN: r47615
This commit is contained in:
parent
0839863cfa
commit
be1bb2a4da
@ -1,5 +1,8 @@
|
|||||||
2001-12-04 Alexandre Oliva <aoliva@redhat.com>
|
2001-12-04 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
|
* tree.c (get_callee_fndecl): Only use DECL_ABSTRACT_ORIGIN if
|
||||||
|
it has DECL_SAVED_TREE.
|
||||||
|
|
||||||
* c-decl.c (duplicate_decls): Revert rth's patch. If newdecl
|
* c-decl.c (duplicate_decls): Revert rth's patch. If newdecl
|
||||||
is in a different binding level, get its abstract origin to be
|
is in a different binding level, get its abstract origin to be
|
||||||
olddecl.
|
olddecl.
|
||||||
|
17
gcc/tree.c
17
gcc/tree.c
@ -4379,12 +4379,21 @@ get_callee_fndecl (call)
|
|||||||
if (TREE_CODE (addr) == ADDR_EXPR
|
if (TREE_CODE (addr) == ADDR_EXPR
|
||||||
&& TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL)
|
&& TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL)
|
||||||
{
|
{
|
||||||
addr = TREE_OPERAND (addr, 0);
|
tree fn = TREE_OPERAND (addr, 0);
|
||||||
|
|
||||||
if (! DECL_INITIAL (addr) && DECL_ABSTRACT_ORIGIN (addr))
|
/* If fn is a declaration of a function in a nested scope that
|
||||||
addr = DECL_ABSTRACT_ORIGIN (addr);
|
was globally declared inline, we don't set its DECL_INITIAL.
|
||||||
|
However, we can't blindly follow DECL_ABSTRACT_ORIGIN because
|
||||||
|
the C++ front-end uses it for cdtors to refer to their
|
||||||
|
internal declarations, that are not real functions.
|
||||||
|
Fortunately those don't have trees to be saved, so we can tell by
|
||||||
|
checking their DECL_SAVED_TREE. */
|
||||||
|
if (! DECL_INITIAL (fn)
|
||||||
|
&& DECL_ABSTRACT_ORIGIN (fn)
|
||||||
|
&& DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
|
||||||
|
fn = DECL_ABSTRACT_ORIGIN (fn);
|
||||||
|
|
||||||
return addr;
|
return fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We couldn't figure out what was being called. */
|
/* We couldn't figure out what was being called. */
|
||||||
|
Loading…
Reference in New Issue
Block a user