https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114592
Bug ID: 114592 Summary: Bogus `maybe-uninitialized` on std::variant with std::string with -O3 Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: janisozaur+gcc at gmail dot com Target Milestone: --- Created attachment 57879 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=57879&action=edit minimized reproducer When trying to compile source file which creates a std::variant which holds std::string and push it to std::vector, I get bogus warning about string's internals being left uninitialized. This only happens when using -O3, lower optimisations do not exhibit this issue. $ g++ --version g++ (GCC) 14.0.1 20240404 (experimental) Copyright (C) 2024 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++ -Werror=maybe-uninitialized -O3 -std=gnu++20 -c test-maybe-uninitialized-gcc14.cpp <...snip...> /path/gcc-install-master/include/c++/14.0.1/bits/basic_string.h:271:17: error: ‘*(const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)((char*)&<unnamed> + offsetof(std::value_type, std::variant<short unsigned int, int, long int, const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Variant_base<short unsigned int, int, long int, const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Move_assign_base<false, short unsigned int, int, long int, const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Copy_assign_base<false, short unsigned int, int, long int, const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Move_ctor_base<false, short unsigned int, int, long int, const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Copy_ctor_base<false, short unsigned int, int, long int, const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::<unnamed>.std::__detail::__variant::_Variant_storage<false, short unsigned int, int, long int, const char*, 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) | ^~~~~~~~~~~~~~~~ test-maybe-uninitialized-gcc14.cpp: In function ‘void BuildAnyArgListFromLegacyArgBuffer(std::vector<std::variant<short unsigned int, int, long int, const char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, const void*&)’: test-maybe-uninitialized-gcc14.cpp:20:22: note: ‘<anonymous>’ declared here 20 | anyArgs.push_back(sz); | ~~~~~~~~~~~~~~~~~^~~~ It seems to be present in GCC 12 already, last working version is GCC 11 Original code: https://github.com/OpenRCT2/OpenRCT2/blob/318bff1eac9a51b49ce20029d7a552efdd18e1cd/src/openrct2/localisation/Formatting.cpp#L795 godbolt reproducer with minimized test case: https://godbolt.org/z/9GT9PKTxG