Workaround GCC bug PR78489 - SFINAE order is not respected.
This patch works around variant test failures which are new to GCC 8. GCC 8 either doesn't perform SFINAE in lexical order, or it doesn't halt after encountering the first failure. This causes hard error to occur instead of substitution failure. See gcc.gnu.org/PR78489 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@328261 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1156,29 +1156,24 @@ public:
|
|||||||
: __impl(in_place_index<_Ip>, _VSTD::forward<_Arg>(__arg)) {}
|
: __impl(in_place_index<_Ip>, _VSTD::forward<_Arg>(__arg)) {}
|
||||||
|
|
||||||
template <size_t _Ip, class... _Args,
|
template <size_t _Ip, class... _Args,
|
||||||
class = enable_if_t<(_Ip < sizeof...(_Types)), int>,
|
enable_if_t<(_Ip < sizeof...(_Types)), size_t> _Ip2 = _Ip,
|
||||||
class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
|
class _Tp = variant_alternative_t<_Ip2, variant<_Types...>>,
|
||||||
enable_if_t<is_constructible_v<_Tp, _Args...>, int> = 0>
|
enable_if_t<is_constructible<_Tp, _Args...>::value, int> = 0>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
explicit constexpr variant(
|
explicit constexpr variant(in_place_index_t<_Ip>,
|
||||||
in_place_index_t<_Ip>,
|
_Args&&... __args)
|
||||||
_Args&&... __args) noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
|
noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
|
||||||
: __impl(in_place_index<_Ip>, _VSTD::forward<_Args>(__args)...) {}
|
: __impl(in_place_index<_Ip>, _VSTD::forward<_Args>(__args)...) {}
|
||||||
|
|
||||||
template <
|
template <size_t _Ip, class _Up, class... _Args,
|
||||||
size_t _Ip,
|
enable_if_t<(_Ip < sizeof...(_Types)), size_t> _Ip2 = _Ip,
|
||||||
class _Up,
|
class _Tp = variant_alternative_t<_Ip2, variant<_Types...>>,
|
||||||
class... _Args,
|
|
||||||
enable_if_t<(_Ip < sizeof...(_Types)), int> = 0,
|
|
||||||
class _Tp = variant_alternative_t<_Ip, variant<_Types...>>,
|
|
||||||
enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
|
enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
|
||||||
int> = 0>
|
int> = 0>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
explicit constexpr variant(
|
explicit constexpr variant(in_place_index_t<_Ip>, initializer_list<_Up> __il,
|
||||||
in_place_index_t<_Ip>,
|
_Args&&... __args)
|
||||||
initializer_list<_Up> __il,
|
noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
|
||||||
_Args&&... __args) noexcept(
|
|
||||||
is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
|
|
||||||
: __impl(in_place_index<_Ip>, __il, _VSTD::forward<_Args>(__args)...) {}
|
: __impl(in_place_index<_Ip>, __il, _VSTD::forward<_Args>(__args)...) {}
|
||||||
|
|
||||||
template <
|
template <
|
||||||
|
|||||||
@@ -73,6 +73,12 @@ void test_ctor_sfinae() {
|
|||||||
!std::is_constructible<V, std::in_place_index_t<2>, IL>::value, "");
|
!std::is_constructible<V, std::in_place_index_t<2>, IL>::value, "");
|
||||||
static_assert(!test_convertible<V, std::in_place_index_t<2>, IL>(), "");
|
static_assert(!test_convertible<V, std::in_place_index_t<2>, IL>(), "");
|
||||||
}
|
}
|
||||||
|
{ // index not in variant
|
||||||
|
using V = std::variant<InitList, InitListArg, int>;
|
||||||
|
static_assert(
|
||||||
|
!std::is_constructible<V, std::in_place_index_t<3>, IL>::value, "");
|
||||||
|
static_assert(!test_convertible<V, std::in_place_index_t<3>, IL>(), "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_ctor_basic() {
|
void test_ctor_basic() {
|
||||||
|
|||||||
Reference in New Issue
Block a user