]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR debug/46123 (ICE: in output_aranges, at dwarf2out.c:11531 with -feliminate...
authorJason Merrill <jason@gcc.gnu.org>
Fri, 3 Dec 2010 20:08:28 +0000 (15:08 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 3 Dec 2010 20:08:28 +0000 (15:08 -0500)
PR debug/46123
* dwarf2out.c (gen_type_die_with_usage): Don't put local types in
a declaration DIE.

From-SVN: r167441

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C [new file with mode: 0644]
gcc/testsuite/g++.dg/debug/pr46123.C [new file with mode: 0644]

index 2cae328961786f960d57e76b306438ba81db2077..a1c6769085f1760188c2c7c25fb61e7623c1e442 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-03  Jason Merrill  <jason@redhat.com>
+
+       PR debug/46123
+       * dwarf2out.c (gen_type_die_with_usage): Don't put local types in
+       a declaration DIE.
+
 2010-12-03  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        Backport from mainline:
index 0fe8b636bf2387aee1ccae06910263e67b084800..802ba3d6d37c7ee7a94ba5986933668a1986ce5d 100644 (file)
@@ -19125,6 +19125,10 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die,
             out yet, use a NULL context for now; it will be fixed up in
             decls_for_scope.  */
          context_die = lookup_decl_die (TYPE_CONTEXT (type));
+         /* A declaration DIE doesn't count; nested types need to go in the
+            specification.  */
+         if (context_die && is_declaration_die (context_die))
+           context_die = NULL;
          need_pop = 0;
        }
       else
index 72416028397d096b8e9df87c808df3bf717924f2..3f804515bf33f0811d4f5cc39ad57ce8dcbbd74d 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-03  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/46123
+       * g++.dg/debug/pr46123.C: New test.
+       * g++.dg/debug/dwarf2/pr46123.C: New test.
+
 2010-12-03  Jason Merrill  <jason@redhat.com>
 
        PR c++/46058
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C
new file mode 100644 (file)
index 0000000..eee192c
--- /dev/null
@@ -0,0 +1,47 @@
+// PR debug/46123
+// { dg-do compile }
+// { dg-options "-gdwarf-4" }
+
+struct foo
+{
+  static int bar ()
+  {
+    int i;
+    static int baz = 1;
+    {
+      static int baz = 2;
+      i = baz++;
+    }
+    {
+      struct baz
+      {
+       static int m ()
+       {
+         static int n;
+         return n += 10;
+       }
+      };
+      baz a;
+      i += a.m ();
+    }
+    {
+      static int baz = 3;
+      i += baz;
+      baz += 30;
+    }
+    i += baz;
+    baz += 60;
+    return i;
+  }
+};
+
+int main ()
+{
+  foo x;
+
+  if (x.bar () != 16)
+    return 1;
+  if (x.bar() != 117)
+    return 1;
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr46123.C b/gcc/testsuite/g++.dg/debug/pr46123.C
new file mode 100644 (file)
index 0000000..9e115cd
--- /dev/null
@@ -0,0 +1,47 @@
+// PR debug/46123
+// { dg-do compile }
+// { dg-options "-g -feliminate-dwarf2-dups" }
+
+struct foo
+{
+  static int bar ()
+  {
+    int i;
+    static int baz = 1;
+    {
+      static int baz = 2;
+      i = baz++;
+    }
+    {
+      struct baz
+      {
+       static int m ()
+       {
+         static int n;
+         return n += 10;
+       }
+      };
+      baz a;
+      i += a.m ();
+    }
+    {
+      static int baz = 3;
+      i += baz;
+      baz += 30;
+    }
+    i += baz;
+    baz += 60;
+    return i;
+  }
+};
+
+int main ()
+{
+  foo x;
+
+  if (x.bar () != 16)
+    return 1;
+  if (x.bar() != 117)
+    return 1;
+  return 0;
+}