https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105423
Bug ID: 105423 Summary: Bogus -Werror=maybe-uninitialized with definitely initialized variable Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: byteslice at airmail dot cc Target Milestone: --- Created attachment 52896 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52896&action=edit Cvised example On gcc 12.0.1 20220413 (Fedora 36 Beta), with c++ -O1 -Werror=maybe-uninitialized, the attachment fails to compile, with the following message: In member function 'void std::Trans_NS___cxx11_basic_string<_CharT, <template-parameter-1-2>, <template-parameter-1-3> >::_S_copy(_CharT*) [with _CharT = char; _Traits = std::char_traits; <template-parameter-1-3> = char]', inlined from 'constexpr std::Trans_NS___cxx11_basic_string<_CharT, _Traits, _Alloc>& std::Trans_NS___cxx11_basic_string<_CharT, <template-parameter-1-2>, <template-parameter-1-3> >::_M_replace(const _CharT*, long int) [with _CharT = char; _Traits = std::char_traits; <template-parameter-1-3> = char]' at <source>:49:12, inlined from 'void std::Trans_NS___cxx11_basic_string<_CharT, <template-parameter-1-2>, <template-parameter-1-3> >::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits; <template-parameter-1-3> = char]' at <source>:40:15, inlined from 'void Shuffle()' at <source>:55:8: <source>:36:46: error: '((char*)((char*)&mask + offsetof(std::Trans_NS___cxx11_basic_string<char, std::char_traits, char>,std::Trans_NS___cxx11_basic_string<char, std::char_traits, char>::<unnamed>)))[2]' may be used uninitialized [-Werror=maybe-uninitialized] 36 | void _S_copy(_CharT *__s) { _Traits::assign(_S_copy___d, *__s); } | ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~ <source>: In function 'void Shuffle()': <source>:54:44: note: 'mask' declared here 54 | std::Trans_NS___cxx11_basic_string<char> mask{}; | ^~~~ In member function 'void std::Trans_NS___cxx11_basic_string<_CharT, <template-parameter-1-2>, <template-parameter-1-3> >::_S_copy(_CharT*) [with _CharT = char; _Traits = std::char_traits; <template-parameter-1-3> = char]', inlined from 'constexpr std::Trans_NS___cxx11_basic_string<_CharT, _Traits, _Alloc>& std::Trans_NS___cxx11_basic_string<_CharT, <template-parameter-1-2>, <template-parameter-1-3> >::_M_replace(const _CharT*, long int) [with _CharT = char; _Traits = std::char_traits; <template-parameter-1-3> = char]' at <source>:49:12, inlined from 'void std::Trans_NS___cxx11_basic_string<_CharT, <template-parameter-1-2>, <template-parameter-1-3> >::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits; <template-parameter-1-3> = char]' at <source>:40:15, inlined from 'void Shuffle()' at <source>:55:8: <source>:36:47: error: 'mask.std::Trans_NS___cxx11_basic_string<char>::_S_copy___d' may be used uninitialized [-Werror=maybe-uninitialized] 36 | void _S_copy(_CharT *__s) { _Traits::assign(_S_copy___d, *__s); } | ^~~~~~~~~~~ <source>: In function 'void Shuffle()': <source>:54:44: note: 'mask' declared here 54 | std::Trans_NS___cxx11_basic_string<char> mask{}; | ^~~~ cc1plus: some warnings being treated as errors Compiler returned: 1 This warning is bogus because the variable mask is default brace-initialized and thus its member _S_copy___d is also initialized. The bogus warning does not appear in older versions of GCC. Adding -fno-inline to options allows compilation to succeed.