]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* dwarf2out.c (declare_in_namespace): Only emit external
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Oct 2014 00:08:41 +0000 (00:08 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Oct 2014 00:08:41 +0000 (00:08 +0000)
declarations in the local scope once.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@216683 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c

index 145ce9db3d7ddeaba61e2597434df323906a8d66..bc6908db3b1853d52636250ef517d8c806ea4735 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-24  Aldy Hernandez  <aldyh@redhat.com>
+
+       * dwarf2out.c (declare_in_namespace): Only emit external
+       declarations in the local scope once.
+
 2014-10-24  Jonathan Wakely  <jwakely@redhat.com>
 
        * ginclude/stdbool.h: Do not define bool, true or false in C++11.
index a87f9c0997e7ed52fa0b1229a465047bcde7206b..3bce20f345a7114685ba8c7de004f294a5785055 100644 (file)
@@ -20476,6 +20476,26 @@ declare_in_namespace (tree thing, dw_die_ref context_die)
   if (debug_info_level <= DINFO_LEVEL_TERSE)
     return context_die;
 
+  /* External declarations in the local scope only need to be emitted
+     once, not once in the namespace and once in the scope.
+
+     This avoids declaring the `extern' below in the
+     namespace DIE as well as in the innermost scope:
+
+          namespace S
+         {
+            int i=5;
+            int foo()
+           {
+              int i=8;
+              extern int i;
+             return i;
+           }
+          }
+  */
+  if (DECL_P (thing) && DECL_EXTERNAL (thing) && local_scope_p (context_die))
+    return context_die;
+
   /* If this decl is from an inlined function, then don't try to emit it in its
      namespace, as we will get confused.  It would have already been emitted
      when the abstract instance of the inline function was emitted anyways.  */