The problem here is that we are trying to call dwarf2out_late_global_decl() on a static variable in a template which has a type of TEMPLATE_TYPE_PARM:

template <typename T> class A
{
  static __thread T a;
};

We are calling late_global_decl because we are about to remove the unused static from the symbol table:

          /* See if the debugger can use anything before the DECL
             passes away.  Perhaps it can notice a DECL that is now a
             constant and can tag the early DIE with an appropriate
             attribute.

             Otherwise, this is the last chance the debug_hooks have
             at looking at optimized away DECLs, since
             late_global_decl will subsequently be called from the
             contents of the now pruned symbol table.  */
          if (!decl_function_context (node->decl))
            (*debug_hooks->late_global_decl) (node->decl);

Since gen_type_die_with_usage() cannot handle TEMPLATE_TYPE_PARMs we ICE.

I think we need to avoid calling late_global_decl on DECL's for which decl_type_context() is true, similarly to what we do for the call to early_global_decl in rest_of_decl_compilation:

      && !decl_function_context (decl)
      && !current_function_decl
      && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION
      && !decl_type_context (decl))
    (*debug_hooks->early_global_decl) (decl);

Presumably the old code did not run into this problem because the TEMPLATE_TYPE_PARAMs had been lowered by the time dwarf2out_decl was called, but here we are calling late_global_decl relatively early.

The attached patch fixes the problem.

Tested with --enable-languages=all.  Ada had other issues, so I skipped it.

OK for mainline?
commit 302f9976c53aa09e431bd54f37dbfeaa2c6b2acc
Author: Aldy Hernandez <al...@redhat.com>
Date:   Wed Jun 24 20:04:09 2015 -0700

        PR debug/66653
        * cgraphunit.c (analyze_functions): Do not call
        debug_hooks->late_global_decl when decl_type_context.

diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 066a155..d2974ad 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -1149,7 +1149,8 @@ analyze_functions (bool first_time)
             at looking at optimized away DECLs, since
             late_global_decl will subsequently be called from the
             contents of the now pruned symbol table.  */
-         if (!decl_function_context (node->decl))
+         if (!decl_function_context (node->decl)
+             && !decl_type_context (node->decl))
            (*debug_hooks->late_global_decl) (node->decl);
 
          node->remove ();
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr66653.C 
b/gcc/testsuite/g++.dg/debug/dwarf2/pr66653.C
new file mode 100644
index 0000000..bcaaf88
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr66653.C
@@ -0,0 +1,8 @@
+// PR debug/54508
+// { dg-do compile }
+// { dg-options "-g" }
+
+template <typename T> class A
+{
+  static __thread T a;
+};

Reply via email to