https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89733
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I'm certainly seeing the uninitialized loads in the IL though.
typename Lexer::iterator_type iter = lex.begin(first, last);
in tokenize_and_parse calls
template <typename Iterator>
iterator_type begin(Iterator& first, Iterator const& last
, char_type const* initial_state = 0) const
{ return this->lexer_type::begin(first, last, initial_state); }
which calls
template <typename IteratorData>
iterator(IteratorData const& iterdata_, base_iterator_type& first
, base_iterator_type const& last, char_type const* state = 0)
: base_type(functor_type(unique_functor_type()
, shared_functor_type(iterdata_, first, last)))
{
set_state(map_state(state));
}
which calls:
template<typename _U1, typename _U2, typename
enable_if<_PCCP::template
_MoveConstructiblePair<_U1, _U2>()
&& _PCCP::template
_ImplicitlyMoveConvertiblePair<_U1, _U2>(),
bool>::type=true>
constexpr pair(_U1&& __x, _U2&& __y)
: first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }
which calls:
template <typename Iterator, typename HasState, typename TokenValue>
class data<Iterator, mpl::true_, HasState, TokenValue>
: public data<Iterator, mpl::false_, HasState, TokenValue>
{
's defaulted copy constructor, which would like to copy end_ among other
non-static data members, but that is uninitialized.
It can be seen after the inlining already:
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:300:13] MEM[(struct
&)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.5608
49] ={v} {CLOBBER};
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:221:13] MEM[(struct
&)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.5608
49] ={v} {CLOBBER};
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:57:13] MEM[(struct
&)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.56084
9] ={v} {CLOBBER};
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69] MEM[(struct data
*)
[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849].first_ =
first_3(D);
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69] _87 =
last_407(D);
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69] MEM[(struct data
*)
[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849].last_ =
_87;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:59:38] _88 =
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:59:38] MEM[(const st
ruct iterator_data_type
&)[./boost/spirit/home/lex/lexer/lexertl/lexer.hpp:205:34]
&iterator_data].state_machine_;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69] MEM[(struct data
*)
[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61]
&D.560849].state_machine_ = _88;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:60:30] _89 =
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:60:30] MEM[(const st
ruct iterator_data_type
&)[./boost/spirit/home/lex/lexer/lexertl/lexer.hpp:205:34]
&iterator_data].rules_;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69] MEM[(struct data
*)
[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849].rules_ =
_89;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:50] _90 =
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:50] MEM[(const
struct internals &)_88]._seen_BOL_assertion;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:61:69] MEM[(struct data
*)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849].bol_ =
_90;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:223:25]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:223:25] MEM[(struct
data *)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61]
&D.560849].state_ = 0;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:302:32] _91 =
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:302:32] MEM[(const
struct iterator_data_type
&)[./boost/spirit/home/lex/lexer/lexertl/lexer.hpp:205:34]
&iterator_data].actions_;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51] MEM[(struct
data *)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61]
&D.560849].actions_ = _91;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51] MEM[(struct
data *)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61]
&D.560849].hold_ = 0B;
[./boost/variant/variant.hpp:1848:5] MEM[(struct
&)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849 + 72]
={v} {CLOBBER};
[./boost/type_traits/aligned_storage.hpp:108:5] MEM[(struct
&)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849 + 80]
={v} {CLOBBER};
MEM[(struct value_T
*)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849 + 80B] =
_87;
MEM[(struct value_T
*)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849 + 88B] =
_87;
[./boost/variant/variant.hpp:1434:9] MEM[(which_t
*)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560849 + 72B] =
0;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51] MEM[(struct
data *)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61]
&D.560849].has_value_ = 0;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:304:51] MEM[(struct
data *)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61]
&D.560849].has_hold_ = 0;
[/usr/include/c++/8/bits/stl_pair.h:330:12] MEM[(struct
&)[./boost/spirit/home/lex/lexer/lexertl/iterator.hpp:85:61] &D.560850] ={v}
{CLOBBER};
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] MEM[(struct
&)&D.560850 + 8] ={v} {CLOBBER};
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] MEM[(struct
data *)&D.560850 + 8B].D.418885 = MEM[(const struct data *)&D.560849].D.418885;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] _100 =
MEM[(const struct data &)&D.560849].actions_;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] MEM[(struct
data
*)&D.560850 + 8B].actions_ = _100;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] _101 =
MEM[(const struct data &)&D.560849].hold_;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] MEM[(struct
data
*)&D.560850 + 8B].hold_ = _101;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] _102 =
MEM[(const struct data &)&D.560849].end_;
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15]
[./boost/spirit/home/lex/lexer/lexertl/functor_data.hpp:276:15] MEM[(struct
data *)&D.560850 + 8B].end_ = _102;
actions_ and hold_ are initialized, but end_ is not.