diff mbox

C++ PATCH for c++/54410 (duplicate template bindings in DWARF)

Message ID 510A8BB3.9030809@redhat.com
State New
Headers show

Commit Message

Jason Merrill Jan. 31, 2013, 3:20 p.m. UTC
We ended up inserting the type in the array of types to add template 
parameters to twice, so we added the parameters twice.  Fixed by only 
adding it the first time; it doesn't matter whether we happen to be 
creating a declaration or definition DIE at this point, since when we 
get to EOF we'll add the bindings to the definition die (if any).

Tested x86_64-pc-linux-gnu, applying to trunk.
diff mbox

Patch

commit 1e9546939b355bd9f84e1928e1599b3a9f3bbe21
Author: Jason Merrill <jason@redhat.com>
Date:   Wed Jan 30 17:21:49 2013 -0500

    	PR c++/54410
    	* dwarf2out.c (gen_struct_or_union_type_die): Always schedule template
    	parameters the first time.
    	(gen_scheduled_generic_parms_dies): Check completeness here.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 5a03280..3106dd9 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -19061,6 +19061,10 @@  gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
 
   scope_die = scope_die_for (type, context_die);
 
+  /* Generate child dies for template paramaters.  */
+  if (!type_die && debug_info_level > DINFO_LEVEL_TERSE)
+    schedule_generic_params_dies_gen (type);
+
   if (! type_die || (nested && is_cu_die (scope_die)))
     /* First occurrence of type or toplevel definition of nested class.  */
     {
@@ -19078,11 +19082,6 @@  gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
   else
     remove_AT (type_die, DW_AT_declaration);
 
-  /* Generate child dies for template paramaters.  */
-  if (debug_info_level > DINFO_LEVEL_TERSE
-      && COMPLETE_TYPE_P (type))
-    schedule_generic_params_dies_gen (type);
-
   /* If this type has been completed, then give it a byte_size attribute and
      then give a list of members.  */
   if (complete && !ns_decl)
@@ -20592,7 +20591,8 @@  gen_scheduled_generic_parms_dies (void)
     return;
   
   FOR_EACH_VEC_ELT (*generic_type_instances, i, t)
-    gen_generic_params_dies (t);
+    if (COMPLETE_TYPE_P (t))
+      gen_generic_params_dies (t);
 }
 
 
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-11.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-11.C
new file mode 100644
index 0000000..8000295
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-11.C
@@ -0,0 +1,9 @@ 
+// PR c++/54410
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_template_type_param" 1 } }
+
+namespace N {
+  template <class T> struct A { };
+}
+
+N::A<int> a;