re PR debug/41063 (ICE in output_die)
authorCary Coutant <ccoutant@gcc.gnu.org>
Fri, 28 Aug 2009 20:32:29 +0000 (13:32 -0700)
committerCary Coutant <ccoutant@gcc.gnu.org>
Fri, 28 Aug 2009 20:32:29 +0000 (13:32 -0700)
gcc/ChangeLog:

PR debug/41063
* dwarf2out.c (gen_type_die_with_usage): Use proper context for
struct/union/enum types local to a function.

gcc/testsuite/ChangeLog:

PR debug/41063
* g++.dg/debug/dwarf2/pr41063.C: New test.

From-SVN: r151185

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

index 04f875870c326fe8238d26956683d876fe72c267..aad6ee7716a5d917b65d3ce7e0cefcfc8db29a1d 100644 (file)
@@ -15573,6 +15573,15 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die,
          context_die = lookup_type_die (TYPE_CONTEXT (type));
          need_pop = 1;
        }
+      else if (TYPE_CONTEXT (type) != NULL_TREE
+              && (TREE_CODE (TYPE_CONTEXT (type)) == FUNCTION_DECL))
+       {
+         /* If this type is local to a function that hasn't been written
+            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));
+         need_pop = 0;
+       }
       else
        {
          context_die = declare_in_namespace (type, context_die);
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C
new file mode 100644 (file)
index 0000000..f23efef
--- /dev/null
@@ -0,0 +1,20 @@
+// Contributed by Cary Coutant <ccoutant@google.com>
+// Origin: PR debug/41063
+// { dg-do compile }
+
+struct A {
+  virtual void run();
+};
+
+void test() {
+  struct B : public A {
+    void run() {
+      struct C : public A {
+       C() { }
+       B *b_;
+      };
+      C c;
+    }
+  };
+  B b;
+}