Hi!

The VAR_DECL in this testcase is pushed to both external_scope
and file_scope, which unfortunately triggers the creation of the local
extern I've added for PR39563.  That was only intended for function scope,
for DWARF file_scope and external_scope are the same thing.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2011-12-05  Jakub Jelinek  <ja...@redhat.com>

        PR debug/51410
        * c-decl.c (pop_scope): Don't add DECL_EXTERNAL decls
        for debug info if scope is file_scope.

        * gcc.dg/debug/dwarf2/pr51410.c: New test.

--- gcc/c-decl.c.jj     2011-12-05 16:39:46.000000000 +0100
+++ gcc/c-decl.c        2011-12-05 18:02:13.274191017 +0100
@@ -1196,7 +1196,7 @@ pop_scope (void)
              DECL_CHAIN (p) = BLOCK_VARS (block);
              BLOCK_VARS (block) = p;
            }
-         else if (VAR_OR_FUNCTION_DECL_P (p))
+         else if (VAR_OR_FUNCTION_DECL_P (p) && scope != file_scope)
            {
              /* For block local externs add a special
                 DECL_EXTERNAL decl for debug info generation.  */
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr51410.c.jj      2011-12-05 
18:07:27.254337634 +0100
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr51410.c 2011-12-05 18:07:22.350366223 
+0100
@@ -0,0 +1,13 @@
+/* PR debug/51410 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -gdwarf-2 -dA -fno-merge-debug-strings" } */
+
+int x;
+
+int
+foo (void)
+{
+  return x;
+}
+
+/* { dg-final { scan-assembler-times "\\(DIE\[^\\r\\n\]*DW_TAG_variable\\)" 1 
} } */

        Jakub

Reply via email to