bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Possible bug or simple nuisance compiler warning


From: Akim Demaille
Subject: Re: Possible bug or simple nuisance compiler warning
Date: Thu, 3 Dec 2020 06:31:02 +0100

Hi all,

> Le 30 nov. 2020 à 07:19, Akim Demaille <akim@lrde.epita.fr> a écrit :
> 
> Hi Jot,
> 
> [...]
> Therefore:
> 1. the compiler is right, a cast would be nice to avoid this warning.
> 2. it's actually a pity to use -1 here to mean "invalid value".
> 
> I won't address (1), I think it's better to address (2) by using 0 instead of 
> -1, which in this precise case would result in the use of "unsigned char 
> yydefgoto", i.e., the very same type as state_type.

I will install this following commit.  Cheers!

commit 24233748ecd1dfaae212224fb269531eca50ad37
Author: Akim Demaille <akim.demaille@gmail.com>
Date:   Wed Dec 2 21:39:26 2020 +0100

    tables: avoid warnings and save bits
    
    The yydefgoto table uses -1 as an invalid for an impossible case (we
    never use yydefgoto[0], since it corresponds to the reduction to
    $accept, which never happens).  Since yydefgoto is a table of state
    numbers, this -1 forces a signed type uselessly, which (1) might
    trigger compiler warnings when storing a value from yydefgoto into a
    state number (nonnegative), and (2) wastes bits which might result in
    using a int16 where a uint8 suffices.
    
    Reported by Jot Dot <jotdot@shaw.ca>.
    https://lists.gnu.org/r/bug-bison/2020-11/msg00027.html
    
    * src/tables.c (default_goto): Use 0 rather than -1 as invalid value.
    * tests/regression.at: Adjust.

diff --git a/src/parse-gram.c b/src/parse-gram.c
index adda86af..83f7d4a9 100644
--- a/src/parse-gram.c
+++ b/src/parse-gram.c
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.7.3.118-d0ea7-dirty.  */
+/* A Bison parser, made by GNU Bison 3.7.4.133-f40c-dirty.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
@@ -46,10 +46,10 @@
    USER NAME SPACE" below.  */
 
 /* Identify Bison output, and Bison version.  */
-#define YYBISON 30703
+#define YYBISON 30704
 
 /* Bison version string.  */
-#define YYBISON_VERSION "3.7.3.118-d0ea7-dirty"
+#define YYBISON_VERSION "3.7.4.133-f40c-dirty"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -799,9 +799,9 @@ static const yytype_int16 yypgoto[] =
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int16 yydefgoto[] =
+static const yytype_uint8 yydefgoto[] =
 {
-      -1,     1,     2,    43,    81,   115,    76,    45,    83,    46,
+       0,     1,     2,    43,    81,   115,    76,    45,    83,    46,
       50,    49,    51,    47,    60,   158,   120,   121,   122,    96,
       92,    93,    94,   128,   142,    86,    87,    88,    99,    70,
       77,    78,    79,   136,   146,   147,   113,    55,   105,    71,
diff --git a/src/parse-gram.h b/src/parse-gram.h
index b679374e..02e352e2 100644
--- a/src/parse-gram.h
+++ b/src/parse-gram.h
@@ -1,4 +1,4 @@
-/* A Bison parser, made by GNU Bison 3.7.3.118-d0ea7-dirty.  */
+/* A Bison parser, made by GNU Bison 3.7.4.133-f40c-dirty.  */
 
 /* Bison interface for Yacc-like parsers in C
 
diff --git a/src/tables.c b/src/tables.c
index 052e96e6..d26a4a97 100644
--- a/src/tables.c
+++ b/src/tables.c
@@ -512,7 +512,14 @@ default_goto (symbol_number sym, size_t state_count[])
 {
   const goto_number begin = goto_map[sym - ntokens];
   const goto_number end = goto_map[sym - ntokens + 1];
-  state_number res = -1;
+
+  /* In the case this symbol is never reduced to ($accept), use state
+     0.  We used to use -1, but as a result the yydefgoto table must
+     be signed, which (1) might trigger compiler warnings when storing
+     a value from yydefgoto into a state number (nonnegative), and (2)
+     wastes bits which might result in using a int16 where a uint8
+     suffices. */
+  state_number res = 0;
 
   if (begin != end)
     {
diff --git a/tests/regression.at b/tests/regression.at
index 3e57e38a..5bb05ae9 100644
--- a/tests/regression.at
+++ b/tests/regression.at
@@ -737,7 +737,7 @@ static const yytype_int8 yypgoto[] =
 };
 static const yytype_int8 yydefgoto[] =
 {
-      -1,     2,     3,     4,     8
+       0,     2,     3,     4,     8
 };
 static const yytype_int8 yytable[] =
 {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]