From 675d9fe4899dc7a2b99d7401a58610b7c63ec1e5 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 29 Jan 2013 08:52:57 +0100 Subject: [PATCH] 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). --- 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 e91b90d7..87bc5e0d 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 473dd29b..eb488355 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 -- 2.45.2