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
$

Reply via email to