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>
|
||||
|
||||
* 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.
|
||||
|
17
gcc/tree.c
17
gcc/tree.c
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user