aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-06-19 09:23:16 +0200
committerRichard Biener <rguenther@suse.de>2023-06-20 08:59:20 +0200
commit963f87f8a65ec82f503ac4334a3da83b0a8a43b2 (patch)
tree8a9ab1024e9db89347a36de19bef07e355dea01c
parent62514099cb56574d96e29e2688aca23eeba5268f (diff)
downloadgcc-963f87f8a65ec82f503ac4334a3da83b0a8a43b2.zip
gcc-963f87f8a65ec82f503ac4334a3da83b0a8a43b2.tar.gz
gcc-963f87f8a65ec82f503ac4334a3da83b0a8a43b2.tar.bz2
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.
-rw-r--r--gcc/dwarf2out.cc3
-rw-r--r--gcc/testsuite/g++.dg/debug/pr110295.C19
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
index d89ffa6..e70c47c 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 0000000..10cad55
--- /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>(); }