https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91807
Bug ID: 91807
Summary: [Regression] std::variant with multiple identical
types assignment fail
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: raplonu.jb at gmail dot com
Target Milestone: ---
Created attachment 46895
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46895&action=edit
preprocessed file
Repro:
#include
struct me_data {
me_data() = default;
me_data(const me_data &) {};
me_data(me_data &&) noexcept {};
me_data& operator=(const me_data &) = default;
};
int main() {
std::variant v1, v2;
v2 = v1;
}
Compiles with 8. Breaks with 9 (see bellow) and 10.0.0 201 (on wandbox :
https://wandbox.org/permlink/3GZeJzWMlElIgqGd ):
In file included from main.cpp:1:
/usr/include/c++/9/variant: In instantiation of
‘std::__detail::__variant::_Copy_assign_base<,
_Types>::operator=(const
std::__detail::__variant::_Copy_assign_base<, _Types>&) [with bool
= false; _Types = {me_data, me_data}]::
mutable [with auto:3 = const me_data&; auto:4 = std::integral_constant]’:
/usr/include/c++/9/bits/invoke.h:60:36: required from ‘constexpr _Res
std::__invoke_impl(std::__invoke_other, _Fn&&, _Args&& ...) [with _Res =
std::__detail::__variant::__variant_idx_cookie; _Fn =
std::__detail::__variant::_Copy_assign_base<,
_Types>::operator=(const
std::__detail::__variant::_Copy_assign_base<, _Types>&) [with bool
= false; _Types = {me_data, me_data}]::;
_Args = {const me_data&, std::integral_constant}]’
/usr/include/c++/9/bits/invoke.h:95:40: required from ‘constexpr typename
std::__invoke_result<_Functor, _ArgTypes>::type std::__invoke(_Callable&&,
_Args&& ...) [with _Callable =
std::__detail::__variant::_Copy_assign_base<,
_Types>::operator=(const
std::__detail::__variant::_Copy_assign_base<, _Types>&) [with bool
= false; _Types = {me_data, me_data}]::;
_Args = {const me_data&, std::integral_constant};
typename std::__invoke_result<_Functor, _ArgTypes>::type =
std::__detail::__variant::__variant_idx_cookie]’
/usr/include/c++/9/variant:961:24: required from ‘static constexpr
decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types,
std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants
...)>, std::tuple<_Variants ...>, std::integer_sequence >::__visit_invoke_impl(_Visitor&&, _Variants ...) [with bool
__same_return_types = true; _Result_type =
std::__detail::__variant::__variant_idx_cookie; _Visitor =
std::__detail::__variant::_Copy_assign_base<,
_Types>::operator=(const
std::__detail::__variant::_Copy_assign_base<, _Types>&) [with bool
= false; _Types = {me_data, me_data}]::&&; _Variants = {const std::variant&}; long unsigned
int ...__indices = {0}]’
/usr/include/c++/9/variant:980:28: required from ‘static constexpr
decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types,
std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants
...)>, std::tuple<_Variants ...>, std::integer_sequence >::__do_visit_invoke(_Visitor&&, _Variants ...) [with bool
__same_return_types = true; _Result_type =
std::__detail::__variant::__variant_idx_cookie; _Visitor =
std::__detail::__variant::_Copy_assign_base<,
_Types>::operator=(const
std::__detail::__variant::_Copy_assign_base<, _Types>&) [with bool
= false; _Types = {me_data, me_data}]::&&; _Variants = {const std::variant&}; long unsigned
int ...__indices = {0}]’
/usr/include/c++/9/variant:996:28: required from ‘static constexpr
decltype(auto) std::__detail::__variant::__gen_vtable_impl<__same_return_types,
std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants
...)>, std::tuple<_Variants ...>, std::integer_sequence >::__visit_invoke(_Visitor&&, _Variants ...) [with bool
__same_return_types = true; _Result_type =
std::__detail::__variant::__variant_idx_cookie; _Visitor =
std::__detail::__variant::_Copy_assign_base<,
_Types>::operator=(const
std::__detail::__variant::_Copy_assign_base<, _Types>&) [with bool
= false; _Types = {me_data, me_data}]::&&; _Variants = {const std::variant&}; long unsigned
int ...__indices = {0}]’
/usr/include/c++/9/variant:1005:28: required from ‘static constexpr auto
std::__detail::__variant::__gen_vtable_impl<__same_return_types,
std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants
...)>, std::tuple<_Variants ...>, std::integer_sequence >::_S_apply() [with bool __same_return_types = true;
_Result_type = std::__d