Commit be1bb2a4 by Alexandre Oliva Committed by Alexandre Oliva

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
parent 0839863c
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.
......
...@@ -4379,12 +4379,21 @@ get_callee_fndecl (call) ...@@ -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
return addr; 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 fn;
} }
/* We couldn't figure out what was being called. */ /* We couldn't figure out what was being called. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment