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:
Alexandre Oliva 2001-12-04 17:11:05 +00:00 committed by Alexandre Oliva
parent 0839863cfa
commit be1bb2a4da
2 changed files with 16 additions and 4 deletions

View File

@ -1,5 +1,8 @@
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
is in a different binding level, get its abstract origin to be
olddecl.

View File

@ -4379,12 +4379,21 @@ get_callee_fndecl (call)
if (TREE_CODE (addr) == ADDR_EXPR
&& 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))
addr = DECL_ABSTRACT_ORIGIN (addr);
/* If fn is a declaration of a function in a nested scope that
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. */