libstdc++: Fix std::get<T> for std::tuple [PR101427]
authorJonathan Wakely <jwakely@redhat.com>
Wed, 14 Jul 2021 19:14:14 +0000 (20:14 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 15 Jul 2021 15:25:42 +0000 (16:25 +0100)
commit17855eed7fc76b2cee7fbbc26f84d3c8b99be13c
treeef7722160a90b453394b26c6522ac758e9c3de8b
parent1f7182d68c24985dace2a94422c671ff987c262c
libstdc++: Fix std::get<T> for std::tuple [PR101427]

The std::get<T> functions relied on deduction failing if more than one
base class existed for the type T.  However the implementation of Core
DR 2303 (in r11-4693) made deduction succeed (and select the
more-derived base class).

This rewrites the implementation of std::get<T> to explicitly check for
more than one occurrence of T in the tuple elements, making it
ill-formed again. Additionally, the large wall of overload resolution
errors described in PR c++/101460 is avoided by making std::get<T> use
__get_helper<I> directly instead of calling std::get<I>, and by adding a
deleted overload of __get_helper<N> for out-of-range N.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

PR libstdc++/101427
* include/std/tuple (tuple_element): Improve static_assert text.
(__get_helper): Add deleted overload.
(get<i>(tuple<T...>&&), get<i>(const tuple<T...>&&)): Use
__get_helper directly.
(__get_helper2): Remove.
(__find_uniq_type_in_pack): New constexpr helper function.
(get<T>): Use __find_uniq_type_in_pack and __get_helper instead
of __get_helper2.
* testsuite/20_util/tuple/element_access/get_neg.cc: Adjust
expected errors.
* testsuite/20_util/tuple/element_access/101427.cc: New test.
libstdc++-v3/include/std/tuple
libstdc++-v3/testsuite/20_util/tuple/element_access/101427.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/tuple/element_access/get_neg.cc