https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93922

            Bug ID: 93922
           Summary: Fails to emit inline class template destructor
                    instantiation, but which is called
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sbergman at redhat dot com
  Target Milestone: ---

I came across this when building LibreOffice and its bundled Skia with recent
GCC 10 trunk and it failed to link due to two undefined references.  I hope the
below is a faithfully stripped-down reproducer for the error I encountered:

> $ cat test.cc
> template<typename T> struct sk_sp {
>     template<typename U> sk_sp(sk_sp<U> const &);
>     ~sk_sp() {}
> };
> struct SkPicture {};
> struct Wrapped: SkPicture {
>     Wrapped(SkPicture const &);
> };
> struct S {
>     sk_sp<SkPicture const> x;
>     Wrapped y;
> };
> sk_sp<SkPicture> ref(SkPicture *);
> void f(SkPicture * x, SkPicture const & y) {
>     new S(ref(x), y);
> }

> $ g++ -std=c++2a -S test.cc -o - | grep _ZN5sk_spIK9SkPictureED1Ev
>         call    _ZN5sk_spIK9SkPictureED1Ev

shows that sk_sp<SkPicture const>::~sk_sp() (i.e., _ZN5sk_spIK9SkPictureED1Ev)
is called (from f) but not emitted.

Reply via email to