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;
      |                           
```

Reply via email to