From 1f65bf2aa65609c0cd88af1b83191d37d6729f46 Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Sat, 17 Oct 2020 22:08:50 +0300 Subject: [PATCH] libstdc++: Fix visitor return type diagnostics [PR97449] libstdc++-v3/ChangeLog: PR libstdc++/97449 * include/std/variant (__gen_vtable_impl<>::_S_apply_single_alt): Diagnose visitor return type mismatches here.. (__gen_vtable_impl::_S_apply): ..not here. --- libstdc++-v3/include/std/variant | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index a29c5bf513b..17f8bcd638b 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -960,9 +960,13 @@ namespace __variant } else { - __element = __gen_vtable_impl< + auto __tmp_element = __gen_vtable_impl< remove_reference_t, std::index_sequence<__indices..., __index>>::_S_apply(); + static_assert(is_same_v<_Tp, decltype(__tmp_element)>, + "std::visit requires the visitor to have the same " + "return type for all alternatives of a variant"); + __element = __tmp_element; } } }; @@ -1026,10 +1030,8 @@ namespace __variant std::declval<_Variants>()...))>; if constexpr (__visit_ret_type_mismatch) { - static_assert(!__visit_ret_type_mismatch, - "std::visit requires the visitor to have the same " - "return type for all alternatives of a variant"); - return __nonesuch{}; + struct __cannot_match {}; + return __cannot_match{}; } else return _Array_type{&__visit_invoke}; -- 2.30.2