From: Ville Voutilainen Date: Sat, 17 Oct 2020 19:08:50 +0000 (+0300) Subject: libstdc++: Fix visitor return type diagnostics [PR97449] X-Git-Tag: basepoints/gcc-12~4233 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1f65bf2aa65609c0cd88af1b83191d37d6729f46;p=thirdparty%2Fgcc.git 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. --- diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index a29c5bf513bf..17f8bcd638b8 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};