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