On Wed, 5 Mar 2025, Richard Biener wrote:

> 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.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
> 
> OK?

I'd like to ping this patch.

Richard.

> Thanks,
> Richard.
> 
>       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 itself, recursion
>       on the name should do this.
> 
>       * g++.dg/debug/pr101533.C: New testcase.
> ---
>  gcc/dwarf2out.cc                      |  6 ++----
>  gcc/testsuite/g++.dg/debug/pr101533.C | 11 +++++++++++
>  2 files changed, 13 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/debug/pr101533.C
> 
> diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
> index ed7d9402200..d4c51554e3e 100644
> --- a/gcc/dwarf2out.cc
> +++ b/gcc/dwarf2out.cc
> @@ -26419,10 +26419,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)
>       {
> @@ -26436,8 +26436,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 00000000000..fc1e2e742a1
> --- /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>();
> +}
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to