Sigh. I must say my head is spinning with this testcase and what we do with it (-O3), even prior to the debug-early work:

void f(int p) {}
int g() {
  void f(int p);
  g();
  return 0;
}

The inliner recursively inlines this function up to a certain depth, but the useless inlining gets cleaned up shortly afterwards. However, the BLOCK_SOURCE_LOCATION are still set throughout which is technically correct.

Eventually late dwarf gets a hold of all this and we end up calling dwarf2out_abstract_function to build debug info for the abstract instance of a function for which we have already generated a DIE for. Basically, a similar issue to what we encountered for template parameter packs. Or at least, that's my understanding, because as I've said, I admit to being slightly confused here.

Since technically this is all going away when we remove dwarf2out_abstract_function, I suggest we remove the assert and avoid sudden death. It's not like the we generated useful debugging for this testcase anyhow.

Aldy
commit 80f8e8aefc3c628ad22cd2b17b28beb8bf4f3523
Author: Aldy Hernandez <al...@redhat.com>
Date:   Fri Jun 12 09:53:44 2015 -0700

        * dwarf2out.c (gen_formal_parameter_die): Remove assert.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index d2c516a..57a8e52 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -18023,18 +18023,14 @@ gen_formal_parameter_die (tree node, tree origin, 
bool emit_name_p,
            {
              /* FIXME: Reuse DIE even with a differing context.
 
-                This happens when called through
-                dwarf2out_abstract_function for formal parameter
-                packs.  The issue is that we're calling
+                This can happen when calling
                 dwarf2out_abstract_function to build debug info for
                 the abstract instance of a function for which we have
                 already generated a DIE in
                 dwarf2out_early_global_decl.
 
-                Once we remove dwarf2out_abstract_function, this
-                gcc_assert should be a gcc_unreachable.  */
-             gcc_assert (parm_die->die_parent->die_tag
-                         == DW_TAG_GNU_formal_parameter_pack);
+                Once we remove dwarf2out_abstract_function, we should
+                have a call to gcc_unreachable here.  */
            }
        }
 
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr66482.c 
b/gcc/testsuite/gcc.dg/debug/dwarf2/pr66482.c
new file mode 100644
index 0000000..880791c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/pr66482.c
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -gdwarf" } */
+
+void f(int p) {}
+int g() {
+  void f();
+  g();
+  return 0;
+}

Reply via email to