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

            Bug ID: 90137
           Summary: Using declaration (constructor inheritance) prevents
                    overriding
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kshegunov at gmail dot com
  Target Milestone: ---

Created attachment 46193
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46193&action=edit
A complete source code to reproduce

Hello,
When inheriting constructors from a base class with a virtual destructor and
overriding the destructor, the compiler doesn't hide from lookup the generated
destructor call (as per rules for using declarations). This causes failed
compilation on object instantiation for the following simple program (attached
a MWE):

#include <memory>

class Base
{
public:
    Base(int = 0);
    virtual ~Base();
};

class DerivedPrivate;
class Derived final : public Base
{
public:
    using Base::Base;

    ~Derived() override;

private:
    std::unique_ptr<DerivedPrivate> d;
};

DerivedPrivate is obviously only forward declared, and the inline destructor
for the std::unique_ptr instance can't be generated at the point of
declaration, however the destructor of Derived is overriden and defined in the
source file and the call to the member destructor should be emitted there.

Substituting the using declaration with a trivial class constructor that
delegates to the base class solves the issue and compiles as expected.

-------------------------

Diagnostic information:

GCC version:

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 8.3.0-6'
--with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs
--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr
--with-gcc-major-version-only --program-suffix=-8
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie
--with-system-zlib --with-target-system-zlib --enable-objc-gc=auto
--enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none --without-cuda-driver
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 8.3.0 (Debian 8.3.0-6)


Compiling with:
g++ -c -pipe -g -std=gnu++11 -Wall -W -Wextra -fPIC -I. -o main.o main.cpp

Results in:
In file included from /usr/include/c++/8/memory:80,
                 from ../gcc-bug/using.h:4,
                 from ../gcc-bug/main.cpp:1:
/usr/include/c++/8/bits/unique_ptr.h: In instantiation of ‘void
std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = DerivedPrivate]’:
/usr/include/c++/8/bits/unique_ptr.h:274:17:   required from
‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = DerivedPrivate; _Dp =
std::default_delete<DerivedPrivate>]’
../gcc-bug/using.h:14:7:   required from here
/usr/include/c++/8/bits/unique_ptr.h:79:16: error: invalid application of
‘sizeof’ to incomplete type ‘DerivedPrivate’
  static_assert(sizeof(_Tp)>0,
                ^~~~~~~~~~~

Expected result:
Successful compilation.

Reply via email to