diff options
author | Ville Voutilainen <ville.voutilainen@gmail.com> | 2020-10-17 22:08:50 +0300 |
---|---|---|
committer | Ville Voutilainen <ville.voutilainen@gmail.com> | 2020-10-17 23:10:40 +0300 |
commit | 1f65bf2aa65609c0cd88af1b83191d37d6729f46 (patch) | |
tree | 0208e7f53eb1b3ff2b0fde31d952adc894132ff4 | |
parent | f476a9fe912132abf06c2832a1bb9abe6c1a1bb1 (diff) | |
download | gcc-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/variant | 12 |
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}; |