On Mon, Mar 4, 2019 at 8:41 AM Christophe Lyon
<[email protected]> wrote:
> On Wed, 20 Feb 2019 at 02:58, Jason Merrill <[email protected]> wrote:
> >
> > A type in an anonymous namespace can never be merged with one from
> > another translation unit, so a member of such a type is always its own
> > prevailing decl.
> >
> > I don't really understand the LTO concept of prevailing decl, or why we
> > don't
> > get here if the destructor is defined, but this seems reasonable and fixes
> > the
> > bug.
> >
> > Tested x86_64-pc-linux-gnu. OK for trunk?
> >
> > * lto-symtab.c (lto_symtab_prevailing_virtual_decl): Return early
> > for a type in an anonymous namespace.
> > ---
> > gcc/lto/lto-symtab.c | 8 ++++++--
> > gcc/testsuite/g++.dg/lto/pr88049_0.C | 16 ++++++++++++++++
> > gcc/lto/ChangeLog | 6 ++++++
> > 3 files changed, 28 insertions(+), 2 deletions(-)
> > create mode 100644 gcc/testsuite/g++.dg/lto/pr88049_0.C
> >
> > diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c
> > index 22da4c78b8c..343915c3cec 100644
> > --- a/gcc/lto/lto-symtab.c
> > +++ b/gcc/lto/lto-symtab.c
> > @@ -1085,8 +1085,12 @@ lto_symtab_prevailing_virtual_decl (tree decl)
> > {
> > if (DECL_ABSTRACT_P (decl))
> > return decl;
> > - gcc_checking_assert (!type_in_anonymous_namespace_p (DECL_CONTEXT (decl))
> > - && DECL_ASSEMBLER_NAME_SET_P (decl));
> > +
> > + if (type_in_anonymous_namespace_p (DECL_CONTEXT (decl)))
> > + /* There can't be any other declarations. */
> > + return decl;
> > +
> > + gcc_checking_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
> >
> > symtab_node *n = symtab_node::get_for_asmname
> > (DECL_ASSEMBLER_NAME (decl));
> > diff --git a/gcc/testsuite/g++.dg/lto/pr88049_0.C
> > b/gcc/testsuite/g++.dg/lto/pr88049_0.C
> > new file mode 100644
> > index 00000000000..7ac3618c2c8
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/lto/pr88049_0.C
> > @@ -0,0 +1,16 @@
> > +// PR c++/88049
> > +// { dg-lto-do link }
> > +// { dg-lto-options {{ -flto -O2 -w }} }
> > +// { dg-extra-ld-options -r }
> > +
> > +template <typename> class a;
> > +class b {};
> > +template <typename e> a<e> d(char);
> > +template <typename> class a : public b {
> > +public:
> > + virtual ~a();
> > +};
> > +namespace {
> > + class f;
> > + b c = d<f>(int());
> > +} // namespace
>
>
> Hi Jason,
>
> On bare-metal targets (arm, aarch64 using newlib), I'm using dejagnu's
> testglue, which makes this new test fail because it also uses
> g++_tg.o, leading to:
> /arm-none-eabi/bin/ld: warning: incremental linking of LTO and non-LTO
> objects; using -flinker-output=nolto-rel which will bypass whole
> program optimization
>
> Is there a way to avoid that (besides not using testglue) ?
Does adding
// { dg-require-effective-target lto_incremental }
to the testcase help?
Jason