[gcc r14-1958] debug/110295 - mixed up early/late debug for member DIEs

Richard Biener rguenth@gcc.gnu.org
Tue Jun 20 07:02:29 GMT 2023


https://gcc.gnu.org/g:963f87f8a65ec82f503ac4334a3da83b0a8a43b2

commit r14-1958-g963f87f8a65ec82f503ac4334a3da83b0a8a43b2
Author: Richard Biener <rguenther@suse.de>
Date:   Mon Jun 19 09:23:16 2023 +0200

    debug/110295 - mixed up early/late debug for member DIEs
    
    When we process a scope typedef during early debug creation and
    we have already created a DIE for the type when the decl is
    TYPE_DECL_IS_STUB and this DIE is still in limbo we end up
    just re-parenting that type DIE instead of properly creating
    a DIE for the decl, eventually picking up the now completed
    type and creating DIEs for the members.  Instead this is currently
    defered to the second time we come here, when we annotate the
    DIEs with locations late where now the type DIE is no longer
    in limbo and we fall through doing the job for the decl.
    
    The following makes sure we perform the necessary early tasks
    for this by continuing with the decl DIE creation after setting
    a parent for the limbo type DIE.
    
            PR debug/110295
            * dwarf2out.cc (process_scope_var): Continue processing
            the decl after setting a parent in case the existing DIE
            was in limbo.
    
            * g++.dg/debug/pr110295.C: New testcase.

Diff:
---
 gcc/dwarf2out.cc                      |  3 ++-
 gcc/testsuite/g++.dg/debug/pr110295.C | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index d89ffa66847..e70c47cec8d 100644
--- a/gcc/dwarf2out.cc
+++ b/gcc/dwarf2out.cc
@@ -26533,7 +26533,8 @@ process_scope_var (tree stmt, tree decl, tree origin, dw_die_ref context_die)
 
   if (die != NULL && die->die_parent == NULL)
     add_child_die (context_die, die);
-  else if (TREE_CODE (decl_or_origin) == IMPORTED_DECL)
+
+  if (TREE_CODE (decl_or_origin) == IMPORTED_DECL)
     {
       if (early_dwarf)
 	dwarf2out_imported_module_or_decl_1 (decl_or_origin, DECL_NAME (decl_or_origin),
diff --git a/gcc/testsuite/g++.dg/debug/pr110295.C b/gcc/testsuite/g++.dg/debug/pr110295.C
new file mode 100644
index 00000000000..10cad557095
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr110295.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-g" }
+
+template <typename T>
+struct QCachedT
+{
+  void operator delete(void *, T *) {}
+};
+template<int a>
+void exercise()
+{
+  struct thing_t
+    : QCachedT<thing_t>
+  {
+  };
+  thing_t *list[1];
+  new thing_t; // { dg-warning "" }
+}
+int main() { exercise<1>(); }


More information about the Gcc-cvs mailing list