On Tue, Mar 28, 2023 at 06:20:36AM +0000, Richard Biener via Gcc-patches wrote:
> The testcases in this bug reveal cases where an early generated
> type is collected because it was unused but gets attempted to
> be recreated later when a late DIE for a function (an OpenMP
> reduction) is created.  That's unexpected and possibly the fault
> of OpenMP but the following allows the re-creation of the context
> type to succeed.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
> 
> OK?
> 
> Thanks,
> Richard.
> 
>       PR ipa/106124
>       * dwarf2out.cc (lookup_type_die): Reset TREE_ASM_WRITTEN
>       so we can re-create the DIE for the type if required.
> 
>       * g++.dg/gomp/pr106124.C: New testcase.

Ok, though I'm afraid it doesn't solve all the UDR lambda/nested fn
related issues.

> diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc
> index 1711ad2c2da..1a0015ce00f 100644
> --- a/gcc/dwarf2out.cc
> +++ b/gcc/dwarf2out.cc
> @@ -5894,6 +5894,7 @@ lookup_type_die (tree type)
>    if (die && die->removed)
>      {
>        TYPE_SYMTAB_DIE (type) = NULL;
> +      TREE_ASM_WRITTEN (type) = 0;
>        return NULL;
>      }
>    return die;
> diff --git a/gcc/testsuite/g++.dg/gomp/pr106124.C 
> b/gcc/testsuite/g++.dg/gomp/pr106124.C
> new file mode 100644
> index 00000000000..3129749804b
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/gomp/pr106124.C
> @@ -0,0 +1,19 @@
> +// { dg-do compile }
> +// { dg-require-effective-target c++11 }
> +// { dg-options "-g -O2 -fopenmp -fkeep-inline-functions" }
> +
> +int q;
> +struct A
> +{
> +  typedef int T;
> +#pragma omp declare reduction (x : T : omp_out += omp_in + [] (){ return q; 
> }()) initializer (omp_priv = [](){ return 0; }())
> +  static void foo ();
> +};
> +void bar (int &, int &);
> +void
> +A::foo ()
> +{
> +  int r = 0, s = 0;
> +#pragma omp parallel reduction (x : r, s)
> +  bar (r, s);
> +}

        Jakub

Reply via email to