[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 5/6] c++: please G++ 4.8 with -O3: array bounds
From: |
Akim Demaille |
Subject: |
[PATCH 5/6] c++: please G++ 4.8 with -O3: array bounds |
Date: |
Tue, 29 Jan 2013 09:04:36 +0100 |
* 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).
---
data/c++.m4 | 6 ++++--
data/lalr1.cc | 12 +++++++-----
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/data/c++.m4 b/data/c++.m4
index e91b90d..87bc5e0 100644
--- a/data/c++.m4
+++ b/data/c++.m4
@@ -231,6 +231,8 @@ m4_define([b4_public_types_declare],
/// The token.
token_type token () const;
+ enum { empty = 0 };
+
/// The symbol type.
///
/// -1 when this symbol is empty.
@@ -328,7 +330,7 @@ m4_define([b4_public_types_define],
// by_type.
inline
]b4_parser_class_name[::by_type::by_type ()
- : type (-1)
+ : type (empty)
{}
inline
@@ -346,7 +348,7 @@ m4_define([b4_public_types_define],
]b4_parser_class_name[::by_type::move (by_type& that)
{
type = that.type;
- that.type = -1;
+ that.type = empty;
}
inline
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 473dd29..eb48835 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -284,9 +284,11 @@ b4_location_define])])[
void move (by_state& that);
/// The (internal) type number (corresponding to \a state).
- /// -1 when empty.
+ /// "empty" when empty.
symbol_number_type type_get () const;
+ enum { empty = 0 };
+
/// The state.
state_type state;
};
@@ -523,7 +525,7 @@ m4_if(b4_prefix, [yy], [],
// by_state.
inline
]b4_parser_class_name[::by_state::by_state ()
- : state (-1)
+ : state (empty)
{}
inline
@@ -536,7 +538,7 @@ m4_if(b4_prefix, [yy], [],
]b4_parser_class_name[::by_state::move (by_state& that)
{
state = that.state;
- that.state = -1;
+ that.state = empty;
}
inline
@@ -548,7 +550,7 @@ m4_if(b4_prefix, [yy], [],
]b4_parser_class_name[::symbol_number_type
]b4_parser_class_name[::by_state::type_get () const
{
- return state == -1 ? -1 : yystos_[state];
+ return state == empty ? 0 : yystos_[state];
}
inline
@@ -564,7 +566,7 @@ m4_if(b4_prefix, [yy], [],
[value], [move], [that.value])],
[[value = that.value;]])[
// that is emptied.
- that.type = -1;
+ that.type = empty;
}
inline
--
1.8.1.1
- [PATCH 0/6] {master} c++: various improvements, Akim Demaille, 2013/01/29
- [PATCH 2/6] c++: improve the signature of yysyntax_error_, Akim Demaille, 2013/01/29
- [PATCH 4/6] c++: use more explicit types than int, Akim Demaille, 2013/01/29
- [PATCH 1/6] c++: style changes, Akim Demaille, 2013/01/29
- [PATCH 6/6] c++: please G++ 4.8 with -O3: type puning issue, Akim Demaille, 2013/01/29
- [PATCH 3/6] c++: value_type -> kind_type, Akim Demaille, 2013/01/29
- [PATCH 5/6] c++: please G++ 4.8 with -O3: array bounds,
Akim Demaille <=