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.