https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111944
Bug ID: 111944
Summary: Spurious '<anonymous>' is used uninitialized in
Boost.Variant2 (-Wuninitialized -Og)
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ed at catmur dot uk
Target Milestone: ---
Since 12.1, with Boost 1.71 or later,
#include <boost/variant2/variant.hpp>
int main() {
boost::variant2::variant<boost::variant2::monostate, int> r;
r.emplace<boost::variant2::monostate>();
}
In member function 'constexpr void
boost::variant2::detail::variant_storage_impl<std::integral_constant<bool,
true>, T1, T ...>::emplace_impl(boost::mp11::mp_true,
boost::mp11::mp_size_t<I>, A&& ...) [with long unsigned int I = 1; A = {}; T1 =
boost::variant2::detail::none; T = {boost::variant2::monostate, int}]',
inlined from 'constexpr void
boost::variant2::detail::variant_storage_impl<std::integral_constant<bool,
true>, T1, T ...>::emplace(boost::mp11::mp_size_t<I>, A&& ...) [with long
unsigned int I = 1; A = {}; T1 = boost::variant2::detail::none; T =
{boost::variant2::monostate, int}]' at boost/variant2/variant.hpp:705:27,
inlined from 'constexpr void
boost::variant2::detail::variant_base_impl<true, true, T
...>::emplace_impl(boost::mp11::mp_true, A&& ...) [with long unsigned int J =
1; U = boost::variant2::monostate; A = {}; T = {boost::variant2::monostate,
int}]' at boost/variant2/variant.hpp:902:20,
inlined from 'constexpr void
boost::variant2::detail::variant_base_impl<true, true, T ...>::emplace(A&& ...)
[with long unsigned int I = 0; A = {}; T = {boost::variant2::monostate, int}]'
at boost/variant2/variant.hpp:921:33,
inlined from 'constexpr U& boost::variant2::variant<T>::emplace(A&& ...)
[with U = boost::variant2::monostate; A = {}; E = void; T =
{boost::variant2::monostate, int}]' at boost/variant2/variant.hpp:1690:49:
boost/variant2/variant.hpp:696:9: warning: '<anonymous>' is used uninitialized
[-Wuninitialized]
696 | *this = variant_storage_impl( mp11::mp_size_t<I>(),
std::forward<A>(a)... );
| ^
boost/variant2/variant.hpp: In member function 'constexpr U&
boost::variant2::variant<T>::emplace(A&& ...) [with U =
boost::variant2::monostate; A = {}; E = void; T = {boost::variant2::monostate,
int}]':
boost/variant2/variant.hpp:696:17: note: '<anonymous>' declared here
696 | *this = variant_storage_impl( mp11::mp_size_t<I>(),
std::forward<A>(a)... );
|
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Boost.Variant2 has a suppression at this line for Wmaybe-uninitialized
referencing asan, (a) this isn't with sanitizer, and (b) it's Wuninitialized.
This only appears to affect -Og, though, so fairly minor.