Fix numerous -O3 -g testsuite failures for DWARF2 targets.
authorJim Wilson <wilson@cygnus.com>
Wed, 20 Oct 1999 22:19:06 +0000 (22:19 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 20 Oct 1999 22:19:06 +0000 (15:19 -0700)
* integrate.c (integrate_decl_tree): Set DECL_CONTEXT to 0 if this is
a local extern function declaration.

From-SVN: r30107

gcc/ChangeLog
gcc/integrate.c

index cdd6b0f..998c467 100644 (file)
@@ -1,3 +1,8 @@
+Wed Oct 20 15:18:42 1999  Jim Wilson  <wilson@cygnus.com>
+
+       * integrate.c (integrate_decl_tree): Set DECL_CONTEXT to 0 if this is
+       a local extern function declaration.
+
 Wed Oct 20 13:56:01 1999  Richard Henderson  <rth@cygnus.com>
 
        * i386.c (ix86_expand_prologue): Properly wrap USE around
index bd2e662..e312b18 100644 (file)
@@ -1419,10 +1419,23 @@ integrate_decl_tree (let, map)
       if (DECL_LANG_SPECIFIC (d))
        copy_lang_decl (d);
 
+      /* ??? We used to call pushdecl here, but that does not work now that
+        we generate entire functions as trees.  We only want the pushdecl
+        code that sets DECL_CONTEXT.  Each front end sets DECL_CONTEXT
+        slightly differently though, so we may need new callbacks to the
+        front-ends to do this right.  For now, we just use the code from the
+        C front end and hope that is sufficient.  Alternatively, we could
+        set DECL_CONTEXT (d) here only if DECL_CONTEXT (t) is non-null.  */
       /* This new declaration is now in the scope of the function into
         which we are inlining the function, not the function being
         inlined.  */
       DECL_CONTEXT (d) = current_function_decl;
+      /* A local extern declaration for a function doesn't constitute nesting.
+        A local auto declaration does, since it's a forward decl
+        for a nested function coming later.  */
+      if (TREE_CODE (d) == FUNCTION_DECL && DECL_INITIAL (d) == 0
+         && DECL_EXTERNAL (d))
+       DECL_CONTEXT (d) = 0;
 
       /* Add this declaration to the list of variables in the new
         block.  */