diff options
author | Richard Biener <rguenther@suse.de> | 2025-03-05 14:24:50 +0100 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2025-03-18 10:12:28 +0100 |
commit | 99a3f013c3bb8bc022ca488b40aa18fd97b5224d (patch) | |
tree | 4ecdacca75aedda5cd50254583c62227891e9cea | |
parent | 289867bb298507d7c99a30f92d650a86df99225f (diff) | |
download | gcc-99a3f013c3bb8bc022ca488b40aa18fd97b5224d.zip gcc-99a3f013c3bb8bc022ca488b40aa18fd97b5224d.tar.gz gcc-99a3f013c3bb8bc022ca488b40aa18fd97b5224d.tar.bz2 |
debug/101533 - ICE with variant typedef DIE generation
There's a sanity check in gen_type_die_with_usage that trips
unnecessarily for a case where the relevant DIE has already been
generated successfully in other ways. The following keys the
existing TREE_ASM_WRITTEN check on the correct object, honoring
this and does nothing instead of ICEing for the testcase at hand.
PR debug/101533
* dwarf2out.cc (gen_type_die_with_usage): When we have
output the typedef already do nothing for a typedef variant.
Do not set TREE_ASM_WRITTEN on the type.
* g++.dg/debug/pr101533.C: New testcase.
-rw-r--r-- | gcc/dwarf2out.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/debug/pr101533.C | 11 |
2 files changed, 13 insertions, 4 deletions
diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc index e1c3532..a2acfd1d35 100644 --- a/gcc/dwarf2out.cc +++ b/gcc/dwarf2out.cc @@ -26424,10 +26424,10 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, for the parent typedef which TYPE is a type of. */ if (typedef_variant_p (type)) { - if (TREE_ASM_WRITTEN (type)) + tree name = TYPE_NAME (type); + if (TREE_ASM_WRITTEN (name)) return; - tree name = TYPE_NAME (type); tree origin = decl_ultimate_origin (name); if (origin != NULL && origin != name) { @@ -26441,8 +26441,6 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, /* Give typedefs the right scope. */ context_die = scope_die_for (type, context_die); - TREE_ASM_WRITTEN (type) = 1; - gen_decl_die (name, NULL, NULL, context_die); return; } diff --git a/gcc/testsuite/g++.dg/debug/pr101533.C b/gcc/testsuite/g++.dg/debug/pr101533.C new file mode 100644 index 0000000..fc1e2e7 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr101533.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "-g" } + +template <typename> class T +{ + typedef struct {} a __attribute__((aligned)); +}; +void f () +{ + T<int>(); +} |