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.