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