https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89733
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |msebor at gcc dot gnu.org Resolution|--- |INVALID --- Comment #12 from Martin Sebor <msebor at gcc dot gnu.org> --- Confirming the unconditional uninitialized read in the IL for the test case in attachment 4599 and GCC correctly diagnoses it: ;; Function boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<const char*, boost::mpl::vector<int> >, boost::spirit::lex::lexertl::detail::data, const char*, mpl_::bool_<true>, mpl_::bool_<true> > >::iterator<boost::spirit::lex::lexertl::lexer<boost::spirit::lex::lexertl::token<const char*, boost::mpl::vector<int> >, const char*, boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<const char*, boost::mpl::vector<int> >, boost::spirit::lex::lexertl::detail::data, const char*, mpl_::bool_<true>, mpl_::bool_<true> > >::iterator_data_type> (_ZN5boost6spirit3lex7lexertl8iteratorINS2_7functorINS2_5tokenIPKcNS_3mpl6vectorIiN4mpl_2naESB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_SB_EENSA_5bool_ILb1EEEmEENS2_6detail4dataES7_SE_SE_EEEC2INS2_5lexerISF_S7_SI_E18iterator_data_typeEEERKT_RS7_RKS7_S7_, funcdef_no=13218, decl_uid=464032, cgraph_uid=4528, symbol_order=4816) void boost::spirit::lex::lexertl::iterator<boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<const char*, boost::mpl::vector<int> >, boost::spirit::lex::lexertl::detail::data, const char*, mpl_::bool_<true>, mpl_::bool_<true> > >::iterator<boost::spirit::lex::lexertl::lexer<boost::spirit::lex::lexertl::token<const char*, boost::mpl::vector<int> >, const char*, boost::spirit::lex::lexertl::functor<boost::spirit::lex::lexertl::token<const char*, boost::mpl::vector<int> >, boost::spirit::lex::lexertl::detail::data, const char*, mpl_::bool_<true>, mpl_::bool_<true> > >::iterator_data_type> (struct iterator * const this, const struct iterator_data_type & iterdata_, const char * & first, const char * const & last, const char_type * state) { ... <bb 2> [local count: 1073741824]: MEM[(struct __as_base &)&D.470882] ={v} {CLOBBER}; MEM[(struct data *)&D.470882] ={v} {CLOBBER}; MEM[(struct __as_base &)&D.470882] ={v} {CLOBBER}; MEM[(struct data *)&D.470882].first_ = first_6(D); _16 = MEM[(const char * const &)last_7(D)]; MEM[(struct data *)&D.470882].last_ = _16; _17 = *iterdata__5(D).state_machine_; MEM[(struct data *)&D.470882].state_machine_ = _17; _18 = *iterdata__5(D).rules_; MEM[(struct data *)&D.470882].rules_ = _18; _19 = MEM[(const struct internals &)_17]._seen_BOL_assertion; MEM[(struct data *)&D.470882].bol_ = _19; MEM[(struct data *)&D.470882].state_ = 0; _20 = *iterdata__5(D).actions_; MEM[(struct data *)&D.470882].actions_ = _20; MEM[(struct data *)&D.470882].hold_ = 0B; MEM[(struct variant *)&D.470882 + 72B] ={v} {CLOBBER}; MEM[(struct aligned_storage *)&D.470882 + 80B] ={v} {CLOBBER}; MEM <const char *> [(struct value_T *)&D.470882 + 80B] = _16; MEM <const char *> [(struct value_T *)&D.470882 + 88B] = _16; MEM[(struct variant *)&D.470882 + 72B].which_ = 0; MEM[(struct data *)&D.470882].has_value_ = 0; MEM[(struct data *)&D.470882].has_hold_ = 0; MEM[(struct pair *)&D.470880] ={v} {CLOBBER}; MEM[(struct __as_base &)&D.470880 + 8] ={v} {CLOBBER}; MEM[(struct data *)&D.470880 + 8B].D.426958 = MEM[(const struct data &)&D.470882].D.426958; MEM[(struct data *)&D.470880 + 8B].actions_ = _20; MEM[(struct data *)&D.470880 + 8B].hold_ = 0B; _57 = MEM[(const struct data &)&D.470882].end_; <<< -Wuninitialized MEM[(struct data *)&D.470880 + 8B].end_ = _57; Likewise, the uninitialized read in the small test case in comment #7 is diagnosed: In copy constructor ‘X::X(const X&)’, inlined from ‘Y<T>::Y(T) [with T = X]’ at pr89733-c7.C:4:12, inlined from ‘void foo()’ at pr89733-c7.C:18:3: pr89733-c7.C:11:7: warning: ‘<unnamed>.X::end_’ is used uninitialized [-Wuninitialized] 11 | class X { | ^ pr89733-c7.C: In function ‘void foo()’: pr89733-c7.C:18:11: note: ‘<anonymous>’ declared here 18 | Y<X>(X(0)); | ^ So resolving as invalid as per comment 6.