https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109448

Nigel Tao <nigeltao at golang dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |nigeltao at golang dot org

--- Comment #6 from Nigel Tao <nigeltao at golang dot org> ---
I'm also seeing a spurious maybe-uninitialized warning on GCC 12, GCC 13 and
GCC 14 (but not GCC 11), with -O3 but not with -O2. I am using std::variant but
am not using exceptions.

```
$ cat x.cc
#include <map>
#include <variant>
#include <vector>

struct Struct;
using Map = std::map<int, Struct>;
using Variant = std::variant<const char*, Map>;
struct Struct : Variant {
  Struct(const char* s) : Variant(s) {}
  Struct() : Variant(Map()) {}
};

void foo(std::vector<Struct>& vec) {
  vec.push_back(Struct());
}



$ g++ --version
g++ (Debian 13.2.0-13) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



$ g++ -c -O2 -Wall -Werror x.cc -o /dev/null



$ g++ -c -O3 -Wall -Werror x.cc -o /dev/null
In file included from x.cc:2:
In constructor ‘constexpr std::__detail::__variant::_Uninitialized<_Type,
true>::_Uninitialized(std::in_place_index_t<0>, _Args&& ...) [with _Args =
{const char*}; _Type = const char*]’,
    inlined from ‘constexpr std::__detail::__variant::_Variadic_union<_First,
_Rest ...>::_Variadic_union(std::in_place_index_t<0>, _Args&& ...) [with _Args
= {const char*}; _First = const char*; _Rest = {std::map<int, Struct,
std::less<int>, std::allocator<std::pair<const int, Struct> > >}]’ at
/usr/include/c++/13/variant:411:4,
    inlined from ‘void std::_Construct(_Tp*, _Args&& ...) [with _Tp =
__detail::__variant::_Variadic_union<const char*, map<int, Struct, less<int>,
allocator<pair<const int, Struct> > > >; _Args = {const in_place_index_t<0>&,
const char*}]’ at /usr/include/c++/13/bits/stl_construct.h:119:7,
    inlined from ‘std::__detail::__variant::_Move_ctor_base<false, const char*,
std::map<int, Struct, std::less<int>, std::allocator<std::pair<const int,
Struct> > > >::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false,
const char*, std::map<int, Struct, std::less<int>,
std::allocator<std::pair<const int, Struct> > > >&&)::<lambda(auto:4&&,
auto:5)> mutable [with auto:4 = const char*; auto:5 =
std::integral_constant<long unsigned int, 0>]’ at
/usr/include/c++/13/variant:632:23,
    inlined from ‘constexpr _Res std::__invoke_impl(__invoke_other, _Fn&&,
_Args&& ...) [with _Res = void; _Fn =
__detail::__variant::_Move_ctor_base<false, const char*, map<int, Struct,
less<int>, allocator<pair<const int, Struct> > >
>::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, const
char*, std::map<int, Struct, std::less<int>, std::allocator<std::pair<const
int, Struct> > > >&&)::<lambda(auto:4&&, auto:5)>; _Args = {const char*,
integral_constant<long unsigned int, 0>}]’ at
/usr/include/c++/13/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, const char*, map<int, Struct,
less<int>, allocator<pair<const int, Struct> > >
>::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, const
char*, std::map<int, Struct, std::less<int>, std::allocator<std::pair<const
int, Struct> > > >&&)::<lambda(auto:4&&, auto:5)>; _Args = {const char*,
integral_constant<long unsigned int, 0>}]’ at
/usr/include/c++/13/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, const char*, std::map<int,
Struct, std::less<int>, std::allocator<std::pair<const int, Struct> > >
>::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, const
char*, std::map<int, Struct, std::less<int>, std::allocator<std::pair<const
int, Struct> > > >&&)::<lambda(auto:4&&, auto:5)>&&; _Variants =
{std::variant<const char*, std::map<int, Struct, std::less<int>,
std::allocator<std::pair<const int, Struct> > > >&&}; long unsigned int
...__indices = {0}]’ at /usr/include/c++/13/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, const char*, map<int, Struct,
less<int>, allocator<pair<const int, Struct> > >
>::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, const
char*, std::map<int, Struct, std::less<int>, std::allocator<std::pair<const
int, Struct> > > >&&)::<lambda(auto:4&&, auto:5)>; _Variants = {variant<const
char*, map<int, Struct, less<int>, allocator<pair<const int, Struct> > > >}]’
at /usr/include/c++/13/variant:1815:5,
    inlined from ‘constexpr void
std::__detail::__variant::__raw_idx_visit(_Visitor&&, _Variants&& ...) [with
_Visitor = _Move_ctor_base<false, const char*, std::map<int, Struct,
std::less<int>, std::allocator<std::pair<const int, Struct> > >
>::_Move_ctor_base(std::__detail::__variant::_Move_ctor_base<false, const
char*, std::map<int, Struct, std::less<int>, std::allocator<std::pair<const
int, Struct> > > >&&)::<lambda(auto:4&&, auto:5)>; _Variants =
{std::variant<const char*, std::map<int, Struct, std::less<int>,
std::allocator<std::pair<const int, Struct> > > >}]’ at
/usr/include/c++/13/variant:183: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 = {const char*, std::map<int,
Struct, std::less<int>, std::allocator<std::pair<const int, Struct> > >}]’ at
/usr/include/c++/13/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 = {const char*, std::map<int,
Struct, std::less<int>, std::allocator<std::pair<const int, Struct> > >}]’ at
/usr/include/c++/13/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 = {const char*, std::map<int,
Struct, std::less<int>, std::allocator<std::pair<const int, Struct> > >}]’ at
/usr/include/c++/13/variant:746:7,
    inlined from
‘std::__detail::__variant::_Variant_base<_Types>::_Variant_base(std::__detail::__variant::_Variant_base<_Types>&&)
[with _Types = {const char*, std::map<int, Struct, std::less<int>,
std::allocator<std::pair<const int, Struct> > >}]’ at
/usr/include/c++/13/variant:777:7,
    inlined from ‘std::variant<_Types>::variant(std::variant<_Types>&&) [with
_Types = {const char*, std::map<int, Struct, std::less<int>,
std::allocator<std::pair<const int, Struct> > >}]’ at
/usr/include/c++/13/variant:1429:7,
    inlined from ‘Struct::Struct(Struct&&)’ at x.cc:11:8,
    inlined from ‘void std::__new_allocator<_Tp>::construct(_Up*, _Args&& ...)
[with _Up = Struct; _Args = {Struct}; _Tp = Struct]’ at
/usr/include/c++/13/bits/new_allocator.h:191:4,
    inlined from ‘static void std::allocator_traits<std::allocator<_Tp1>
>::construct(allocator_type&, _Up*, _Args&& ...) [with _Up = Struct; _Args =
{Struct}; _Tp = Struct]’ at /usr/include/c++/13/bits/alloc_traits.h:538:17,
    inlined from ‘std::vector<_Tp, _Alloc>::reference std::vector<_Tp,
_Alloc>::emplace_back(_Args&& ...) [with _Args = {Struct}; _Tp = Struct; _Alloc
= std::allocator<Struct>]’ at /usr/include/c++/13/bits/vector.tcc:117:30,
    inlined from ‘void std::vector<_Tp, _Alloc>::push_back(value_type&&) [with
_Tp = Struct; _Alloc = std::allocator<Struct>]’ at
/usr/include/c++/13/bits/stl_vector.h:1296:21,
    inlined from ‘void foo(std::vector<Struct>&)’ at x.cc:17:16:
/usr/include/c++/13/variant:224:11: error: ‘*(const char**)((char*)&<unnamed> +
offsetof(Struct, Struct::<unnamed>.std::variant<const char*, std::map<int,
Struct, std::less<int>, std::allocator<std::pair<const int, Struct> > >
>::<unnamed>.std::__detail::__variant::_Variant_base<const char*, std::map<int,
Struct, std::less<int>, std::allocator<std::pair<const int, Struct> > >
>::<unnamed>.std::__detail::__variant::_Move_assign_base<false, const char*,
std::map<int, Struct, std::less<int>, std::allocator<std::pair<const int,
Struct> > > >::<unnamed>.std::__detail::__variant::_Copy_assign_base<false,
const char*, std::map<int, Struct, std::less<int>,
std::allocator<std::pair<const int, Struct> > >
>::<unnamed>.std::__detail::__variant::_Move_ctor_base<false, const char*,
std::map<int, Struct, std::less<int>, std::allocator<std::pair<const int,
Struct> > > >::<unnamed>.std::__detail::__variant::_Copy_ctor_base<false, const
char*, std::map<int, Struct, std::less<int>, std::allocator<std::pair<const
int, Struct> > > >::<unnamed>.std::__detail::__variant::_Variant_storage<false,
const char*, std::map<int, Struct, std::less<int>,
std::allocator<std::pair<const int, Struct> > > >::_M_u))’ may be used
uninitialized [-Werror=maybe-uninitialized]
  224 |         : _M_storage(std::forward<_Args>(__args)...)
      |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
x.cc: In function ‘void foo(std::vector<Struct>&)’:
x.cc:17:24: note: ‘<anonymous>’ declared here
   17 |   vec.push_back(Struct());
      |                        ^
cc1plus: all warnings being treated as errors
```


https://godbolt.org/z/vKsY9fcfr

Reply via email to