]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree.c (get_callee_fndecl): Only use DECL_ABSTRACT_ORIGIN if it has DECL_SAVED_TREE.
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 4 Dec 2001 17:11:05 +0000 (17:11 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 4 Dec 2001 17:11:05 +0000 (17:11 +0000)
* tree.c (get_callee_fndecl): Only use DECL_ABSTRACT_ORIGIN if
it has DECL_SAVED_TREE.

From-SVN: r47615

gcc/ChangeLog
gcc/tree.c

index 2ee82900395061aa43ced4b5b435a4bc1e5b0990..57228114d28fe6d723ef3a733a6cd756bee9970f 100644 (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.
index 87dac2d5eb5bae50896037ee953bdd9a5529fa82..5cbf59c5cba8751233ed12c63995947386bf79c9 100644 (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);
-
-      if (! DECL_INITIAL (addr) && DECL_ABSTRACT_ORIGIN (addr))
-       addr = DECL_ABSTRACT_ORIGIN (addr);
-
-      return addr;
+      tree fn = TREE_OPERAND (addr, 0);
+
+      /* 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 fn;
     }
 
   /* We couldn't figure out what was being called.  */