re PR debug/71057 (ICE in schedule_generic_params_dies_gen, at dwarf2out.c:24142)
authorRichard Biener <rguenther@suse.de>
Wed, 11 May 2016 13:59:34 +0000 (13:59 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 11 May 2016 13:59:34 +0000 (13:59 +0000)
2016-05-11  Richard Biener  <rguenther@suse.de>

PR debug/71057
* dwarf2out.c (retry_incomplete_types): Set early_dwarf.
(dwarf2out_finish): Move retry_incomplete_types call ...
(dwarf2out_early_finish): ... here.

* g++.dg/debug/pr71057.C: New testcase.

From-SVN: r236121

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

index ffef84e9844e4f821576ef6a70563e038a6e9f6b..233273270430e1053f3aa980b5fe79cdc31d9cc8 100644 (file)
@@ -1,3 +1,10 @@
+2016-05-11  Richard Biener  <rguenther@suse.de>
+
+       PR debug/71057
+       * dwarf2out.c (retry_incomplete_types): Set early_dwarf.
+       (dwarf2out_finish): Move retry_incomplete_types call ...
+       (dwarf2out_early_finish): ... here.
+
 2016-05-11  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/71002
index 8f192e877d709c37b106758fac6f76b7ec2797f6..b0173f7a5ce73099f22bc9394cef6251eda7c5ce 100644 (file)
@@ -19405,11 +19405,13 @@ gen_entry_point_die (tree decl, dw_die_ref context_die)
 static void
 retry_incomplete_types (void)
 {
+  set_early_dwarf s;
   int i;
 
   for (i = vec_safe_length (incomplete_types) - 1; i >= 0; i--)
     if (should_emit_struct_debug ((*incomplete_types)[i], DINFO_USAGE_DIR_USE))
       gen_type_die ((*incomplete_types)[i], comp_unit_die ());
+  vec_safe_truncate (incomplete_types, 0);
 }
 
 /* Determine what tag to use for a record type.  */
@@ -27390,10 +27392,6 @@ dwarf2out_finish (const char *filename)
   resolve_addr (comp_unit_die ());
   move_marked_base_types ();
 
-  /* Walk through the list of incomplete types again, trying once more to
-     emit full debugging info for them.  */
-  retry_incomplete_types ();
-
   if (flag_eliminate_unused_debug_types)
     prune_unused_types ();
 
@@ -27694,6 +27692,10 @@ dwarf2out_finish (const char *filename)
 static void
 dwarf2out_early_finish (void)
 {
+  /* Walk through the list of incomplete types again, trying once more to
+     emit full debugging info for them.  */
+  retry_incomplete_types ();
+
   /* The point here is to flush out the limbo list so that it is empty
      and we don't need to stream it for LTO.  */
   flush_limbo_die_list ();
index 019087254e0fabf12b9ce72b0eba0273d162eda8..4f7f0f86788e75b152dac1911b923963679458ff 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-11  Richard Biener  <rguenther@suse.de>
+
+       PR debug/71057
+       * g++.dg/debug/pr71057.C: New testcase.
+
 2016-05-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/70855
diff --git a/gcc/testsuite/g++.dg/debug/pr71057.C b/gcc/testsuite/g++.dg/debug/pr71057.C
new file mode 100644 (file)
index 0000000..2ed1eed
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-g" }
+template <typename _Tp> using decay_t = _Tp;
+template <typename> struct A;
+template <typename> struct B { B(A<int>); };
+template <typename> struct C {
+      template <typename U> using constructor = B<decay_t<U>>;
+        typedef constructor<int> dummy;
+};
+template <typename> struct D {};
+C<int> a;
+D<B<int>> fn1() { fn1, a; }