https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90415
Bug ID: 90415 Summary: std::is_copy_constructible<std::tuple<std::any>> is incomplete Product: gcc Version: 9.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: pdziepak at gmail dot com Target Milestone: --- Compiler Explorer link: https://godbolt.org/z/RCoRVj The following code: ``` #include <any> #include <tuple> #include <type_traits> bool is_copy_constructible_tuple_any() { return std::is_copy_constructible<std::tuple<std::any>>::value; } ``` when compiled with GCC 9.1 and `-Wall -Wextra -std=c++17` results in a rather elaborate error message: ``` In file included from /usr/include/c++/9/bits/move.h:55, from /usr/include/c++/9/bits/nested_exception.h:40, from /usr/include/c++/9/exception:144, from /usr/include/c++/9/new:40, from /usr/include/c++/9/any:37, from test.cc:1: /usr/include/c++/9/type_traits: In instantiation of ‘struct std::__and_<std::is_copy_constructible<std::tuple<std::any> >, std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&> >’: /usr/include/c++/9/any:181:58: required by substitution of ‘template<class _ValueType, class _Tp, class _Mgr, typename std::enable_if<std::__and_<std::is_copy_constructible<_Tp>, std::is_constructible<_Tp, _ValueType&&> >::value, bool>::type <anonymous>, typename std::enable_if<(! std::__is_in_place_type<_Tp>::value), bool>::type <anonymous> > std::any::any(_ValueType&&) [with _ValueType = const std::tuple<std::any>&; _Tp = std::tuple<std::any>; _Mgr = std::any::_Manager_external<std::tuple<std::any> >; typename std::enable_if<std::__and_<std::is_copy_constructible<_Tp>, std::is_constructible<_Tp, _ValueType&&> >::value, bool>::type <anonymous> = <missing>; typename std::enable_if<(! std::__is_in_place_type<_Tp>::value), bool>::type <anonymous> = <missing>]’ /usr/include/c++/9/type_traits:931:12: required from ‘struct std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&>’ /usr/include/c++/9/type_traits:943:12: required from ‘struct std::__is_copy_constructible_impl<std::tuple<std::any>, true>’ /usr/include/c++/9/type_traits:949:12: required from ‘struct std::is_copy_constructible<std::tuple<std::any> >’ test.cc:6:60: required from here /usr/include/c++/9/type_traits:131:12: error: incomplete type ‘std::is_copy_constructible<std::tuple<std::any> >’ used in nested name specifier 131 | struct __and_<_B1, _B2> | ^~~~~~~~~~~~~~~~ /usr/include/c++/9/type_traits: In instantiation of ‘struct std::__and_<std::is_copy_constructible<std::tuple<std::any> >, std::__not_<std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&> >, std::__not_<std::__is_in_place_type<std::tuple<std::any> > > >’: /usr/include/c++/9/type_traits:150:27: required from ‘constexpr const bool std::__and_v<std::is_copy_constructible<std::tuple<std::any> >, std::__not_<std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&> >, std::__not_<std::__is_in_place_type<std::tuple<std::any> > > >’ /usr/include/c++/9/any:192:27: required by substitution of ‘template<class _ValueType, class _Tp, class _Mgr, typename std::enable_if<__and_v<std::is_copy_constructible<_Tp>, std::__not_<std::is_constructible<_Tp, _ValueType&&> >, std::__not_<std::__is_in_place_type<_Tp> > >, bool>::type <anonymous> > std::any::any(_ValueType&&) [with _ValueType = const std::tuple<std::any>&; _Tp = std::tuple<std::any>; _Mgr = std::any::_Manager_external<std::tuple<std::any> >; typename std::enable_if<__and_v<std::is_copy_constructible<_Tp>, std::__not_<std::is_constructible<_Tp, _ValueType&&> >, std::__not_<std::__is_in_place_type<_Tp> > >, bool>::type <anonymous> = <missing>]’ /usr/include/c++/9/type_traits:931:12: required from ‘struct std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&>’ /usr/include/c++/9/type_traits:943:12: required from ‘struct std::__is_copy_constructible_impl<std::tuple<std::any>, true>’ /usr/include/c++/9/type_traits:949:12: required from ‘struct std::is_copy_constructible<std::tuple<std::any> >’ test.cc:6:60: required from here /usr/include/c++/9/type_traits:136:12: error: incomplete type ‘std::is_copy_constructible<std::tuple<std::any> >’ used in nested name specifier 136 | struct __and_<_B1, _B2, _B3, _Bn...> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/include/c++/9/type_traits: In instantiation of ‘constexpr const bool std::__and_v<std::is_copy_constructible<std::tuple<std::any> >, std::__not_<std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&> >, std::__not_<std::__is_in_place_type<std::tuple<std::any> > > >’: /usr/include/c++/9/any:192:27: required by substitution of ‘template<class _ValueType, class _Tp, class _Mgr, typename std::enable_if<__and_v<std::is_copy_constructible<_Tp>, std::__not_<std::is_constructible<_Tp, _ValueType&&> >, std::__not_<std::__is_in_place_type<_Tp> > >, bool>::type <anonymous> > std::any::any(_ValueType&&) [with _ValueType = const std::tuple<std::any>&; _Tp = std::tuple<std::any>; _Mgr = std::any::_Manager_external<std::tuple<std::any> >; typename std::enable_if<__and_v<std::is_copy_constructible<_Tp>, std::__not_<std::is_constructible<_Tp, _ValueType&&> >, std::__not_<std::__is_in_place_type<_Tp> > >, bool>::type <anonymous> = <missing>]’ /usr/include/c++/9/type_traits:931:12: required from ‘struct std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&>’ /usr/include/c++/9/type_traits:943:12: required from ‘struct std::__is_copy_constructible_impl<std::tuple<std::any>, true>’ /usr/include/c++/9/type_traits:949:12: required from ‘struct std::is_copy_constructible<std::tuple<std::any> >’ test.cc:6:60: required from here /usr/include/c++/9/type_traits:150:27: error: ‘value’ is not a member of ‘std::__and_<std::is_copy_constructible<std::tuple<std::any> >, std::__not_<std::is_constructible<std::tuple<std::any>, const std::tuple<std::any>&> >, std::__not_<std::__is_in_place_type<std::tuple<std::any> > > >’ 150 | inline constexpr bool __and_v = __and_<_Bn...>::value; | ```