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;
+};