https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81359
Bug ID: 81359 Summary: [7/8 Regression] bogus error: constructor required before non-static data member for ‘Foo::Bar::test’ has been parsed Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: trippels at gcc dot gnu.org CC: jason at gcc dot gnu.org Target Milestone: --- markus@x4 tmp % cat test.cpp #include <memory> struct Test; class Foo { public: Foo(); private: struct Bar { Bar() = default; bool test = false; }; std::unique_ptr<Test, Bar> foo; }; markus@x4 tmp % g++ -c test.cpp In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/move.h:54:0, from /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/stl_pair.h:59, from /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/stl_algobase.h:64, from /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/memory:62, from test.cpp:1: /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits: In substitution of ‘template<class _Tp, class> static std::true_type std::__do_is_default_constructible_impl::__test(int) [with _Tp = Foo::Bar; <template-parameter-1-2> = <missing>]’: /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:892:35: required from ‘struct std::__is_default_constructible_impl<Foo::Bar>’ /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:143:12: required from ‘struct std::__and_<std::__not_<std::is_void<Foo::Bar> >, std::__is_default_constructible_impl<Foo::Bar> >’ /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:896:12: required from ‘struct std::__is_default_constructible_atom<Foo::Bar>’ /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:917:12: required from ‘struct std::__is_default_constructible_safe<Foo::Bar, false>’ /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:923:12: required from ‘struct std::is_default_constructible<Foo::Bar>’ /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:143:12: required from ‘struct std::__and_<std::__not_<std::is_pointer<Foo::Bar> >, std::is_default_constructible<Foo::Bar> >’ /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/unique_ptr.h:135:47: required from ‘class std::__uniq_ptr_impl<Test, Foo::Bar>’ /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/bits/unique_ptr.h:163:33: required from ‘class std::unique_ptr<Test, Foo::Bar>’ test.cpp:13:30: required from here /usr/lib/gcc/x86_64-pc-linux-gnu/7.1.1/include/g++-v7/type_traits:881:48: error: constructor required before non-static data member for ‘Foo::Bar::test’ has been parsed template<typename _Tp, typename = decltype(_Tp())> ^~~~~