c++: please G++ 4.8 with -O3: array bounds

* data/c++.m4, data/lalr1.cc (by_state, by_type): Do not use -1 to
denote the absence of value, as GCC then fears that this -1 might
be used to dereference arrays (such as yytname).
Use 0, which corresponds to $accept, which is valueless (the needed
property: the symbol destructor must not try to reclaim the memory
associated with the symbol).
This commit is contained in:
Akim Demaille
2013-01-29 08:52:57 +01:00
parent 26f95f5f35
commit 675d9fe489
2 changed files with 11 additions and 7 deletions

View File

@@ -231,6 +231,8 @@ m4_define([b4_public_types_declare],
/// The token. /// The token.
token_type token () const; token_type token () const;
enum { empty = 0 };
/// The symbol type. /// The symbol type.
/// ///
/// -1 when this symbol is empty. /// -1 when this symbol is empty.
@@ -328,7 +330,7 @@ m4_define([b4_public_types_define],
// by_type. // by_type.
inline inline
]b4_parser_class_name[::by_type::by_type () ]b4_parser_class_name[::by_type::by_type ()
: type (-1) : type (empty)
{} {}
inline inline
@@ -346,7 +348,7 @@ m4_define([b4_public_types_define],
]b4_parser_class_name[::by_type::move (by_type& that) ]b4_parser_class_name[::by_type::move (by_type& that)
{ {
type = that.type; type = that.type;
that.type = -1; that.type = empty;
} }
inline inline

View File

@@ -284,9 +284,11 @@ b4_location_define])])[
void move (by_state& that); void move (by_state& that);
/// The (internal) type number (corresponding to \a state). /// The (internal) type number (corresponding to \a state).
/// -1 when empty. /// "empty" when empty.
symbol_number_type type_get () const; symbol_number_type type_get () const;
enum { empty = 0 };
/// The state. /// The state.
state_type state; state_type state;
}; };
@@ -523,7 +525,7 @@ m4_if(b4_prefix, [yy], [],
// by_state. // by_state.
inline inline
]b4_parser_class_name[::by_state::by_state () ]b4_parser_class_name[::by_state::by_state ()
: state (-1) : state (empty)
{} {}
inline inline
@@ -536,7 +538,7 @@ m4_if(b4_prefix, [yy], [],
]b4_parser_class_name[::by_state::move (by_state& that) ]b4_parser_class_name[::by_state::move (by_state& that)
{ {
state = that.state; state = that.state;
that.state = -1; that.state = empty;
} }
inline inline
@@ -548,7 +550,7 @@ m4_if(b4_prefix, [yy], [],
]b4_parser_class_name[::symbol_number_type ]b4_parser_class_name[::symbol_number_type
]b4_parser_class_name[::by_state::type_get () const ]b4_parser_class_name[::by_state::type_get () const
{ {
return state == -1 ? -1 : yystos_[state]; return state == empty ? 0 : yystos_[state];
} }
inline inline
@@ -564,7 +566,7 @@ m4_if(b4_prefix, [yy], [],
[value], [move], [that.value])], [value], [move], [that.value])],
[[value = that.value;]])[ [[value = that.value;]])[
// that is emptied. // that is emptied.
that.type = -1; that.type = empty;
} }
inline inline