merge maint into master

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
commit 7e16bd2cae4f6762449927b2ca3159f44724a3ee
Merge: 94f7606d 508ac099
Author: Akim Demaille <[email protected]>
Date:   Wed Jun 3 08:12:10 2020 +0200

    Merge maint into HEAD
    
    * upstream/maint:
      maint: post-release administrivia
      version 3.6.3
      build: check -Wmissing-prototypes
      tests: show logs
      c++: fix printing of state number on streams

diff --git a/.prev-version b/.prev-version
index b7276283..4a788a01 100644
--- a/.prev-version
+++ b/.prev-version
@@ -1 +1 @@
-3.6.2
+3.6.3
diff --git a/NEWS b/NEWS
index 8fc26618..4c77cedd 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,16 @@ GNU Bison NEWS
   to the -ffile-prefix-map in GCC. This option can be used to make bison output
   reproducible.
 
+* Noteworthy changes in release 3.6.3 (2020-06-03) [stable]
+
+** Bug fixes
+
+  Incorrect comments in the generated parsers.
+
+  Warnings in push parsers (yacc.c).
+
+  Incorrect display of gotos in LAC traces (lalr1.cc).
+
 * Noteworthy changes in release 3.6.2 (2020-05-17) [stable]
 
 ** Bug fixes
diff --git a/README-hacking.md b/README-hacking.md
index 2fa15824..338a03ac 100644
--- a/README-hacking.md
+++ b/README-hacking.md
@@ -73,7 +73,7 @@ The `#include` directives follow an order:
   <verify.h>`, not `#include "verify.h"`).
 - then headers from src/ with double quotes (`#include "getargs.h"`).
 
-Keep headers sort alphabetically in each section.
+Keep headers sorted alphabetically in each section.
 
 See also the [Header
 files](https://www.gnu.org/software/gnulib/manual/html_node/Header-files.html)
@@ -100,7 +100,7 @@ We indent the CPP directives this way:
 #endif
 ```
 
-Don't indent with leading spaces in the skeletons (it's ok in the grammar
+Don't indent with leading spaces in the skeletons (it's OK in the grammar
 files though, e.g., in `%code {...}` blocks).
 
 On occasions, use `cppi -c` to see where we stand.  We don't aim at full
@@ -111,7 +111,7 @@ of the *.h file, but don't waste time on this.
 Don't hesitate to leave a comment on the `#endif` (e.g., `#endif /* FOO
 */`), especially for long blocks.
 
-There is no conistency on `! defined` vs. `!defined`.  The day gnulib
+There is no consistency on `! defined` vs. `!defined`.  The day gnulib
 decides, we'll follow them.
 
 #### C/C++
@@ -439,11 +439,11 @@ Use the `javaexec.sh` script.  For instance to run the parser of test case
 
 ## Using Sanitizers
 Address sanitizer (ASAN) and undefined-behavior sanitizer (UBSAN) are very
-useful.  Here's one way to set ASAN up with GCC 10 on MacPorts
+useful.  Here's one way to set ASAN up with GCC 10 on Mac Ports
 
 1. Configure with
 
-    $ ~bison/configure -C --enable-gcc-warnings \
+    $ ./configure -C --enable-gcc-warnings \
         CPPFLAGS='-isystem /opt/local/include' \
         CC='gcc-mp-10 -fsanitize=address' \
         CFLAGS='-ggdb' \
@@ -577,8 +577,10 @@ LocalWords:  symlinks vti html lt POSIX Cc'ed Graphviz Texinfo autoconf jN
 LocalWords:  automake autopoint graphviz texinfo PROG Wother parsers YYFOO
 LocalWords:  TESTSUITEFLAGS deprec struct gnulib's getopt config ggdb yyfoo
 LocalWords:  bitset fsanitize symlink CFLAGS MERCHANTABILITY ispell wrt YY
-LocalWords:  american Administrivia camlCase yy accessors namespace src
-LocalWords:  getExpectedTokens yyexpectedTokens yygetExpectedTokens
-LocalWords:  regen dogfooding Autotest testsuite
+LocalWords:  american Administrivia camlCase yy accessors namespace src hoc
+LocalWords:  getExpectedTokens yyexpectedTokens yygetExpectedTokens parens
+LocalWords:  regen dogfooding Autotest testsuite getargs CPP BAZ endif cppi
+LocalWords:  cpp javaexec cp Calc ASAN UBSAN CPPFLAGS isystem CXX cex
+LocalWords:  CXXFLAGS LDFLAGS dsymutil
 
 -->
diff --git a/THANKS b/THANKS
index 48b31ea9..36df5e29 100644
--- a/THANKS
+++ b/THANKS
@@ -162,6 +162,7 @@ Quoc Peyrot               [email protected]
 R Blake                   [email protected]
 Raja R Harinath           [email protected]
 Ralf Wildenhues           [email protected]
+Ryan                      [email protected]
 Rich Wilson               [email protected]
 Richard Stallman          [email protected]
 Rici Lake                 [email protected]
diff --git a/configure.ac b/configure.ac
index edc05eb5..c5750a6d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -132,10 +132,12 @@ if test "$enable_gcc_warnings" = yes; then
     -fparse-all-comments -Wdocumentation
     -Wformat -Wimplicit-fallthrough -Wnull-dereference
     -Wno-sign-compare -Wno-tautological-constant-out-of-range-compare
-    -Wpointer-arith -Wshadow
+    -Wpointer-arith -Wshadow -Wstrict-aliasing
     -Wwrite-strings
     -wr188 -wr2259 -wr3179'
-  warn_c='-Wbad-function-cast -Wstrict-prototypes'
+  warn_c='-Wbad-function-cast
+    -Wmissing-prototypes
+    -Wstrict-prototypes'
   warn_cxx='-Wextra-semi -Wnoexcept -Wold-style-cast -Wundefined-func-template
     -Wweak-vtables'
   # Warnings for the test suite only.
diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c
index b82029c0..ffc02efd 100644
--- a/data/skeletons/yacc.c
+++ b/data/skeletons/yacc.c
@@ -1480,7 +1480,7 @@ yypull_parse (yypstate *yyps]b4_user_formals[)
 ]b4_parse_state_variable_macros([b4_pstate_macro_define])[
 
 /* Initialize the parser data structure.  */
-void
+static void
 yypstate_clear (yypstate *yyps)
 {
 ]b4_initialize_parser_state_variables[
diff --git a/doc/bison.texi b/doc/bison.texi
index 2e002294..cc71a69b 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -1879,6 +1879,7 @@ Here is the code for the lexical analyzer:
    and tabs, and returns 0 for end-of-input. */
 
 #include <ctype.h>
+#include <stdlib.h>
 @end group
 
 @group
@@ -1895,7 +1896,8 @@ yylex (void)
   if (c == '.' || isdigit (c))
     @{
       ungetc (c, stdin);
-      scanf ("%lf", &yylval);
+      if (scanf ("%lf", &yylval) != 1)
+        abort ();
       return NUM;
     @}
 @end group
@@ -2729,8 +2731,8 @@ yylex (void)
   if (c == '.' || isdigit (c))
     @{
       ungetc (c, stdin);
-      int n = scanf ("%lf", &yylval.NUM);
-      assert (n == 1);
+      if (scanf ("%lf", &yylval.NUM) != 1)
+        abort ();
       return NUM;
     @}
 @end group
@@ -2757,10 +2759,10 @@ Bison generated a definition of @code{YYSTYPE} with a member named
           if (bufsize <= i)
             @{
               bufsize = 2 * bufsize + 40;
-              symbuf = realloc (symbuf, bufsize);
+              symbuf = realloc (symbuf, (size_t) bufsize);
             @}
           /* Add this character to the buffer. */
-          symbuf[i++] = c;
+          symbuf[i++] = (char) c;
           /* Get another character. */
           c = getchar ();
         @}
@@ -10630,7 +10632,7 @@ when there were errors.  No file was generated (except the reports generated
 by @option{--verbose}, etc.).  In particular, the output files that possibly
 existed were not changed.
 
-@item 63 (mistmatch)
+@item 63 (mismatch)
 when @command{bison} does not meet the version requirements of the grammar
 file. @xref{Require Decl}.  No file was generated or changed.
 @end table
@@ -15274,6 +15276,7 @@ London, Department of Computer Science, TR-00-12 (December 2000).
 @c LocalWords: YYUNDEF SymbolKind yypcontext YYENOMEM TOKENMAX getBundle
 @c LocalWords: ResourceBundle myResources getString getName getToken
 @c LocalWords: getLocation getExpectedTokens reportSyntaxError bistromathic
+@c LocalWords: TokenKind
 
 @c Local Variables:
 @c ispell-dictionary: "american"
diff --git a/examples/c/bistromathic/local.mk b/examples/c/bistromathic/local.mk
index cad0425b..e9801ab2 100644
--- a/examples/c/bistromathic/local.mk
+++ b/examples/c/bistromathic/local.mk
@@ -31,6 +31,7 @@ if ENABLE_BISTROMATHIC
     -DBISON_LOCALEDIR='"$(localdir)"'		\
     -DLOCALEDIR='"$(localdir)"'			\
     -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+  %C%_bistromathic_CFLAGS = $(TEST_CFLAGS)
   %C%_bistromathic_LDADD = -lm $(LIBREADLINE) $(LIBINTL)
 endif
 
diff --git a/examples/c/bistromathic/parse.y b/examples/c/bistromathic/parse.y
index 78ec6eb7..dc048cfe 100644
--- a/examples/c/bistromathic/parse.y
+++ b/examples/c/bistromathic/parse.y
@@ -1,7 +1,6 @@
 %require "3.6"
 
 %code top {
-  #include <assert.h>
   #include <ctype.h>  // isdigit
   #include <locale.h> // LC_ALL
   #include <math.h>   // cos, sin, etc.
@@ -218,7 +217,7 @@ getsym (char const *name)
 }
 
 // How many symbols are registered.
-int
+static int
 symbol_count (void)
 {
   int res = 0;
@@ -314,7 +313,7 @@ yylex (const char **line, YYSTYPE *yylval, YYLTYPE *yylloc)
 `---------*/
 
 
-const char *
+static const char *
 error_format_string (int argc)
 {
   switch (argc)
@@ -409,7 +408,8 @@ xstrndup (const char *string, size_t n)
   const char *end = memchr (string, '\0', n);
   size_t len = end ? (size_t) (end - string) : n;
   char *new = malloc (len + 1);
-  assert (new);
+  if (!new)
+    abort ();
   new[len] = '\0';
   return memcpy (new, string, len);
 }
@@ -420,7 +420,8 @@ xstrndup (const char *string, size_t n)
 `-----------*/
 
 // Parse (and execute) this line.
-int process_line (YYLTYPE *lloc, const char *line)
+static int
+process_line (YYLTYPE *lloc, const char *line)
 {
   yypstate *ps = yypstate_new ();
   int status = 0;
@@ -435,7 +436,8 @@ int process_line (YYLTYPE *lloc, const char *line)
 }
 
 // Get the list of possible tokens after INPUT was read.
-int
+// Returns a nonnegative.
+static int
 expected_tokens (const char *input,
                  int *tokens, int ntokens)
 {
@@ -456,6 +458,8 @@ expected_tokens (const char *input,
 
   // Then query for the accepted tokens at this point.
   int res = yypstate_expected_tokens (ps, tokens, ntokens);
+  if (res < 0)
+    abort ();
   yypstate_delete (ps);
   return res;
 }
@@ -465,7 +469,7 @@ expected_tokens (const char *input,
 // TEXT is the word to complete.  We can use the entire contents of
 // rl_line_buffer in case we want to do some simple parsing.  Return
 // the array of matches, or NULL if there aren't any.
-char **
+static char **
 completion (const char *text, int start, int end)
 {
   YYDPRINTF ((stderr, "completion (\"%.*s[%.*s]%s\")\n",
@@ -475,14 +479,17 @@ completion (const char *text, int start, int end)
 
   // Get list of token numbers.
   int tokens[YYNTOKENS];
-  char *line = xstrndup (rl_line_buffer, start);
+  char *line = xstrndup (rl_line_buffer, (size_t) start);
   int ntokens = expected_tokens (line, tokens, YYNTOKENS);
   free (line);
 
   // Build MATCHES, the list of possible completions.
-  const int len = strlen (text);
+  const size_t len = strlen (text);
   // Need initial prefix and final NULL.
-  char **matches = calloc (ntokens + symbol_count () + 2, sizeof *matches);
+  char **matches
+    = calloc ((size_t) ntokens + (size_t) symbol_count () + 2, sizeof *matches);
+  if (!matches)
+    abort ();
   int match = 1;
   for (int i = 0; i < ntokens; ++i)
     switch (tokens[i])
@@ -512,9 +519,9 @@ completion (const char *text, int start, int end)
     matches[0] = strdup (text);
   else
     {
-      int lcplen = strlen (matches[1]);
+      size_t lcplen = strlen (matches[1]);
       for (int i = 2; i < match && lcplen; ++i)
-        for (int j = 0; j < lcplen; ++j)
+        for (size_t j = 0; j < lcplen; ++j)
           if (matches[1][j] != matches[i][j])
             lcplen = j;
       matches[0] = xstrndup (matches[1], lcplen);
@@ -538,7 +545,8 @@ completion (const char *text, int start, int end)
   return matches;
 }
 
-void init_readline (void)
+static void
+init_readline (void)
 {
   // Allow conditional parsing of the ~/.inputrc file.
   rl_readline_name = "bistromathic";
@@ -557,7 +565,8 @@ void init_readline (void)
 | Main.  |
 `-------*/
 
-int main (int argc, char const* argv[])
+int
+main (int argc, char const* argv[])
 {
 #if defined ENABLE_NLS && ENABLE_NLS
   // Set up internationalization.
diff --git a/examples/c/calc/calc.y b/examples/c/calc/calc.y
index ff571114..6daf22b3 100644
--- a/examples/c/calc/calc.y
+++ b/examples/c/calc/calc.y
@@ -1,7 +1,8 @@
 %code top {
   #include <assert.h>
   #include <ctype.h>  /* isdigit. */
-  #include <stdio.h>  /* For printf, etc. */
+  #include <stdio.h>  /* printf. */
+  #include <stdlib.h> /* abort. */
   #include <string.h> /* strcmp. */
 
   int yylex (void);
@@ -74,8 +75,8 @@ yylex (void)
   if (c == '.' || isdigit (c))
     {
       ungetc (c, stdin);
-      int n = scanf ("%lf", &yylval.NUM);
-      assert (n == 1);
+      if (scanf ("%lf", &yylval.NUM) != 1)
+        abort ();
       return NUM;
     }
 
diff --git a/examples/c/calc/local.mk b/examples/c/calc/local.mk
index 14b78f3b..503b034a 100644
--- a/examples/c/calc/local.mk
+++ b/examples/c/calc/local.mk
@@ -27,6 +27,7 @@ nodist_%C%_calc_SOURCES = %D%/calc.y
 
 # Don't use gnulib's system headers.
 %C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+%C%_calc_CFLAGS = $(TEST_CFLAGS)
 
 dist_calc_DATA = %D%/calc.y %D%/Makefile %D%/README.md
 CLEANFILES += %D%/calc.[ch] %D%/calc.output %D%/scan.c
diff --git a/examples/c/lexcalc/local.mk b/examples/c/lexcalc/local.mk
index 0acd2607..b73887e2 100644
--- a/examples/c/lexcalc/local.mk
+++ b/examples/c/lexcalc/local.mk
@@ -25,6 +25,8 @@ if FLEX_WORKS
   nodist_%C%_lexcalc_SOURCES = %D%/parse.y %D%/parse.h %D%/scan.l
   # Don't use gnulib's system headers.
   %C%_lexcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+  # Fighting warnings triggered by Flex is just too painful.
+  # %C%_lexcalc_CFLAGS = $(TEST_CFLAGS)
 endif FLEX_WORKS
 
 %D%/parse.c: $(dependencies)
diff --git a/examples/c/lexcalc/scan.l b/examples/c/lexcalc/scan.l
index d66a23cf..708fd28b 100644
--- a/examples/c/lexcalc/scan.l
+++ b/examples/c/lexcalc/scan.l
@@ -4,7 +4,7 @@
 %option nodefault noinput nounput noyywrap
 
 %{
-#include <errno.h> /* errno, ERANGE */
+#include <errno.h>  /* errno, ERANGE */
 #include <limits.h> /* INT_MIN */
 #include <stdlib.h> /* strtol */
 
@@ -12,7 +12,7 @@
 
   // Each time a rule is matched, advance the end cursor/position.
 #define YY_USER_ACTION                          \
-  yylloc->last_column += yyleng;
+  yylloc->last_column += (int) yyleng;
 
   // Move the first position onto the last.
 #define LOCATION_STEP()                         \
diff --git a/examples/c/mfcalc/local.mk b/examples/c/mfcalc/local.mk
index 2c0fcb5e..69c91f71 100644
--- a/examples/c/mfcalc/local.mk
+++ b/examples/c/mfcalc/local.mk
@@ -31,6 +31,7 @@ nodist_%C%_mfcalc_SOURCES = $(mfcalc_sources)
 %D%/mfcalc.c: $(dependencies)
 # Don't use gnulib's system headers.
 %C%_mfcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+%C%_mfcalc_CFLAGS = $(TEST_CFLAGS)
 %C%_mfcalc_LDADD = -lm
 
 dist_TESTS += %D%/mfcalc.test
diff --git a/examples/c/pushcalc/calc.y b/examples/c/pushcalc/calc.y
index bc27ae95..6d49470c 100644
--- a/examples/c/pushcalc/calc.y
+++ b/examples/c/pushcalc/calc.y
@@ -1,7 +1,7 @@
 %code top {
-  #include <assert.h>
   #include <ctype.h>  /* isdigit. */
-  #include <stdio.h>  /* For printf, etc. */
+  #include <stdio.h>  /* printf. */
+  #include <stdlib.h> /* abort. */
   #include <string.h> /* strcmp. */
 }
 
@@ -81,8 +81,8 @@ yylex (YYSTYPE *yylval)
   if (c == '.' || isdigit (c))
     {
       ungetc (c, stdin);
-      int n = scanf ("%lf", &yylval->NUM);
-      assert (n == 1);
+      if (scanf ("%lf", &yylval->NUM) != 1)
+        abort ();
       return NUM;
     }
 
diff --git a/examples/c/pushcalc/local.mk b/examples/c/pushcalc/local.mk
index 9b6b19d6..7f53a0c1 100644
--- a/examples/c/pushcalc/local.mk
+++ b/examples/c/pushcalc/local.mk
@@ -27,6 +27,7 @@ nodist_%C%_calc_SOURCES = %D%/calc.y
 
 # Don't use gnulib's system headers.
 %C%_calc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+%C%_calc_CFLAGS = $(TEST_CFLAGS)
 
 dist_pushcalc_DATA = %D%/calc.y %D%/Makefile %D%/README.md
 CLEANFILES += %D%/calc.[ch] %D%/calc.output
diff --git a/examples/c/reccalc/local.mk b/examples/c/reccalc/local.mk
index 0538f120..41a12828 100644
--- a/examples/c/reccalc/local.mk
+++ b/examples/c/reccalc/local.mk
@@ -26,6 +26,8 @@ if FLEX_WORKS
   BUILT_SOURCES += $(nodist_%C%_reccalc_SOURCES)
   # Don't use gnulib's system headers.
   %C%_reccalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
+  # Fighting warnings triggered by Flex is just too painful.
+  # %C%_reccalc_CFLAGS = $(TEST_CFLAGS)
 endif FLEX_WORKS
 
 %D%/parse.c: $(dependencies)
diff --git a/examples/c/reccalc/scan.l b/examples/c/reccalc/scan.l
index 0bf5210c..45d70d3b 100644
--- a/examples/c/reccalc/scan.l
+++ b/examples/c/reccalc/scan.l
@@ -32,9 +32,9 @@
         do                                              \
           capacity = capacity ? 2 * capacity : 128;     \
         while (capacity < size + yyleng + 1);           \
-        str = realloc (str, capacity);                  \
+        str = realloc (str, (size_t) capacity);         \
       }                                                 \
-    memcpy (str + size, yytext, yyleng);                \
+    memcpy (str + size, yytext, (size_t) yyleng);       \
     size += yyleng;                                     \
     assert (size < capacity);                           \
   } while (0)
diff --git a/examples/c/rpcalc/local.mk b/examples/c/rpcalc/local.mk
index f10f7c19..0c3bfd8a 100644
--- a/examples/c/rpcalc/local.mk
+++ b/examples/c/rpcalc/local.mk
@@ -31,6 +31,7 @@ nodist_%C%_rpcalc_SOURCES = $(rpcalc_sources)
 %D%/rpcalc.c: $(dependencies)
 # Don't use gnulib's system headers.
 %C%_rpcalc_CPPFLAGS = -I$(top_builddir)/%D%
+%C%_rpcalc_CFLAGS = $(TEST_CFLAGS)
 %C%_rpcalc_LDADD = -lm
 
 dist_TESTS += %D%/rpcalc.test
diff --git a/examples/local.mk b/examples/local.mk
index 854a5da4..51c2c5a2 100644
--- a/examples/local.mk
+++ b/examples/local.mk
@@ -35,6 +35,9 @@
 dist_noinst_SCRIPTS = %D%/extexi %D%/test
 TEST_LOG_COMPILER = $(SHELL) $(top_srcdir)/%D%/test
 
+TEST_CFLAGS =						\
+  $(WARN_CFLAGS) $(WARN_CFLAGS_TEST) $(WERROR_CFLAGS)
+
 AM_CXXFLAGS =							\
   $(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.