aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@gmail.com>2020-10-17 22:08:50 +0300
committerVille Voutilainen <ville.voutilainen@gmail.com>2020-10-17 23:10:40 +0300
commit1f65bf2aa65609c0cd88af1b83191d37d6729f46 (patch)
tree0208e7f53eb1b3ff2b0fde31d952adc894132ff4
parentf476a9fe912132abf06c2832a1bb9abe6c1a1bb1 (diff)
downloadgcc-1f65bf2aa65609c0cd88af1b83191d37d6729f46.zip
gcc-1f65bf2aa65609c0cd88af1b83191d37d6729f46.tar.gz
gcc-1f65bf2aa65609c0cd88af1b83191d37d6729f46.tar.bz2
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</*base case*/>::_S_apply): ..not here.
-rw-r--r--libstdc++-v3/include/std/variant12
1 files changed, 7 insertions, 5 deletions
diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
index a29c5bf..17f8bcd 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<decltype(__element)>,
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};