https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105616
--- Comment #8 from Donn Seeley <donn.seeley at everfox dot com> --- Here is a similar failure, using std::variant. $ cat variant.cpp #include <map> #include <string> #include <variant> using namespace std::string_literals; using V = std::variant<int, std::string>; void bar(std::map<std::string, V>& m); void foo() { std::map<std::string, V> m{ {"variant"s, V{1}} }; bar(m); } $ g++ -std=c++17 -fsanitize=address -Werror -Wall -Wextra -O2 -c variant.cpp In file included from /usr/include/c++/14/string:54, from variant.cpp:2: In member function ‘bool std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_M_is_local() const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’, inlined from ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ at /usr/include/c++/14/bits/basic_string.h:685:23, inlined from ‘constexpr std::__detail::__variant::_Uninitialized<_Type, false>::_Uninitialized(std::in_place_index_t<0>, _Args&& ...) [with _Args = {std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}; _Type = std::__cxx11::basic_string<char>]’ at /usr/include/c++/14/variant:283:4, inlined from ‘constexpr std::__detail::__variant::_Variadic_union<__trivially_destructible, _First, _Rest ...>::_Variadic_union(std::in_place_index_t<0>, _Args&& ...) [with _Args = {std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}; bool __trivially_destructible = false; _First = std::__cxx11::basic_string<char>; _Rest = {}]’ at /usr/include/c++/14/variant:412:4, inlined from ‘constexpr std::__detail::__variant::_Variadic_union<__trivially_destructible, _First, _Rest ...>::_Variadic_union(std::in_place_index_t<_Np>, _Args&& ...) [with long unsigned int _Np = 1; _Args = {std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}; bool __trivially_destructible = false; _First = int; _Rest = {std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]’ at /usr/include/c++/14/variant:418:4, inlined from ‘void std::_Construct(_Tp*, _Args&& ...) [with _Tp = __detail::__variant::_Variadic_union<false, int, __cxx11::basic_string<char, char_traits<char>, allocator<char> > >; _Args = {const in_place_index_t<1>&, __cxx11::basic_string<char, char_traits<char>, allocator<char> >}]’ at /usr/include/c++/14/bits/stl_construct.h:119:, inlined from ‘std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&)::<lambda(auto:4&&, auto:5)> mutable [with auto:4 = std::__cxx11::basic_string<char>; auto:5 = std::integral_constant<long unsigned int, 1>]’ at /usr/include/c++/14/variant:632:23, inlined from ‘constexpr _Res std::__invoke_impl(__invoke_other, _Fn&&, _Args&& ...) [with _Res = void; _Fn = __detail::__variant::_Move_ctor_base<false, int, __cxx11::basic_string<char, char_traits<char>, allocator<char> > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&)::<lambda(auto:4&&, auto:5)>; _Args = {__cxx11::basic_string<char, char_traits<char>, allocator<char> >, integral_constant<long unsigned int, 1>}]’ at /usr/include/c++/14/bits/invoke.h:61:36, inlined from ‘constexpr typename std::__invoke_result<_Functor, _ArgTypes>::type std::__invoke(_Callable&&, _Args&& ...) [with _Callable = __detail::__variant::_Move_ctor_base<false, int, __cxx11::basic_string<char, char_traits<char>, allocator<char> > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&)::<lambda(auto:4&&, auto:5)>; _Args = {__cxx11::basic_string<char, char_traits<char>, allocator<char> >, integral_constant<long unsigned int, 1>}]’ at /usr/include/c++/14/bits/invoke.h:96:40, inlined from ‘static constexpr decltype(auto) std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::integer_sequence<long unsigned int, __indices ...> >::__visit_invoke(_Visitor&&, _Variants ...) [with _Result_type = std::__detail::__variant::__variant_idx_cookie; _Visitor = std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&)::<lambda(auto:4&&, auto:5)>&&; _Variants = {std::variant<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&}; long unsigned int ...__indices = {1}]’ at /usr/include/c++/14/variant:1049:17, inlined from ‘constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with _Result_type = __detail::__variant::__variant_idx_cookie; _Visitor = __detail::__variant::_Move_ctor_base<false, int, __cxx11::basic_string<char, char_traits<char>, allocator<char> > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&)::<lambda(auto:4&&, auto:5)>; _Variants = {variant<int, __cxx11::basic_string<char, char_traits<char>, allocator<char> > >}]’ at /usr/include/c++/14/variant:1820:5, inlined from ‘constexpr decltype(auto) std::__do_visit(_Visitor&&, _Variants&& ...) [with _Result_type = __detail::__variant::__variant_idx_cookie; _Visitor = __detail::__variant::_Move_ctor_base<false, int, __cxx11::basic_string<char, char_traits<char>, allocator<char> > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&)::<lambda(auto:4&&, auto:5)>; _Variants = {variant<int, __cxx11::basic_string<char, char_traits<char>, allocator<char> > >}]’ at /usr/include/c++/14/variant:1760:5, inlined from ‘constexpr void std::__detail::__variant::__raw_idx_visit(_Visitor&&, _Variants&& ...) [with _Visitor = _Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&&)::<lambda(auto:4&&, auto:5)>; _Variants = {std::variant<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >}]’ at /usr/include/c++/14/variant:184:44, inlined from ‘std::__detail::__variant::_Move_ctor_base<<anonymous>, _Types>::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<<anonymous>, _Types>&&) [with bool <anonymous> = false; _Types = {int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]’ at /usr/include/c++/14/variant:627:28, inlined from ‘std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>::_Copy_assign_base(std::__detail::__variant::_Copy_assign_base<<anonymous>, _Types>&&) [with bool <anonymous> = false; _Types = {int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]’ at /usr/include/c++/14/variant:692:7, inlined from ‘std::__detail::__variant::_Move_assign_base<<anonymous>, _Types>::_Move_assign_base(std::__detail::__variant::_Move_assign_base<<anonymous>, _Types>&&) [with bool <anonymous> = false; _Types = {int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]’ at /usr/include/c++/14/variant:746:7, inlined from ‘std::__detail::__variant::_Variant_base<_Types>::_Variant_base(std::__detail::__variant::_Variant_base<_Types>&&) [with _Types = {int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]’ at /usr/include/c++/14/variant:777:7, inlined from ‘std::variant<_Types>::variant(std::variant<_Types>&&) [with _Types = {int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}]’ at /usr/include/c++/14/variant:1435:7, inlined from ‘constexpr std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = std::__cxx11::basic_string<char>; _U2 = std::variant<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >; typename std::enable_if<(std::_PCC<true, _T1, _T2>::_MoveConstructiblePair<_U1, _U2>() && std::_PCC<true, _T1, _T2>::_ImplicitlyMoveConvertiblePair<_U1, _U2>()), bool>::type <anonymous> = true; _T1 = const std::__cxx11::basic_string<char>; _T2 = std::variant<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >]’ at /usr/include/c++/14/bits/stl_pair.h:882:35, inlined from ‘void foo()’ at variant.cpp:14:1: /usr/include/c++/14/bits/basic_string.h:271:17: error: ‘*(const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)((char*)&<unnamed> + offsetof(std::V, std::variant<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Variant_base<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Move_assign_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Copy_assign_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Move_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Copy_ctor_base<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Variant_storage<false, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::_M_u)).std::__cxx11::basic_string<char>::_M_string_length’ may be used uninitialized [-Werror=maybe-uninitialized] 271 | if (_M_string_length > _S_local_capacity) | ^~~~~~~~~~~~~~~~ variant.cpp: In function ‘void foo()’: variant.cpp:12:53: note: ‘<anonymous>’ declared here 12 | std::map<std::string, V> m{ {"variant"s, V{1}} }; | ^ cc1plus: all warnings being treated as errors $ g++ -std=c++17 -Werror -Wall -Wextra -O2 -c variant.cpp $ g++ -std=c++17 -fsanitize=address -Werror -Wall -Wextra -O0 -c variant.cpp $