From ae7cd18c98d9bad7e95d4f4070d2d09e8db675f8 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 19 Sep 2013 16:45:09 +0200 Subject: [PATCH 01/43] style: variant: remove empty line * data/variant.hh (b4_symbol_constructor_define_): Remove stray eol. --- data/variant.hh | 1 - 1 file changed, 1 deletion(-) diff --git a/data/variant.hh b/data/variant.hh index 19538f6d..76c3e60d 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -320,7 +320,6 @@ b4_join(b4_symbol_if([$1], [has_type], return symbol_type (b4_join([token::b4_symbol([$1], [id])], b4_symbol_if([$1], [has_type], [v]), b4_locations_if([l]))); - } ])])]) From 4c4191cec2b30632a31993a6e46fb241ab9c3434 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sat, 28 Sep 2013 00:00:34 +0200 Subject: [PATCH 02/43] location: fix EOF check * location.c (location_caret): Use int, not char, for values from getc. --- src/location.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/location.c b/src/location.c index 662b2a12..c873dccd 100644 --- a/src/location.c +++ b/src/location.c @@ -188,7 +188,7 @@ location_caret (location loc, FILE *out) /* Read the actual line. Don't update the offset, so that we keep a pointer to the start of the line. */ { - char c = getc (caret_info.source); + int c = getc (caret_info.source); if (c != EOF) { /* Quote the file, indent by a single column. */ From 2b7fe38c36cdf69428039c4bafbf47be15b807fa Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 8 Oct 2013 13:01:24 +0200 Subject: [PATCH 03/43] comment changes * src/complain.h, src/complain.c: More documentation, more comments. --- src/complain.c | 13 ++++++++----- src/complain.h | 12 ++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/complain.c b/src/complain.c index fdc4b542..d2f3f4a2 100644 --- a/src/complain.c +++ b/src/complain.c @@ -38,11 +38,11 @@ bool warnings_are_errors = false; /** Diagnostics severity. */ typedef enum { - severity_disabled = 0, - severity_unset = 1, - severity_warning = 2, - severity_error = 3, - severity_fatal = 4 + severity_disabled = 0, /**< Explicitly disabled via -Wno-foo. */ + severity_unset = 1, /**< Unspecified status. */ + severity_warning = 2, /**< A warning. */ + severity_error = 3, /**< An error (continue, but die soon). */ + severity_fatal = 4 /**< Fatal error (die now). */ } severity; @@ -151,7 +151,10 @@ warnings_argmatch (char *args) } else { + // The length of the possible 'no-' prefix: 3, or 0. size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0; + // The length of the possible 'error=' (possibly after + // 'no-') prefix: 6, or 0. size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0; warning_argmatch (args, no, err); diff --git a/src/complain.h b/src/complain.h index 0d81503d..62dd8fad 100644 --- a/src/complain.h +++ b/src/complain.h @@ -128,14 +128,14 @@ void deprecated_directive (location const *loc, void duplicate_directive (char const *directive, location first, location second); -/** Warnings treated as errors shouldn't stop the execution as regular errors - should (because due to their nature, it is safe to go on). Thus, there are - three possible execution statuses. */ +/** Warnings treated as errors shouldn't stop the execution as regular + errors should (because due to their nature, it is safe to go + on). Thus, there are three possible execution statuses. */ typedef enum { - status_none, - status_warning_as_error, - status_complaint + status_none, /**< No diagnostic issued so far. */ + status_warning_as_error, /**< A warning was issued (but no error). */ + status_complaint /**< An error was issued. */ } err_status; /** Whether an error was reported. */ From e4678430c2506c577c05e92437b187fe9daf0b7f Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 16 Oct 2013 10:55:28 +0200 Subject: [PATCH 04/43] diagnostics: "-Werror -Wno-error=foo" must not emit errors Currently "-Werror -Wno-error=foo" still turns "foo" warnings into errors. Reported by Alexandre Duret-Lutz. See http://lists.gnu.org/archive/html/bug-bison/2013-09/msg00015.html. * src/complain.c (errority, errority_flag): New. (complain_init): Initialize the latter. (warning_argmatch): Extract the loop iterating on the flag's bits. Set and unset errority_flag here. (warnings_argmatch): -Wno-error is not the same as -Wno-error=everything: we must remember if category foo was explicitly turned in an error/warning via -W(no-)error=foo. (warning_severity): Use errority_flag. * tests/input.at (Symbols): Just check --yacc, not -Wyacc, that's the job of tests on -W. (-Werror is not affected by -Wnone and -Wall): Rename as... (-Werror combinations): this. Tests more combinations of -W, -W(no-)error, and -W(no-)error=foo. * tests/local.at (AT_BISON_CHECK_WARNINGS): Don't expect -Werror to turn runs that issue warnings into runs with errors, as the warnings might be enforced as warnings by -Wno-error=foo, in which case -Werror does not change anything. * doc/bison.texi (Bison Options): Try to be clearer about how -W(no-)error and -W(no-)error=foo interact. --- NEWS | 11 ++++++- doc/bison.texi | 22 ++++++++----- src/complain.c | 89 +++++++++++++++++++++++++++++++------------------- tests/input.at | 32 ++++++++++-------- tests/local.at | 5 ++- 5 files changed, 102 insertions(+), 57 deletions(-) diff --git a/NEWS b/NEWS index bbdcc0f2..7a2d4b5c 100644 --- a/NEWS +++ b/NEWS @@ -4,7 +4,16 @@ GNU Bison NEWS ** Bug fixes - Portability issues in the test suite. +*** Portability issues in the test suite. + +*** Fixes of the -Werror option + + Options such as "-Werror -Wno-error=foo" were still turning "foo" + diagnostics into errors instead of warnings. This is fixed. + + Actually, for consistency with GCC, "-Wno-error=foo -Werror" now also + leaves "foo" diagnostics as warnings. Similarly, with "-Werror=foo + -Wno-error", "foo" diagnostics are now errors. * Noteworthy changes in release 3.0 (2013-07-25) [stable] diff --git a/doc/bison.texi b/doc/bison.texi index 78d7d060..cd5e440e 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -10065,18 +10065,16 @@ A category can be turned off by prefixing its name with @samp{no-}. For instance, @option{-Wno-yacc} will hide the warnings about POSIX Yacc incompatibilities. -@item -Werror[=@var{category}] -@itemx -Wno-error[=@var{category}] -Enable warnings falling in @var{category}, and treat them as errors. If no -@var{category} is given, it defaults to making all enabled warnings into errors. +@item -Werror +Turn enabled warnings for every @var{category} into errors, unless they are +explicitly disabled by @option{-Wno-error=@var{category}}. + +@item -Werror=@var{category} +Enable warnings falling in @var{category}, and treat them as errors. @var{category} is the same as for @option{--warnings}, with the exception that it may not be prefixed with @samp{no-} (see above). -Prefixed with @samp{no}, it deactivates the error treatment for this -@var{category}. However, the warning itself won't be disabled, or enabled, by -this option. - Note that the precedence of the @samp{=} and @samp{,} operators is such that the following commands are @emph{not} equivalent, as the first will not treat S/R conflicts as errors. @@ -10086,6 +10084,14 @@ $ bison -Werror=yacc,conflicts-sr input.y $ bison -Werror=yacc,error=conflicts-sr input.y @end example +@item -Wno-error +Do not turn enabled warnings for every @var{category} into errors, unless +they are explicitly enabled by @option{-Werror=@var{category}}. + +@item -Wno-error=@var{category} +Deactivate the error treatment for this @var{category}. However, the warning +itself won't be disabled, or enabled, by this option. + @item -f [@var{feature}] @itemx --feature[=@var{feature}] Activate miscellaneous @var{feature}. @var{feature} can be one of: diff --git a/src/complain.c b/src/complain.c index d2f3f4a2..115b7043 100644 --- a/src/complain.c +++ b/src/complain.c @@ -35,6 +35,17 @@ err_status complaint_status = status_none; bool warnings_are_errors = false; +/** Whether -Werror/-Wno-error was applied to a warning. */ +typedef enum + { + errority_unset = 0, /** No explict status. */ + errority_disabled = 1, /** Explictly disabled with -Wno-error=foo. */ + errority_enabled = 2 /** Explictly enabled with -Werror=foo. */ + } errority; + +/** For each warning type, its errority. */ +static errority errority_flag[warnings_size]; + /** Diagnostics severity. */ typedef enum { @@ -103,32 +114,26 @@ warning_argmatch (char const *arg, size_t no, size_t err) no = !no; } - if (no) - { - size_t b; - for (b = 0; b < warnings_size; ++b) - if (value & 1 << b) + size_t b; + for (b = 0; b < warnings_size; ++b) + if (value & 1 << b) + { + if (err && no) + /* -Wno-error=foo. */ + errority_flag[b] = errority_disabled; + else if (err && !no) { - if (err) - { - /* -Wno-error=foo: if foo enabled as an error, - make it a warning. */ - if (warnings_flag[b] == severity_error) - warnings_flag[b] = severity_warning; - } - else - /* -Wno-foo. */ - warnings_flag[b] = severity_disabled; + /* -Werror=foo: enables -Wfoo. */ + errority_flag[b] = errority_enabled; + warnings_flag[b] = severity_warning; } - } - else - { - size_t b; - for (b = 0; b < warnings_size; ++b) - if (value & 1 << b) - /* -Wfoo and -Werror=foo. */ - warnings_flag[b] = err ? severity_error : severity_warning; - } + else if (no) + /* -Wno-foo. */ + warnings_flag[b] = severity_disabled; + else + /* -Wfoo. */ + warnings_flag[b] = severity_warning; + } } /** Decode a comma-separated list of arguments from -W. @@ -145,10 +150,7 @@ warnings_argmatch (char *args) if (STREQ (args, "error")) warnings_are_errors = true; else if (STREQ (args, "no-error")) - { - warnings_are_errors = false; - warning_argmatch ("no-error=everything", 3, 6); - } + warnings_are_errors = false; else { // The length of the possible 'no-' prefix: 3, or 0. @@ -176,27 +178,46 @@ complain_init (void) size_t b; for (b = 0; b < warnings_size; ++b) - warnings_flag[b] = (1 << b & warnings_default - ? severity_warning - : severity_unset); + { + warnings_flag[b] = (1 << b & warnings_default + ? severity_warning + : severity_unset); + errority_flag[b] = errority_unset; + } } + +/* A diagnostic with FLAGS is about to be issued. With what severity? + (severity_fatal, severity_error, severity_disabled, or + severity_warning.) */ + static severity warning_severity (warnings flags) { if (flags & fatal) + /* Diagnostics about fatal errors. */ return severity_fatal; else if (flags & complaint) + /* Diagnostics about errors. */ return severity_error; else { + /* Diagnostics about warnings. */ severity res = severity_disabled; size_t b; for (b = 0; b < warnings_size; ++b) if (flags & 1 << b) - res = res < warnings_flag[b] ? warnings_flag[b] : res; - if (res == severity_warning && warnings_are_errors) - res = severity_error; + { + res = res < warnings_flag[b] ? warnings_flag[b] : res; + /* If the diagnostic is enabled, and -Werror is enabled, + and -Wno-error=foo was not explicitly requested, this + is an error. */ + if (res == severity_warning + && (errority_flag[b] == errority_enabled + || (warnings_are_errors + && errority_flag[b] != errority_disabled))) + res = severity_error; + } return res; } } diff --git a/tests/input.at b/tests/input.at index eb73bf96..4ddf955a 100644 --- a/tests/input.at +++ b/tests/input.at @@ -956,15 +956,9 @@ without_period: "WITHOUT.PERIOD"; AT_BISON_OPTION_POPDEFS # POSIX Yacc accept periods, but not dashes. -AT_BISON_CHECK([--yacc -Wno-error input.y], [], [], -[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc] -input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc] -]]) - -# So warn about them. -AT_BISON_CHECK([-Wyacc input.y], [], [], -[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc] -input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc] +AT_BISON_CHECK([--yacc input.y], [1], [], +[[input.y:9.8-16: error: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Werror=yacc] +input.y:20.8-16: error: POSIX Yacc forbids dashes in symbol names: with-dash [-Werror=yacc] ]]) # Dashes are fine for GNU Bison. @@ -1768,11 +1762,11 @@ AT_BISON_CHECK([[-Dparse.lac.memory-trace=full input.y]], AT_CLEANUP -## --------------------------------------------- ## -## -Werror is not affected by -Wnone and -Wall. ## -## --------------------------------------------- ## +## ---------------------- ## +## -Werror combinations. ## +## ---------------------- ## -AT_SETUP([[-Werror is not affected by -Wnone and -Wall]]) +AT_SETUP([[-Werror combinations]]) AT_DATA([[input.y]], [[%% @@ -1798,6 +1792,18 @@ AT_BISON_CHECK([[-Werror,no-all,other input.y]], [[1]], [[]], [[input.y:2.15: error: stray '$' [-Werror=other] ]]) +# Check that -Wno-error keeps warnings enabled, but non fatal. +AT_BISON_CHECK([[-Werror -Wno-error=other input.y]], [[0]], [[]], +[[input.y:2.15: warning: stray '$' [-Wother] +]]) + +AT_BISON_CHECK([[-Wno-error=other -Werror input.y]], [[0]], [[]], +[[input.y:2.15: warning: stray '$' [-Wother] +]]) + +AT_BISON_CHECK([[-Werror=other -Wno-other input.y]], [[0]], [[]], +[[]]) + AT_CLEANUP diff --git a/tests/local.at b/tests/local.at index 7948faa5..ee00e009 100644 --- a/tests/local.at +++ b/tests/local.at @@ -635,9 +635,12 @@ m4_define([AT_BISON_CHECK_], # ---------------------------------------------------------- # Check that warnings (if some are expected) are correctly # turned into errors with -Werror, etc. +# +# When -Wno-error is used, the rules are really different, don't try. m4_define([AT_BISON_CHECK_WARNINGS], [m4_if(m4_bregexp([$4], [: warning: ]), [-1], [], - [m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])]) + m4_bregexp([$1], [-Wno-error=]), [-1], + [m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])]) m4_define([AT_BISON_CHECK_WARNINGS_], [[# Defining POSIXLY_CORRECT causes bison to complain if options are From 071863b3d88c232c10348b7c38378c47d363857c Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 16 Oct 2013 15:19:44 +0200 Subject: [PATCH 05/43] glr: allow spaces between "%?" and "{" in predicates Reported by Rici Lake. http://lists.gnu.org/archive/html/bug-bison/2013-10/msg00004.html http://stackoverflow.com/questions/19330171/ * src/scan-gram.l: Do not try to be too smart when diagnosing invalid directives. * tests/glr-regression.at (Predicates): New test. --- NEWS | 5 +++++ THANKS | 1 + src/scan-gram.l | 2 +- tests/glr-regression.at | 30 ++++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 7a2d4b5c..e01198de 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,11 @@ GNU Bison NEWS leaves "foo" diagnostics as warnings. Similarly, with "-Werror=foo -Wno-error", "foo" diagnostics are now errors. +*** GLR Predicates + + As demonstrated in the documentation, one can now leave spaces between + "%?" and its "{". + * Noteworthy changes in release 3.0 (2013-07-25) [stable] ** WARNING: Future backward-incompatibilities! diff --git a/THANKS b/THANKS index 2d4a6a99..0ffa8b64 100644 --- a/THANKS +++ b/THANKS @@ -110,6 +110,7 @@ R Blake blakers@mac.com Raja R Harinath harinath@cs.umn.edu Ralf Wildenhues Ralf.Wildenhues@gmx.de Richard Stallman rms@gnu.org +Rici Lake ricilake@gmail.com Rob Vermaas rob.vermaas@gmail.com Robert Anisko anisko_r@epita.fr Rob Conde rob.conde@ai-solutions.com diff --git a/src/scan-gram.l b/src/scan-gram.l index 665e80de..555e6952 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -266,7 +266,7 @@ eqopt ([[:space:]]*=)? "%pure"[-_]"parser" DEPRECATED("%pure-parser"); "%token"[-_]"table" DEPRECATED("%token-table"); - "%"{id}|"%"{notletter}([[:graph:]])+ { + "%"{id} { complain (loc, complaint, _("invalid directive: %s"), quote (yytext)); } diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 711ab7ec..064b37b2 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -1749,3 +1749,33 @@ Cleanup: popping token 'a' () ]) AT_CLEANUP + + +## ----------------------------------------------------------------- ## +## Predicates. ## +## ## +## http://lists.gnu.org/archive/html/bug-bison/2013-10/msg00004.html ## +## ----------------------------------------------------------------- ## + +AT_SETUP([Predicates]) + +# FIXME: We need genuine test cases with uses of %?. + +AT_DATA_GRAMMAR([input.y], +[[%glr-parser +%expect-rr 1 +%% +// Exercise "%?{...}" and "%? {...}". +widget: + %? {new_syntax} "widget" id new_args { $$ = f($3, $4); } +| %?{!new_syntax} "widget" id old_args { $$ = f($3, $4); } +; +id:; +new_args:; +old_args:; +%% +]]) + +AT_BISON_CHECK([[input.y]]) + +AT_CLEANUP From 39bace5da815c0290ce5e84628ca7615307b8349 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 18 Oct 2013 16:22:23 +0200 Subject: [PATCH 06/43] tests: fix incorrect object construction Reported by Ken Moffat. http://lists.gnu.org/archive/html/bug-bison/2013-10/msg00009.html * tests/c++.at (Exception safety): Here. --- NEWS | 8 +++++++- THANKS | 2 ++ tests/c++.at | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index e01198de..6a423ad9 100644 --- a/NEWS +++ b/NEWS @@ -4,7 +4,9 @@ GNU Bison NEWS ** Bug fixes -*** Portability issues in the test suite. +*** Errors in caret diagnostics + + On some platforms, some errors could result in endless diagnostics. *** Fixes of the -Werror option @@ -20,6 +22,10 @@ GNU Bison NEWS As demonstrated in the documentation, one can now leave spaces between "%?" and its "{". +*** Fixes in the test suite + + Bugs and portability issues. + * Noteworthy changes in release 3.0 (2013-07-25) [stable] ** WARNING: Future backward-incompatibilities! diff --git a/THANKS b/THANKS index 0ffa8b64..9b7a8963 100644 --- a/THANKS +++ b/THANKS @@ -66,6 +66,7 @@ Johan van Selst johans@stack.nl Jonathan Fabrizio jonathan.fabrizio@lrde.epita.fr Jonathan Nieder jrnieder@gmail.com Juan Manuel Guerrero juan.guerrero@gmx.de +Ken Moffat zarniwhoop@ntlworld.com Kees Zeelenberg kzlg@users.sourceforge.net Keith Browne kbrowne@legato.com Laurent Mascherpa laurent.mascherpa@epita.fr @@ -79,6 +80,7 @@ Martin Mokrejs mmokrejs@natur.cuni.cz Martin Nylin martin.nylin@linuxmail.org Matt Kraai kraai@alumni.cmu.edu Matt Rosing rosing@peakfive.com +Michael Felt mamfelt@gmail.com Michael Hayes m.hayes@elec.canterbury.ac.nz Michael Raskin 7c6f434c@mail.ru Michiel De Wilde mdewilde.agilent@gmail.com diff --git a/tests/c++.at b/tests/c++.at index e4c527c1..39c13f82 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -818,7 +818,8 @@ yylex (yy::parser::semantic_type *lvalp) case 'l': throw std::runtime_error ("yylex"); default: - lvalp]AT_VARIANT_IF([->build (res)], [->obj = new Object (res)])[; + lvalp->]AT_VARIANT_IF([build (Object (res))], + [obj = new Object (res)])[; // Fall through. case 0: return res; From 19fe1aa3323eb8e7a6bc66c966a2f9f25741ff42 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 21 Oct 2013 15:12:13 -0700 Subject: [PATCH 07/43] maint: git now ignores .log and .trs files * .gitignore: Add *.log, *.trs. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index e9708d3f..b8571968 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,10 @@ *.eps +*.log *.o *.pdf *.png *.stamp +*.trs *~ .deps .dirstamp From a9733794bb48f9d0779df47229210e5cb30d02a4 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 21 Oct 2013 15:13:52 -0700 Subject: [PATCH 08/43] maint: mention help2man, texinfo, apt-get * README-hacking: Add help2man, texinfo. Describe how to add packages if you're using Debian. --- README-hacking | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README-hacking b/README-hacking index 28870cb2..ab82a3a2 100644 --- a/README-hacking +++ b/README-hacking @@ -62,13 +62,22 @@ tools we depend upon, including: - Gettext - Graphviz - Gzip +- Help2man - Perl - Rsync - Tar +- Texinfo Valgrind is also highly recommended, if it supports your architecture. +If you're using a GNU/Linux distribution, the easiest way to install the +above packages depends on your system. The following shell command should +work for Debian-based systems such as Ubuntu: + + sudo apt-get install \ + autoconf automake autopoint flex graphviz help2man texinfo valgrind + Bison is written using Bison grammars, so there are bootstrapping issues. The bootstrap script attempts to discover when the C code generated from the grammars is out of date, and to bootstrap with an out-of-date version of the From 3a684d611ec61f6959ffdd84918717e77486263b Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 21 Oct 2013 15:16:43 -0700 Subject: [PATCH 09/43] build: examples/calc++/calc++ requires flex * configure.ac (FLEX_CXX_WORKS): New AM_CONDITIONAL. * examples/calc++/local.mk (examples/calc++/calc++): Build if FLEX_CXX_WORKS, not BISON_CXX_WORKS. --- configure.ac | 2 ++ examples/calc++/local.mk | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 992e2033..2843b671 100644 --- a/configure.ac +++ b/configure.ac @@ -179,6 +179,8 @@ $LEX_IS_FLEX || test "X$LEX" = X: || { AC_MSG_WARN([bypassing lex because flex is required]) LEX=: } +AM_CONDITIONAL([FLEX_CXX_WORKS], + [$LEX_IS_FLEX && test $bison_cv_cxx_works = yes]) AC_PROG_YACC AC_PROG_RANLIB AC_PROG_GNU_M4 diff --git a/examples/calc++/local.mk b/examples/calc++/local.mk index d1d43a04..493b8c78 100644 --- a/examples/calc++/local.mk +++ b/examples/calc++/local.mk @@ -63,7 +63,7 @@ calc_sources = \ $(calc_sources_extracted) \ $(calc_sources_generated) -if BISON_CXX_WORKS +if FLEX_CXX_WORKS check_PROGRAMS += examples/calc++/calc++ nodist_examples_calc___calc___SOURCES = \ $(calc_sources) From 0bfe22b6d523a359fb2ac8892c6acf85342b54f6 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 21 Oct 2013 15:17:16 -0700 Subject: [PATCH 10/43] maint: git now ignores rpcalc * examples/rpcalc/.gitignore: Ignore rpcalc. --- examples/rpcalc/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/rpcalc/.gitignore b/examples/rpcalc/.gitignore index fbd90523..7e8a2f01 100644 --- a/examples/rpcalc/.gitignore +++ b/examples/rpcalc/.gitignore @@ -1,4 +1,5 @@ /calc.h +/rpcalc /rpcalc.c /rpcalc.h /rpcalc.output From 67411a88a0668401f9583526668e3930762c55f0 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 21 Oct 2013 15:21:32 -0700 Subject: [PATCH 11/43] bison: pacify Sun C 5.12 * src/scan-code.l (show_sub_message): Redo initializations to work around a bogus Sun C 5.12 warning. (parse_ref): Remove unreachable code that Sun C 5.12 complains about. * src/uniqstr.h (uniqstr_vsprintf): Use _GL_ATTRIBUTE_FORMAT_PRINTF (...) instead of __attribute__ ((__format__ (__printf__, ...))). Otherwise, Sun C 5.12 complains about an unknown attribute. --- src/scan-code.l | 18 +++++++++++++----- src/uniqstr.h | 4 +++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/scan-code.l b/src/scan-code.l index cced97bf..f9968d1c 100644 --- a/src/scan-code.l +++ b/src/scan-code.l @@ -342,8 +342,19 @@ show_sub_message (warnings warning, { static struct obstack msg_buf; const char *tail = explicit_bracketing ? "" : cp + strlen (var->id); - const char *id = var->hidden_by ? var->hidden_by->id : var->id; - location id_loc = var->hidden_by ? var->hidden_by->loc : var->loc; + const char *id; + location id_loc; + + if (var->hidden_by) + { + id = var->hidden_by->id; + id_loc = var->hidden_by->loc; + } + else + { + id = var->id; + id_loc = var->loc; + } /* Create the explanation message. */ obstack_init (&msg_buf); @@ -573,9 +584,6 @@ parse_ref (char *cp, symbol_list *rule, int rule_length, return INVALID_REF; } } - - /* Not reachable. */ - return INVALID_REF; } /* Keeps track of the maximum number of semantic values to the left of diff --git a/src/uniqstr.h b/src/uniqstr.h index 006c10f4..7ad52da8 100644 --- a/src/uniqstr.h +++ b/src/uniqstr.h @@ -20,6 +20,8 @@ #ifndef UNIQSTR_H_ # define UNIQSTR_H_ +# include + /*-----------------------------------------. | Pointers to unique copies of C strings. | `-----------------------------------------*/ @@ -33,7 +35,7 @@ uniqstr uniqstr_new (char const *str); strings, use UNIQSTR_CONCAT, which is a convenient wrapper around this function. */ uniqstr uniqstr_vsprintf (char const *format, ...) - __attribute__ ((__format__ (__printf__, 1, 2))); + _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2); /* Two uniqstr values have the same value iff they are the same. */ # define UNIQSTR_EQ(Ustr1, Ustr2) (!!((Ustr1) == (Ustr2))) From 1a9646fc9140f896500a812672742b82634c2249 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 22 Oct 2013 16:29:22 +0200 Subject: [PATCH 12/43] fix: uniqstr are already pointers * src/uniqstr.c (uniqstr_assert): Remove incorrect double indirection, and now useless cast. --- src/uniqstr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uniqstr.c b/src/uniqstr.c index 37345dc7..b460ea7c 100644 --- a/src/uniqstr.c +++ b/src/uniqstr.c @@ -77,8 +77,8 @@ uniqstr_vsprintf (char const *format, ...) void uniqstr_assert (char const *str) { - uniqstr *s = hash_lookup (uniqstrs_table, str); - if (!s || s != (uniqstr *)str) + uniqstr s = hash_lookup (uniqstrs_table, str); + if (!s || s != str) { error (0, 0, "not a uniqstr: %s", quotearg (str)); From a81071233128e8c31507b9aa6c5f70906ab523f5 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 22 Oct 2013 16:30:12 +0200 Subject: [PATCH 13/43] c++: fix generated doxygen comments * configure.ac: Enable -Wdocumentation if supported. * data/lalr1.cc: Fix comments. --- configure.ac | 2 +- data/lalr1.cc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 2843b671..74d8fced 100644 --- a/configure.ac +++ b/configure.ac @@ -82,7 +82,7 @@ AC_ARG_ENABLE([gcc-warnings], esac], [enable_gcc_warnings=no]) if test "$enable_gcc_warnings" = yes; then - warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align + warn_common='-Wall-Wextra -Wno-sign-compare -Wcast-align -Wdocumentation -Wformat -Wpointer-arith -Wwrite-strings' warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes' warn_cxx='-Wnoexcept' diff --git a/data/lalr1.cc b/data/lalr1.cc index 3294f591..a3784637 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -267,7 +267,7 @@ b4_location_define])])[ /// \brief Reclaim the memory associated to a symbol. /// \param yymsg Why this token is reclaimed. /// If null, print nothing. - /// \param s The symbol. + /// \param yysym The symbol. template void yy_destroy_ (const char* yymsg, basic_symbol& yysym) const; @@ -341,13 +341,13 @@ b4_location_define])])[ enum { yyeof_ = 0, - yylast_ = ]b4_last[, //< Last index in yytable_. - yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols. + yylast_ = ]b4_last[, ///< Last index in yytable_. + yynnts_ = ]b4_nterms_number[, ///< Number of nonterminal symbols. yyempty_ = -2, - yyfinal_ = ]b4_final_state_number[, //< Termination state number. + yyfinal_ = ]b4_final_state_number[, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = ]b4_tokens_number[ //< Number of tokens. + yyntokens_ = ]b4_tokens_number[ ///< Number of tokens. }; ]b4_parse_param_vars[ From ee9cdb85958b4cdcf138029e54c7c0499d34d8b2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 22 Oct 2013 16:43:17 +0200 Subject: [PATCH 14/43] style: avoid tabs * src/scan-code.l: here. --- src/scan-code.l | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/scan-code.l b/src/scan-code.l index f9968d1c..0c11b403 100644 --- a/src/scan-code.l +++ b/src/scan-code.l @@ -346,15 +346,15 @@ show_sub_message (warnings warning, location id_loc; if (var->hidden_by) - { - id = var->hidden_by->id; - id_loc = var->hidden_by->loc; - } + { + id = var->hidden_by->id; + id_loc = var->hidden_by->loc; + } else - { - id = var->id; - id_loc = var->loc; - } + { + id = var->id; + id_loc = var->loc; + } /* Create the explanation message. */ obstack_init (&msg_buf); From 265640d56ed2eece90efd92f21fc9e614e575724 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 22 Oct 2013 17:32:49 +0200 Subject: [PATCH 15/43] install: do not install yacc.1 when --disable-yacc * configure.ac (ENABLE_YACC): New conditional. (YACC_SCRIPT, YACC_LIBRARY): Remove. * lib/local.mk, src/local.mk: Use the former instead of the latter. * doc/local.mk: Use ENABLE_YACC to avoid installing yacc.1. --- NEWS | 5 +++++ configure.ac | 11 +---------- doc/local.mk | 2 ++ lib/local.mk | 4 +++- src/local.mk | 4 +++- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/NEWS b/NEWS index 6a423ad9..5df8b81a 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,11 @@ GNU Bison NEWS As demonstrated in the documentation, one can now leave spaces between "%?" and its "{". +*** Installation + + The yacc.1 man page is no longer installed if --disable-yacc was + specified. + *** Fixes in the test suite Bugs and portability issues. diff --git a/configure.ac b/configure.ac index 74d8fced..688803af 100644 --- a/configure.ac +++ b/configure.ac @@ -161,16 +161,7 @@ AC_ARG_ENABLE([yacc], [AC_HELP_STRING([--disable-yacc], [do not build a yacc command or an -ly library])], , [enable_yacc=yes]) -case $enable_yacc in -yes) - YACC_SCRIPT=src/yacc - YACC_LIBRARY=lib/liby.a;; -*) - YACC_SCRIPT= - YACC_LIBRARY=;; -esac -AC_SUBST([YACC_SCRIPT]) -AC_SUBST([YACC_LIBRARY]) +AM_CONDITIONAL([ENABLE_YACC], [test "$enable_yacc" = yes]) # Checks for programs. AM_MISSING_PROG([DOT], [dot]) diff --git a/doc/local.mk b/doc/local.mk index 1f7b3b22..4fe0859c 100644 --- a/doc/local.mk +++ b/doc/local.mk @@ -118,7 +118,9 @@ $(top_srcdir)/doc/bison.1: doc/bison.help doc/bison.x $(top_srcdir)/configure fi $(AM_V_at)rm -f $@*.t +if ENABLE_YACC nodist_man_MANS = doc/yacc.1 +endif ## ----------------------------- ## ## Graphviz examples generation. ## diff --git a/lib/local.mk b/lib/local.mk index d5d2d0b8..1069b50c 100644 --- a/lib/local.mk +++ b/lib/local.mk @@ -51,6 +51,8 @@ lib_libbison_a_SOURCES += \ lib/get-errno.c # The Yacc compatibility library. -lib_LIBRARIES = $(YACC_LIBRARY) +if ENABLE_YACC +lib_LIBRARIES = lib/liby.a EXTRA_LIBRARIES = lib/liby.a lib_liby_a_SOURCES = lib/main.c lib/yyerror.c +endif diff --git a/src/local.mk b/src/local.mk index 9e0848c2..bbed7b76 100644 --- a/src/local.mk +++ b/src/local.mk @@ -111,7 +111,9 @@ BUILT_SOURCES += \ ## yacc. ## ## ------ ## -bin_SCRIPTS = $(YACC_SCRIPT) +if ENABLE_YACC +bin_SCRIPTS = src/yacc +endif EXTRA_SCRIPTS = src/yacc MOSTLYCLEANFILES += src/yacc From 026816664ff8283a55f91915843a8ff0ac5cf86c Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 23 Oct 2013 15:04:15 +0200 Subject: [PATCH 16/43] tests: skip C++ tests that are too demanding for some compilers Some tests now fail when compiled with G++ 4.3 or 4.4 on MacPorts. * tests/local.at (AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR): New. * tests/c++.at (Exception safety): Use it. --- tests/c++.at | 2 ++ tests/local.at | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/tests/c++.at b/tests/c++.at index 39c13f82..ac68dc0c 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -655,6 +655,8 @@ AT_CLEANUP m4_pushdef([AT_TEST], [AT_SETUP([[Exception safety $1]]) +AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR + AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" $1]) AT_DATA_GRAMMAR([[input.yy]], diff --git a/tests/local.at b/tests/local.at index ee00e009..72c0d529 100644 --- a/tests/local.at +++ b/tests/local.at @@ -875,6 +875,49 @@ AT_PARSER_CHECK([./c-and-cxx]) ]) +# AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR +# ------------------------------------ +# Check that we can expect exceptions to be handled properly. +# GCC 4.3 and 4.4 fail https://trac.macports.org/ticket/40853. +m4_define([AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR], +[AT_DATA_SOURCE([exception.cc], +[[#include +#include + +void foo() +{ + try + { + throw std::runtime_error("foo"); + } + catch (...) + { + std::cerr << "Inner caught" << std::endl; + throw; + } +} + +int main() +{ + try + { + foo(); + } + catch (...) + { + std::cerr << "Outer caught" << std::endl; + return 0; + } + return 1; +} +]]) +AT_COMPILE_CXX([exception]) +# The "empty" quadrigraph is to protect from cfg.mk's +# sc_at_parser_check. +AT_CHECK([@&t@./exception || exit 77], [0], [], [ignore]) +]) + + ## ---------------------------- ## ## Running a generated parser. ## ## ---------------------------- ## From 516652b474651d6cbd6f4e0c746b940346d65995 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 23 Oct 2013 15:03:45 +0200 Subject: [PATCH 17/43] style: use /* ... */ comments * src/complain.c: Here. --- src/complain.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/complain.c b/src/complain.c index 115b7043..e767490c 100644 --- a/src/complain.c +++ b/src/complain.c @@ -153,10 +153,10 @@ warnings_argmatch (char *args) warnings_are_errors = false; else { - // The length of the possible 'no-' prefix: 3, or 0. + /* The length of the possible 'no-' prefix: 3, or 0. */ size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0; - // The length of the possible 'error=' (possibly after - // 'no-') prefix: 6, or 0. + /* The length of the possible 'error=' (possibly after + 'no-') prefix: 6, or 0. */ size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0; warning_argmatch (args, no, err); From 5407fc7d76bc0c1d15b0e281ba12ea20c77751e7 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 23 Oct 2013 10:25:47 +0200 Subject: [PATCH 18/43] gnulib: update --- bootstrap | 54 ++++++++++++++++++++++++++++-------------------------- gnulib | 2 +- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/bootstrap b/bootstrap index a37fb8a0..e31d17df 100755 --- a/bootstrap +++ b/bootstrap @@ -1,6 +1,6 @@ #! /bin/sh # Print a version string. -scriptversion=2013-07-03.20; # UTC +scriptversion=2013-08-15.22; # UTC # Bootstrap this package from checked-out sources. @@ -209,12 +209,16 @@ bootstrap_sync=false # Use git to update gnulib sources use_git=true +check_exists() { + ($1 --version /dev/null 2>&1 + test $? -lt 126 +} + # find_tool ENVVAR NAMES... # ------------------------- # Search for a required program. Use the value of ENVVAR, if set, -# otherwise find the first of the NAMES that can be run (i.e., -# supports --version). If found, set ENVVAR to the program name, -# die otherwise. +# otherwise find the first of the NAMES that can be run. +# If found, set ENVVAR to the program name, die otherwise. # # FIXME: code duplication, see also gnu-web-doc-update. find_tool () @@ -224,27 +228,21 @@ find_tool () find_tool_names=$@ eval "find_tool_res=\$$find_tool_envvar" if test x"$find_tool_res" = x; then - for i - do - if ($i --version /dev/null 2>&1; then - find_tool_res=$i - break + for i; do + if check_exists $i; then + find_tool_res=$i + break fi done - else - find_tool_error_prefix="\$$find_tool_envvar: " fi - test x"$find_tool_res" != x \ - || die "one of these is required: $find_tool_names" - ($find_tool_res --version /dev/null 2>&1 \ - || die "${find_tool_error_prefix}cannot run $find_tool_res --version" + if test x"$find_tool_res" = x; then + warn_ "one of these is required: $find_tool_names;" + die "alternatively set $find_tool_envvar to a compatible tool" + fi eval "$find_tool_envvar=\$find_tool_res" eval "export $find_tool_envvar" } -# Find sha1sum, named gsha1sum on MacPorts, and shasum on Mac OS X 10.6. -find_tool SHA1SUM sha1sum gsha1sum shasum - # Override the default configuration, if necessary. # Make sure that bootstrap.conf is sourced from the current directory # if we were invoked as "sh bootstrap". @@ -326,7 +324,7 @@ insert_if_absent() { die "Error: Duplicate entries in $file: " $duplicate_entries fi linesold=$(gitignore_entries $file | wc -l) - linesnew=$(echo "$str" | gitignore_entries - $file | sort -u | wc -l) + linesnew=$( { echo "$str"; cat $file; } | gitignore_entries | sort -u | wc -l) if [ $linesold != $linesnew ] ; then { echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \ || die "insert_if_absent $file $str: failed" @@ -469,8 +467,7 @@ check_versions() { if [ "$req_ver" = "-" ]; then # Merely require app to exist; not all prereq apps are well-behaved # so we have to rely on $? rather than get_version. - $app --version >/dev/null 2>&1 - if [ 126 -le $? ]; then + if ! check_exists $app; then warn_ "Error: '$app' not found" ret=1 fi @@ -503,6 +500,12 @@ print_versions() { # can't depend on column -t } +# Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6. +# Also find the compatible sha1 utility on the BSDs +if test x"$SKIP_PO" = x; then + find_tool SHA1SUM sha1sum gsha1sum shasum sha1 +fi + use_libtool=0 # We'd like to use grep -E, to see if any of LT_INIT, # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac, @@ -551,10 +554,10 @@ fi echo "$0: Bootstrapping from checked-out $package sources..." # See if we can use gnulib's git-merge-changelog merge driver. -if $use_git && test -d .git && (git --version) >/dev/null 2>/dev/null ; then +if $use_git && test -d .git && check_exists git; then if git config merge.merge-changelog.driver >/dev/null ; then : - elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then + elif check_exists git-merge-changelog; then echo "$0: initializing git-merge-changelog driver" git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' @@ -692,11 +695,10 @@ update_po_files() { cksum_file="$ref_po_dir/$po.s1" if ! test -f "$cksum_file" || ! test -f "$po_dir/$po.po" || - ! $SHA1SUM -c --status "$cksum_file" \ - < "$new_po" > /dev/null; then + ! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then echo "$me: updated $po_dir/$po.po..." cp "$new_po" "$po_dir/$po.po" \ - && $SHA1SUM < "$new_po" > "$cksum_file" + && $SHA1SUM < "$new_po" > "$cksum_file" || return fi done } diff --git a/gnulib b/gnulib index 03e96cc3..d208f3ab 160000 --- a/gnulib +++ b/gnulib @@ -1 +1 @@ -Subproject commit 03e96cc338b5237e15fce73e9423526969ee768a +Subproject commit d208f3ab64d5d5b70356ca61cc2d8d0373407a3c From 3cc83855d988a89d708c182aff917cac21d9c6f2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 23 Oct 2013 10:57:09 +0200 Subject: [PATCH 19/43] skeletons: update the handling of compiler attributes * data/c.m4 (b4_attribute_define): Instead of defining __attribute__, define YY_ATTRIBUTE conditionally. (YY_ATTRIBUTE_PURE, YY_ATTRIBUTE_UNUSED, _Noreturn): New. Use them. * data/glr.c: Use them. --- data/c.m4 | 33 ++++++++++++++++++++++++++------- data/glr.c | 19 +++++++------------ 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/data/c.m4 b/data/c.m4 index b1b43948..9b739bc4 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -205,13 +205,32 @@ m4_define([b4_table_value_equals], # b4_attribute_define # ------------------- -# Provide portability for __attribute__. +# Provide portable compiler "attributes". m4_define([b4_attribute_define], -[#ifndef __attribute__ -/* This feature is available in gcc versions 2.5 and later. */ -# if (! defined __GNUC__ || __GNUC__ < 2 \ - || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) -# define __attribute__(Spec) /* empty */ +[#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ +# endif +#endif + +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) +#endif + +#if !defined _Noreturn \ + && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) +# if defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) # endif #endif @@ -783,7 +802,7 @@ m4_define([b4_yy_location_print_define], /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ -__attribute__((__unused__)) +YY_ATTRIBUTE_UNUSED ]b4_function_define([yy_location_print_], [static unsigned], [[FILE *yyo], [yyo]], diff --git a/data/glr.c b/data/glr.c index 8ef35534..725453be 100644 --- a/data/glr.c +++ b/data/glr.c @@ -445,9 +445,9 @@ int yydebug; struct yyGLRStack; static void yypstack (struct yyGLRStack* yystackp, size_t yyk) - __attribute__ ((__unused__)); + YY_ATTRIBUTE_UNUSED; static void yypdumpstack (struct yyGLRStack* yystackp) - __attribute__ ((__unused__)); + YY_ATTRIBUTE_UNUSED; #else /* !]b4_api_PREFIX[DEBUG */ @@ -669,9 +669,7 @@ struct yyGLRStack { static void yyexpandGLRStack (yyGLRStack* yystackp); #endif -static void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) - __attribute__ ((__noreturn__)); -static void +static _Noreturn void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) { if (yymsg != YY_NULL) @@ -679,9 +677,7 @@ yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) YYLONGJMP (yystackp->yyexception_buffer, 1); } -static void yyMemoryExhausted (yyGLRStack* yystackp) - __attribute__ ((__noreturn__)); -static void +static _Noreturn void yyMemoryExhausted (yyGLRStack* yystackp) { YYLONGJMP (yystackp->yyexception_buffer, 2); @@ -702,7 +698,7 @@ yytokenName (yySymbol yytoken) /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred * containing the pointer to the next state in the chain. */ -static void yyfillin (yyGLRStackItem *, int, int) __attribute__ ((__unused__)); +static void yyfillin (yyGLRStackItem *, int, int) YY_ATTRIBUTE_UNUSED; static void yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) { @@ -729,7 +725,7 @@ yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) * YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1. * For convenience, always return YYLOW1. */ static inline int yyfill (yyGLRStackItem *, int *, int, yybool) - __attribute__ ((__unused__)); + YY_ATTRIBUTE_UNUSED; static inline int yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) { @@ -751,8 +747,7 @@ yyuserAction (yyRuleNum yyn, size_t yyrhslen, yyGLRStackItem* yyvsp, yyGLRStack* yystackp, YYSTYPE* yyvalp]b4_locuser_formals[) { - yybool yynormal __attribute__ ((__unused__)) = - (yystackp->yysplitPoint == YY_NULL); + yybool yynormal YY_ATTRIBUTE_UNUSED = (yystackp->yysplitPoint == YY_NULL); int yylow; ]b4_parse_param_use([yyvalp], [yylocp])dnl [ YYUSE (yyrhslen); From ad9d4f9f2e5b74c1306b8d2f6227f37a59832069 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 23 Oct 2013 10:57:51 +0200 Subject: [PATCH 20/43] c++: use __attribute__((__pure__)) to avoid warnings Building C++ parsers with -Wsuggest-attribute=const and -Wsuggest-attribute=noreturn triggers warning in generated code. * data/lalr1.cc: Call b4_attribute_define. (debug_stream, debug_level): Flag as pure. * tests/headers.at (Several parsers): There are now more YY macros that "leak". --- data/lalr1.cc | 5 +++-- tests/headers.at | 6 +++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/data/lalr1.cc b/data/lalr1.cc index a3784637..cb61ebb7 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -157,6 +157,7 @@ m4_define([b4_shared_declarations], ]b4_bison_locations_if([[# include "location.hh"]])])[ ]b4_variant_if([b4_variant_includes])[ +]b4_attribute_define[ ]b4_YYDEBUG_define[ ]b4_namespace_open[ @@ -183,14 +184,14 @@ b4_location_define])])[ #if ]b4_api_PREFIX[DEBUG /// The current debugging stream. - std::ostream& debug_stream () const; + std::ostream& debug_stream () const YY_ATTRIBUTE_PURE; /// Set the current debugging stream. void set_debug_stream (std::ostream &); /// Type for debugging levels. typedef int debug_level_type; /// The current debugging level. - debug_level_type debug_level () const; + debug_level_type debug_level () const YY_ATTRIBUTE_PURE; /// Set the current debugging level. void set_debug_level (debug_level_type l); #endif diff --git a/tests/headers.at b/tests/headers.at index 0ad7ef3e..9b71c030 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -223,7 +223,11 @@ AT_CHECK([[$PERL -n -0777 -e ' s{/\*.*?\*/}{}gs; s{//.*}{}g; s{\b(YYChar - |YYPUSH_MORE(_DEFINED)? + |YYPUSH_MORE(?:_DEFINED)? + |YYUSE + |YY_ATTRIBUTE(?:_PURE|_UNUSED)? + |YY_IGNORE_MAYBE_UNINITIALIZED_(?:BEGIN|END) + |YY_INITIAL_VALUE |YY_\w+_INCLUDED |YY_NULL |(defined|if)\ YYDEBUG From 60dcc936ceceff90ba1161208067105d3f743bb5 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 5 Nov 2013 14:15:15 +0100 Subject: [PATCH 21/43] build: restore maintainer-push-check * tests/local.mk: here. --- tests/local.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/local.mk b/tests/local.mk index 5f7fa452..fbf08ba2 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -126,3 +126,6 @@ maintainer-push-check: maintainer-xml-check: $(MAKE) $(AM_MAKEFLAGS) maintainer-check \ TESTSUITEFLAGS='BISON_TEST_XML=1 $(TESTSUITEFLAGS)' + +.PHONY: maintainer-release-check +maintainer-release-check: maintainer-check maintainer-push-check maintainer-xml-check From afc4457605a784879fa57435bf45521ad7513771 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 5 Nov 2013 14:32:20 +0100 Subject: [PATCH 22/43] build: use Automake 1.14's non-recursive Makefile features * configure.ac: Require Automake 1.14. * examples/calc++/local.mk, examples/local.mk, examples/mfcalc/local.mk, * examples/rpcalc/local.mk, tests/local.mk: Use %D% and %C%. --- configure.ac | 8 ++----- examples/calc++/local.mk | 48 ++++++++++++++++++++-------------------- examples/local.mk | 22 +++++++++--------- examples/mfcalc/local.mk | 20 +++++++---------- examples/rpcalc/local.mk | 19 +++++++--------- tests/local.mk | 2 +- 6 files changed, 54 insertions(+), 65 deletions(-) diff --git a/configure.ac b/configure.ac index 688803af..f3dcdfd8 100644 --- a/configure.ac +++ b/configure.ac @@ -33,11 +33,7 @@ AC_DEFINE_UNQUOTED([PACKAGE_COPYRIGHT_YEAR], [$PACKAGE_COPYRIGHT_YEAR], AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) -# Automake 1.10.3 and 1.11.1 fix a security flaw discussed here: -# -# http://thread.gmane.org/gmane.comp.sysutils.autotools.announce/131 -# -# To avoid 1.11, we make 1.11.1 the minimum version. +# We use Automake 1.14's %D% and %C%. # # We want gnits strictness only when rolling a stable release. For # release candidates, we use version strings like 2.4.3_rc1, but gnits @@ -45,7 +41,7 @@ AC_CONFIG_MACRO_DIR([m4]) # releases, we want to be able run make dist without being required to # add a bogus NEWS entry. In that case, the version string # automatically contains a dash, which we also let disable gnits. -AM_INIT_AUTOMAKE([1.11.1 dist-xz nostdinc +AM_INIT_AUTOMAKE([1.14 dist-xz nostdinc color-tests parallel-tests silent-rules] m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]], diff --git a/examples/calc++/local.mk b/examples/calc++/local.mk index 493b8c78..d920e634 100644 --- a/examples/calc++/local.mk +++ b/examples/calc++/local.mk @@ -19,7 +19,7 @@ # Don't depend on $(BISON) otherwise we would rebuild these files # in srcdir, including during distcheck, which is forbidden. -examples/calc++/calc++-parser.stamp: $(BISON_IN) +%D%/calc++-parser.stamp: $(BISON_IN) SUFFIXES += .yy .stamp .yy.stamp: $(AM_V_YACC)rm -f $@ @@ -27,14 +27,14 @@ SUFFIXES += .yy .stamp $(AM_V_at)$(YACCCOMPILE) -o $*.cc $< $(AM_V_at)mv -f $@.tmp $@ -$(calc_sources_generated): examples/calc++/calc++-parser.stamp - @test -f $@ || rm -f examples/calc++/calc++-parser.stamp - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/calc++/calc++-parser.stamp +$(calc_sources_generated): %D%/calc++-parser.stamp + @test -f $@ || rm -f %D%/calc++-parser.stamp + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/calc++-parser.stamp CLEANFILES += \ $(calc_sources_generated) \ - examples/calc++/calc++-parser.output \ - examples/calc++/calc++-parser.stamp \ - examples/calc++/calc++-scanner.cc + %D%/calc++-parser.output \ + %D%/calc++-parser.stamp \ + %D%/calc++-scanner.cc ## -------------------- ## @@ -42,35 +42,35 @@ CLEANFILES += \ ## -------------------- ## # Avoid using BUILT_SOURCES which is too global. -$(examples_calc___calc___OBJECTS): $(calc_sources_generated) +$(%C%_calc___OBJECTS): $(calc_sources_generated) calc_sources_extracted = \ - examples/calc++/calc++-driver.cc \ - examples/calc++/calc++-driver.hh \ - examples/calc++/calc++-scanner.ll \ - examples/calc++/calc++.cc + %D%/calc++-driver.cc \ + %D%/calc++-driver.hh \ + %D%/calc++-scanner.ll \ + %D%/calc++.cc calc_extracted = \ $(calc_sources_extracted) \ - examples/calc++/calc++-parser.yy + %D%/calc++-parser.yy extracted += $(calc_extracted) calc_sources_generated = \ - examples/calc++/calc++-parser.cc \ - examples/calc++/calc++-parser.hh \ - examples/calc++/location.hh \ - examples/calc++/position.hh \ - examples/calc++/stack.hh + %D%/calc++-parser.cc \ + %D%/calc++-parser.hh \ + %D%/location.hh \ + %D%/position.hh \ + %D%/stack.hh calc_sources = \ $(calc_sources_extracted) \ $(calc_sources_generated) if FLEX_CXX_WORKS -check_PROGRAMS += examples/calc++/calc++ -nodist_examples_calc___calc___SOURCES = \ +check_PROGRAMS += %D%/calc++ +nodist_%C%_calc___SOURCES = \ $(calc_sources) -examples_calc___calc___CPPFLAGS = -I$(top_builddir)/examples/calc++ -examples_calc___calc___CXXFLAGS = $(AM_CXXFLAGS) $(FLEX_SCANNER_CXXFLAGS) -dist_TESTS += examples/calc++/calc++.test +%C%_calc___CPPFLAGS = -I$(top_builddir)/%D% +%C%_calc___CXXFLAGS = $(AM_CXXFLAGS) $(FLEX_SCANNER_CXXFLAGS) +dist_TESTS += %D%/calc++.test else -EXTRA_DIST += examples/calc++/calc++.test +EXTRA_DIST += %D%/calc++.test endif diff --git a/examples/local.mk b/examples/local.mk index c79c8004..9f7863c1 100644 --- a/examples/local.mk +++ b/examples/local.mk @@ -13,8 +13,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -dist_noinst_SCRIPTS = examples/extexi examples/test -TEST_LOG_COMPILER = $(top_srcdir)/examples/test +dist_noinst_SCRIPTS = %D%/extexi %D%/test +TEST_LOG_COMPILER = $(top_srcdir)/%D%/test AM_CXXFLAGS = \ $(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS) @@ -24,20 +24,20 @@ AM_CXXFLAGS = \ ## ------------ ## doc = $(top_srcdir)/doc/bison.texi -extexi = $(top_srcdir)/examples/extexi +extexi = $(top_srcdir)/%D%/extexi extract = VERSION="$(VERSION)" $(PERL) $(extexi) $(doc) -- extracted = -CLEANFILES += $(extracted) examples/extracted.stamp -examples/extracted.stamp: $(doc) $(extexi) +CLEANFILES += $(extracted) %D%/extracted.stamp +%D%/extracted.stamp: $(doc) $(extexi) $(AM_V_GEN)rm -f $@ $@.tmp $(AM_V_at)touch $@.tmp $(AM_V_at)$(extract) $(extracted) $(AM_V_at)mv $@.tmp $@ -$(extracted): examples/extracted.stamp - @test -f $@ || rm -f examples/extracted.stamp - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/extracted.stamp +$(extracted): %D%/extracted.stamp + @test -f $@ || rm -f %D%/extracted.stamp + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/extracted.stamp -include examples/calc++/local.mk -include examples/mfcalc/local.mk -include examples/rpcalc/local.mk +include %D%/calc++/local.mk +include %D%/mfcalc/local.mk +include %D%/rpcalc/local.mk diff --git a/examples/mfcalc/local.mk b/examples/mfcalc/local.mk index 10d66966..97ea63b3 100644 --- a/examples/mfcalc/local.mk +++ b/examples/mfcalc/local.mk @@ -18,19 +18,15 @@ ## -------------------- ## BUILT_SOURCES += $(mfcalc_sources) -CLEANFILES += examples/mfcalc/mfcalc.[ch] examples/mfcalc/mfcalc.output +CLEANFILES += %D%/mfcalc.[ch] %D%/mfcalc.output -mfcalc_extracted = \ - examples/mfcalc/calc.h \ - examples/mfcalc/mfcalc.y -mfcalc_sources = \ - $(mfcalc_extracted) +mfcalc_extracted = %D%/calc.h %D%/mfcalc.y +mfcalc_sources = $(mfcalc_extracted) extracted += $(mfcalc_extracted) -check_PROGRAMS += examples/mfcalc/mfcalc -examples_mfcalc_mfcalc_LDADD = -lm -nodist_examples_mfcalc_mfcalc_SOURCES = \ - $(mfcalc_sources) +check_PROGRAMS += %D%/mfcalc +%C%_mfcalc_LDADD = -lm +nodist_%C%_mfcalc_SOURCES = $(mfcalc_sources) -examples_mfcalc_mfcalc_CPPFLAGS = -I$(top_builddir)/examples/mfcalc -dist_TESTS += examples/mfcalc/mfcalc.test +%C%_mfcalc_CPPFLAGS = -I$(top_builddir)/%D% +dist_TESTS += %D%/mfcalc.test diff --git a/examples/rpcalc/local.mk b/examples/rpcalc/local.mk index 3ff2f98c..97f35356 100644 --- a/examples/rpcalc/local.mk +++ b/examples/rpcalc/local.mk @@ -18,18 +18,15 @@ ## -------------------- ## BUILT_SOURCES += $(rpcalc_sources) -CLEANFILES += examples/rpcalc/rpcalc.[ch] examples/rpcalc/rpcalc.output +CLEANFILES += %D%/rpcalc.[ch] %D%/rpcalc.output -rpcalc_extracted = \ - examples/rpcalc/rpcalc.y -rpcalc_sources = \ - $(rpcalc_extracted) +rpcalc_extracted = %D%/rpcalc.y +rpcalc_sources = $(rpcalc_extracted) extracted += $(rpcalc_extracted) -check_PROGRAMS += examples/rpcalc/rpcalc -examples_rpcalc_rpcalc_LDADD = -lm -nodist_examples_rpcalc_rpcalc_SOURCES = \ - $(rpcalc_sources) +check_PROGRAMS += %D%/rpcalc +%C%_rpcalc_LDADD = -lm +nodist_%C%_rpcalc_SOURCES = $(rpcalc_sources) -examples_rpcalc_rpcalc_CPPFLAGS = -I$(top_builddir)/examples/rpcalc -dist_TESTS += examples/rpcalc/rpcalc.test +%C%_rpcalc_CPPFLAGS = -I$(top_builddir)/%D% +dist_TESTS += %D%/rpcalc.test diff --git a/tests/local.mk b/tests/local.mk index fbf08ba2..394a92e5 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -85,7 +85,7 @@ $(TESTSUITE): $(TESTSUITE_AT) # Move into tests/ so that testsuite.dir etc. be created there. RUN_TESTSUITE = $(TESTSUITE) -C tests $(TESTSUITEFLAGS) check_SCRIPTS = $(BISON) tests/atconfig tests/atlocal -RUN_TESTSUITE_deps = $(TESTSUITE) $(check_SCRIPTS) +RUN_TESTSUITE_deps = all $(TESTSUITE) $(check_SCRIPTS) clean-local: clean-local-tests clean-local-tests: From 8d0b7cef7df7fead44b9574cee342de336008625 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 8 Nov 2013 10:52:15 +0100 Subject: [PATCH 23/43] parsers: rename YY_NULL as YY_NULLPTR to avoid conflicts with Flex Flex also defines YY_NULL (to 0). Avoid gratuitous conflicts. * data/c.m4 (b4_null_define): Rename YY_NULL as YY_NULLPTR. * data/glr.c, data/lalr1.cc, data/location.cc, data/variant.hh, * data/yacc.c, src/parse-gram.c, tests/actions.at, tests/c++.at, * tests/cxx-type.at, tests/glr-regression.at, tests/headers.at, * tests/push.at, tests/regression.at: Adjust. --- data/c.m4 | 10 ++-- data/glr.c | 112 ++++++++++++++++++++-------------------- data/lalr1.cc | 10 ++-- data/location.cc | 6 +-- data/variant.hh | 4 +- data/yacc.c | 12 ++--- src/parse-gram.c | 14 ++--- tests/actions.at | 2 +- tests/c++.at | 8 +-- tests/cxx-type.at | 14 ++--- tests/glr-regression.at | 4 +- tests/headers.at | 2 +- tests/push.at | 10 ++-- tests/regression.at | 2 +- 14 files changed, 105 insertions(+), 105 deletions(-) diff --git a/data/c.m4 b/data/c.m4 index 9b739bc4..b0524ef3 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -269,14 +269,14 @@ m4_define([b4_attribute_define], # b4_null_define # -------------- -# Portability issues: define a YY_NULL appropriate for the current +# Portability issues: define a YY_NULLPTR appropriate for the current # language (C, C++98, or C++11). m4_define([b4_null_define], -[# ifndef YY_NULL +[# ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr +# define YY_NULLPTR nullptr # else -# define YY_NULL 0 +# define YY_NULLPTR 0 # endif # endif[]dnl ]) @@ -285,7 +285,7 @@ m4_define([b4_null_define], # b4_null # ------- # Return a null pointer constant. -m4_define([b4_null], [YY_NULL]) +m4_define([b4_null], [YY_NULLPTR]) # b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT) # ------------------------------------------------------------- diff --git a/data/glr.c b/data/glr.c index 725453be..5069f613 100644 --- a/data/glr.c +++ b/data/glr.c @@ -672,7 +672,7 @@ static void yyexpandGLRStack (yyGLRStack* yystackp); static _Noreturn void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) { - if (yymsg != YY_NULL) + if (yymsg != YY_NULLPTR) yyerror (]b4_yyerror_args[yymsg); YYLONGJMP (yystackp->yyexception_buffer, 1); } @@ -715,7 +715,7 @@ yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) else /* The effect of using yysval or yyloc (in an immediate rule) is * undefined. */ - yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULL;]b4_locations_if([[ + yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULLPTR;]b4_locations_if([[ yyvsp[i].yystate.yyloc = s->yyloc;]])[ s = yyvsp[i].yystate.yypred = s->yypred; } @@ -747,7 +747,7 @@ yyuserAction (yyRuleNum yyn, size_t yyrhslen, yyGLRStackItem* yyvsp, yyGLRStack* yystackp, YYSTYPE* yyvalp]b4_locuser_formals[) { - yybool yynormal YY_ATTRIBUTE_UNUSED = (yystackp->yysplitPoint == YY_NULL); + yybool yynormal YY_ATTRIBUTE_UNUSED = (yystackp->yysplitPoint == YY_NULLPTR); int yylow; ]b4_parse_param_use([yyvalp], [yylocp])dnl [ YYUSE (yyrhslen); @@ -834,7 +834,7 @@ yydestroyGLRState (char const *yymsg, yyGLRState *yys]b4_user_formals[) YYFPRINTF (stderr, "%s unresolved", yymsg); else YYFPRINTF (stderr, "%s incomplete", yymsg); - YY_SYMBOL_PRINT ("", yystos[yys->yylrState], YY_NULL, &yys->yyloc); + YY_SYMBOL_PRINT ("", yystos[yys->yylrState], YY_NULLPTR, &yys->yyloc); } #endif @@ -987,7 +987,7 @@ yyinitStateSet (yyGLRStateSet* yyset) yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]); if (! yyset->yystates) return yyfalse; - yyset->yystates[0] = YY_NULL; + yyset->yystates[0] = YY_NULLPTR; yyset->yylookaheadNeeds = (yybool*) YYMALLOC (16 * sizeof yyset->yylookaheadNeeds[0]); if (! yyset->yylookaheadNeeds) @@ -1017,8 +1017,8 @@ yyinitGLRStack (yyGLRStack* yystackp, size_t yysize) if (!yystackp->yyitems) return yyfalse; yystackp->yynextFree = yystackp->yyitems; - yystackp->yysplitPoint = YY_NULL; - yystackp->yylastDeleted = YY_NULL; + yystackp->yysplitPoint = YY_NULLPTR; + yystackp->yylastDeleted = YY_NULLPTR; return yyinitStateSet (&yystackp->yytops); } @@ -1057,10 +1057,10 @@ yyexpandGLRStack (yyGLRStack* yystackp) { yyGLRState* yys0 = &yyp0->yystate; yyGLRState* yys1 = &yyp1->yystate; - if (yys0->yypred != YY_NULL) + if (yys0->yypred != YY_NULLPTR) yys1->yypred = YYRELOC (yyp0, yyp1, yys0->yypred, yystate); - if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != YY_NULL) + if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != YY_NULLPTR) yys1->yysemantics.yyfirstVal = YYRELOC (yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption); } @@ -1068,18 +1068,18 @@ yyexpandGLRStack (yyGLRStack* yystackp) { yySemanticOption* yyv0 = &yyp0->yyoption; yySemanticOption* yyv1 = &yyp1->yyoption; - if (yyv0->yystate != YY_NULL) + if (yyv0->yystate != YY_NULLPTR) yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate); - if (yyv0->yynext != YY_NULL) + if (yyv0->yynext != YY_NULLPTR) yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption); } } - if (yystackp->yysplitPoint != YY_NULL) + if (yystackp->yysplitPoint != YY_NULLPTR) yystackp->yysplitPoint = YYRELOC (yystackp->yyitems, yynewItems, yystackp->yysplitPoint, yystate); for (yyn = 0; yyn < yystackp->yytops.yysize; yyn += 1) - if (yystackp->yytops.yystates[yyn] != YY_NULL) + if (yystackp->yytops.yystates[yyn] != YY_NULLPTR) yystackp->yytops.yystates[yyn] = YYRELOC (yystackp->yyitems, yynewItems, yystackp->yytops.yystates[yyn], yystate); @@ -1103,7 +1103,7 @@ yyfreeGLRStack (yyGLRStack* yystackp) static inline void yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys) { - if (yystackp->yysplitPoint != YY_NULL && yystackp->yysplitPoint > yys) + if (yystackp->yysplitPoint != YY_NULLPTR && yystackp->yysplitPoint > yys) yystackp->yysplitPoint = yys; } @@ -1111,9 +1111,9 @@ yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys) static inline void yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk) { - if (yystackp->yytops.yystates[yyk] != YY_NULL) + if (yystackp->yytops.yystates[yyk] != YY_NULLPTR) yystackp->yylastDeleted = yystackp->yytops.yystates[yyk]; - yystackp->yytops.yystates[yyk] = YY_NULL; + yystackp->yytops.yystates[yyk] = YY_NULLPTR; } /** Undelete the last stack in *YYSTACKP that was marked as deleted. Can @@ -1122,12 +1122,12 @@ yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk) static void yyundeleteLastStack (yyGLRStack* yystackp) { - if (yystackp->yylastDeleted == YY_NULL || yystackp->yytops.yysize != 0) + if (yystackp->yylastDeleted == YY_NULLPTR || yystackp->yytops.yysize != 0) return; yystackp->yytops.yystates[0] = yystackp->yylastDeleted; yystackp->yytops.yysize = 1; YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n")); - yystackp->yylastDeleted = YY_NULL; + yystackp->yylastDeleted = YY_NULLPTR; } static inline void @@ -1137,7 +1137,7 @@ yyremoveDeletes (yyGLRStack* yystackp) yyi = yyj = 0; while (yyj < yystackp->yytops.yysize) { - if (yystackp->yytops.yystates[yyi] == YY_NULL) + if (yystackp->yytops.yystates[yyi] == YY_NULLPTR) { if (yyi == yyj) { @@ -1201,7 +1201,7 @@ yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, yynewState->yyposn = yyposn; yynewState->yyresolved = yyfalse; yynewState->yypred = yystackp->yytops.yystates[yyk]; - yynewState->yysemantics.yyfirstVal = YY_NULL; + yynewState->yysemantics.yyfirstVal = YY_NULLPTR; yystackp->yytops.yystates[yyk] = yynewState; /* Invokes YY_RESERVE_GLRSTACK. */ @@ -1261,7 +1261,7 @@ yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, { int yynrhs = yyrhsLength (yyrule); - if (yystackp->yysplitPoint == YY_NULL) + if (yystackp->yysplitPoint == YY_NULLPTR) { /* Standard special case: single stack. */ yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; @@ -1313,13 +1313,13 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, { size_t yyposn = yystackp->yytops.yystates[yyk]->yyposn; - if (yyforceEval || yystackp->yysplitPoint == YY_NULL) + if (yyforceEval || yystackp->yysplitPoint == YY_NULLPTR) { YYSTYPE yysval;]b4_locations_if([[ YYLTYPE yyloc;]])[ YYRESULTTAG yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[); - if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULL) + if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULLPTR) { YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n", (unsigned long int) yyk, yyrule - 1)); @@ -1352,7 +1352,7 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, "Now in state %d.\n", (unsigned long int) yyk, yyrule - 1, yynewLRState)); for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1) - if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL) + if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULLPTR) { yyGLRState *yysplit = yystackp->yysplitPoint; yyGLRState *yyp = yystackp->yytops.yystates[yyi]; @@ -1379,7 +1379,7 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, static size_t yysplitStack (yyGLRStack* yystackp, size_t yyk) { - if (yystackp->yysplitPoint == YY_NULL) + if (yystackp->yysplitPoint == YY_NULLPTR) { YYASSERT (yyk == 0); yystackp->yysplitPoint = yystackp->yytops.yystates[yyk]; @@ -1389,7 +1389,7 @@ yysplitStack (yyGLRStack* yystackp, size_t yyk) yyGLRState** yynewStates; yybool* yynewLookaheadNeeds; - yynewStates = YY_NULL; + yynewStates = YY_NULLPTR; if (yystackp->yytops.yycapacity > (YYSIZEMAX / (2 * sizeof yynewStates[0]))) @@ -1400,7 +1400,7 @@ yysplitStack (yyGLRStack* yystackp, size_t yyk) (yyGLRState**) YYREALLOC (yystackp->yytops.yystates, (yystackp->yytops.yycapacity * sizeof yynewStates[0])); - if (yynewStates == YY_NULL) + if (yynewStates == YY_NULLPTR) yyMemoryExhausted (yystackp); yystackp->yytops.yystates = yynewStates; @@ -1408,7 +1408,7 @@ yysplitStack (yyGLRStack* yystackp, size_t yyk) (yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds, (yystackp->yytops.yycapacity * sizeof yynewLookaheadNeeds[0])); - if (yynewLookaheadNeeds == YY_NULL) + if (yynewLookaheadNeeds == YY_NULLPTR) yyMemoryExhausted (yystackp); yystackp->yytops.yylookaheadNeeds = yynewLookaheadNeeds; } @@ -1472,9 +1472,9 @@ yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal; while (yytrue) { - if (yyz1 == *yyz0p || yyz1 == YY_NULL) + if (yyz1 == *yyz0p || yyz1 == YY_NULLPTR) break; - else if (*yyz0p == YY_NULL) + else if (*yyz0p == YY_NULLPTR) { *yyz0p = yyz1; break; @@ -1595,7 +1595,7 @@ yyreportTree (yySemanticOption* yyx, int yyindent) for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred) yystates[yyi] = yys; - if (yys == YY_NULL) + if (yys == YY_NULLPTR) { yyleftmost_state.yyposn = 0; yystates[0] = &yyleftmost_state; @@ -1666,7 +1666,7 @@ yyresolveLocations (yyGLRState* yys1, int yyn1, yyGLRStackItem yyrhsloc[1 + YYMAXRHS]; int yynrhs; yySemanticOption *yyoption = yys1->yysemantics.yyfirstVal; - YYASSERT (yyoption != YY_NULL); + YYASSERT (yyoption != YY_NULLPTR); yynrhs = yyrhsLength (yyoption->yyrule); if (yynrhs > 0) { @@ -1725,7 +1725,7 @@ yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[) YYRESULTTAG yyflag;]b4_locations_if([ YYLTYPE *yylocp = &yys->yyloc;])[ - for (yypp = &yyoptionList->yynext; *yypp != YY_NULL; ) + for (yypp = &yyoptionList->yynext; *yypp != YY_NULLPTR; ) { yySemanticOption* yyp = *yypp; @@ -1767,7 +1767,7 @@ yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[) int yyprec = yydprec[yybest->yyrule]; yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args[); if (yyflag == yyok) - for (yyp = yybest->yynext; yyp != YY_NULL; yyp = yyp->yynext) + for (yyp = yybest->yynext; yyp != YY_NULLPTR; yyp = yyp->yynext) { if (yyprec == yydprec[yyp->yyrule]) { @@ -1794,14 +1794,14 @@ yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[) yys->yysemantics.yysval = yysval; } else - yys->yysemantics.yyfirstVal = YY_NULL; + yys->yysemantics.yyfirstVal = YY_NULLPTR; return yyflag; } static YYRESULTTAG yyresolveStack (yyGLRStack* yystackp]b4_user_formals[) { - if (yystackp->yysplitPoint != YY_NULL) + if (yystackp->yysplitPoint != YY_NULLPTR) { yyGLRState* yys; int yyn; @@ -1821,10 +1821,10 @@ yycompressStack (yyGLRStack* yystackp) { yyGLRState* yyp, *yyq, *yyr; - if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == YY_NULL) + if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == YY_NULLPTR) return; - for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULL; + for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULLPTR; yyp != yystackp->yysplitPoint; yyr = yyp, yyp = yyq, yyq = yyp->yypred) yyp->yypred = yyr; @@ -1832,10 +1832,10 @@ yycompressStack (yyGLRStack* yystackp) yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems; yystackp->yynextFree = ((yyGLRStackItem*) yystackp->yysplitPoint) + 1; yystackp->yyspaceLeft -= yystackp->yynextFree - yystackp->yyitems; - yystackp->yysplitPoint = YY_NULL; - yystackp->yylastDeleted = YY_NULL; + yystackp->yysplitPoint = YY_NULLPTR; + yystackp->yylastDeleted = YY_NULLPTR; - while (yyr != YY_NULL) + while (yyr != YY_NULLPTR) { yystackp->yynextFree->yystate = *yyr; yyr = yyr->yypred; @@ -1850,7 +1850,7 @@ static YYRESULTTAG yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, size_t yyposn]b4_pure_formals[) { - while (yystackp->yytops.yystates[yyk] != YY_NULL) + while (yystackp->yytops.yystates[yyk] != YY_NULLPTR) { yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState; YYDPRINTF ((stderr, "Stack %lu Entering state %d\n", @@ -1972,13 +1972,13 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[) #else { yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); - size_t yysize0 = yytnamerr (YY_NULL, yytokenName (yytoken)); + size_t yysize0 = yytnamerr (YY_NULLPTR, yytokenName (yytoken)); size_t yysize = yysize0; yybool yysize_overflow = yyfalse; - char* yymsg = YY_NULL; + char* yymsg = YY_NULLPTR; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = YY_NULL; + const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -2034,7 +2034,7 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[) } yyarg[yycount++] = yytokenName (yyx); { - size_t yysz = yysize + yytnamerr (YY_NULL, yytokenName (yyx)); + size_t yysz = yysize + yytnamerr (YY_NULLPTR, yytokenName (yyx)); yysize_overflow |= yysz < yysize; yysize = yysz; } @@ -2112,7 +2112,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) { yySymbol yytoken; if (yychar == YYEOF) - yyFail (yystackp][]b4_lpure_args[, YY_NULL); + yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR); if (yychar != YYEMPTY) {]b4_locations_if([[ /* We throw away the lookahead, but the error range @@ -2153,10 +2153,10 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) /* Reduce to one stack. */ for (yyk = 0; yyk < yystackp->yytops.yysize; yyk += 1) - if (yystackp->yytops.yystates[yyk] != YY_NULL) + if (yystackp->yytops.yystates[yyk] != YY_NULLPTR) break; if (yyk >= yystackp->yytops.yysize) - yyFail (yystackp][]b4_lpure_args[, YY_NULL); + yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR); for (yyk += 1; yyk < yystackp->yytops.yysize; yyk += 1) yymarkStackDeleted (yystackp, yyk); yyremoveDeletes (yystackp); @@ -2164,7 +2164,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) /* Now pop stack until we find a state that shifts the error token. */ yystackp->yyerrState = 3; - while (yystackp->yytops.yystates[0] != YY_NULL) + while (yystackp->yytops.yystates[0] != YY_NULLPTR) { yyGLRState *yys = yystackp->yytops.yystates[0]; yyj = yypact[yys->yylrState]; @@ -2188,14 +2188,14 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) } }]b4_locations_if([[ yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ - if (yys->yypred != YY_NULL) + if (yys->yypred != YY_NULLPTR) yydestroyGLRState ("Error: popping", yys]b4_user_args[); yystackp->yytops.yystates[0] = yys->yypred; yystackp->yynextFree -= 1; yystackp->yyspaceLeft += 1; } - if (yystackp->yytops.yystates[0] == YY_NULL) - yyFail (yystackp][]b4_lpure_args[, YY_NULL); + if (yystackp->yytops.yystates[0] == YY_NULLPTR) + yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR); } #define YYCHK1(YYE) \ @@ -2438,7 +2438,7 @@ b4_dollar_popdef])[]dnl { yyGLRState *yys = yystates[yyk]; ]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]] -)[ if (yys->yypred != YY_NULL) +)[ if (yys->yypred != YY_NULLPTR) yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[); yystates[yyk] = yys->yypred; yystack.yynextFree -= 1; @@ -2470,7 +2470,7 @@ yy_yypstack (yyGLRState* yys) static void yypstates (yyGLRState* yyst) { - if (yyst == YY_NULL) + if (yyst == YY_NULLPTR) YYFPRINTF (stderr, ""); else yy_yypstack (yyst); @@ -2484,7 +2484,7 @@ yypstack (yyGLRStack* yystackp, size_t yyk) } #define YYINDEX(YYX) \ - ((YYX) == YY_NULL ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems) + ((YYX) == YY_NULLPTR ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems) static void diff --git a/data/lalr1.cc b/data/lalr1.cc index cb61ebb7..9703e44a 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -735,7 +735,7 @@ b4_dollar_popdef])[]dnl location values to have been already stored, initialize these stacks with a primary value. */ yystack_.clear (); - yypush_ (YY_NULL, 0, yyla); + yypush_ (YY_NULLPTR, 0, yyla); // A new symbol was pushed on the stack. yynewstate: @@ -860,7 +860,7 @@ b4_dollar_popdef])[]dnl YY_STACK_PRINT (); // Shift the result of the reduction. - yypush_ (YY_NULL, yylhs); + yypush_ (YY_NULLPTR, yylhs); goto yynewstate; /*--------------------------------------. @@ -989,11 +989,11 @@ b4_dollar_popdef])[]dnl // Do not try to display the values of the reclaimed symbols, // as their printer might throw an exception. if (!yyempty) - yy_destroy_ (YY_NULL, yyla); + yy_destroy_ (YY_NULLPTR, yyla); while (1 < yystack_.size ()) { - yy_destroy_ (YY_NULL, yystack_[0]); + yy_destroy_ (YY_NULLPTR, yystack_[0]); yypop_ (); } throw; @@ -1075,7 +1075,7 @@ b4_error_verbose_if([state_type yystate, symbol_number_type yytoken], } } - char const* yyformat = YY_NULL; + char const* yyformat = YY_NULLPTR; switch (yycount) { #define YYCASE_(N, S) \ diff --git a/data/location.cc b/data/location.cc index 9a60f250..e80742a5 100644 --- a/data/location.cc +++ b/data/location.cc @@ -27,7 +27,7 @@ m4_define([b4_position_define], { public:]m4_ifdef([b4_location_constructors], [[ /// Construct a position. - explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULL, + explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR, unsigned int l = ]b4_location_initial_line[u, unsigned int c = ]b4_location_initial_column[u) : filename (f) @@ -38,7 +38,7 @@ m4_define([b4_position_define], ]])[ /// Initialization. - void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULL, + void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULLPTR, unsigned int l = ]b4_location_initial_line[u, unsigned int c = ]b4_location_initial_column[u) { @@ -178,7 +178,7 @@ m4_define([b4_location_define], ])[ /// Initialization. - void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULL, + void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR, unsigned int l = ]b4_location_initial_line[u, unsigned int c = ]b4_location_initial_column[u) { diff --git a/data/variant.hh b/data/variant.hh index 76c3e60d..633c29ab 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -95,7 +95,7 @@ m4_define([b4_variant_define], /// Empty construction. variant ()]b4_parse_assert_if([ - : yytname_ (YY_NULL)])[ + : yytname_ (YY_NULLPTR)])[ {} /// Construct and fill. @@ -198,7 +198,7 @@ m4_define([b4_variant_define], destroy () { as ().~T ();]b4_parse_assert_if([ - yytname_ = YY_NULL;])[ + yytname_ = YY_NULLPTR;])[ } private: diff --git a/data/yacc.c b/data/yacc.c index 822656b8..aed7f069 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -1108,11 +1108,11 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, ]b4_lac_if([[yytype_int16 *yyesa, yytype_int16 **yyes, YYSIZE_T *yyes_capacity, ]])[yytype_int16 *yyssp, int yytoken) { - YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = YY_NULL; + const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -1187,7 +1187,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, } yyarg[yycount++] = yytname[yyx]; { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; @@ -1271,7 +1271,7 @@ static char yypstate_allocated = 0;]])b4_pull_if([ b4_function_define([[yyparse]], [[int]], b4_parse_param)[ { - return yypull_parse (YY_NULL]m4_ifset([b4_parse_param], + return yypull_parse (YY_NULLPTR]m4_ifset([b4_parse_param], [[, ]b4_args(b4_parse_param)])[); } @@ -1313,10 +1313,10 @@ b4_function_define([[yyparse]], [[int]], b4_parse_param)[ { yypstate *yyps;]b4_pure_if([], [[ if (yypstate_allocated) - return YY_NULL;]])[ + return YY_NULLPTR;]])[ yyps = (yypstate *) malloc (sizeof *yyps); if (!yyps) - return YY_NULL; + return YY_NULLPTR; yyps->yynew = 1;]b4_pure_if([], [[ yypstate_allocated = 1;]])[ return yyps; diff --git a/src/parse-gram.c b/src/parse-gram.c index b48ed6ff..9e279f5e 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -80,11 +80,11 @@ #line 82 "src/parse-gram.c" /* yacc.c:339 */ -# ifndef YY_NULL +# ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr +# define YY_NULLPTR nullptr # else -# define YY_NULL 0 +# define YY_NULLPTR 0 # endif # endif @@ -639,7 +639,7 @@ static const char *const yytname[] = "symbols.1", "generic_symlist", "generic_symlist_item", "tag", "symbol_def", "symbol_defs.1", "grammar", "rules_or_grammar_declaration", "rules", "$@4", "rhses.1", "rhs", "named_ref.opt", "variable", "value", - "id", "id_colon", "symbol", "string_as_id", "epilogue.opt", YY_NULL + "id", "id_colon", "symbol", "string_as_id", "epilogue.opt", YY_NULLPTR }; #endif @@ -1569,11 +1569,11 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyesa, yytype_int16 **yyes, YYSIZE_T *yyes_capacity, yytype_int16 *yyssp, int yytoken) { - YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]); + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = YY_NULL; + const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -1628,7 +1628,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, } yyarg[yycount++] = yytname[yyx]; { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]); + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; diff --git a/tests/actions.at b/tests/actions.at index 6c1ecbc1..a9846d4c 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -596,7 +596,7 @@ thing: ; %% /* Alias to ARGV[1]. */ -const char *source = YY_NULL; +const char *source = YY_NULLPTR; ]AT_YYERROR_DEFINE[ diff --git a/tests/c++.at b/tests/c++.at index ac68dc0c..e403c554 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -796,11 +796,11 @@ item: // Not just 'E', otherwise we reduce when 'E' is the lookahead, and // then the stack is emptied, defeating the point of the test. | 'E' 'a' { YYUSE($][1); $][$ = $][2; } -| 'R' { ]AT_VARIANT_IF([], [$][$ = YY_NULL; delete $][1]; )[YYERROR; } +| 'R' { ]AT_VARIANT_IF([], [$][$ = YY_NULLPTR; delete $][1]; )[YYERROR; } | 'p' { $][$ = $][1; } | 's' { $][$ = $][1; throw std::runtime_error ("reduction"); } -| 'T' { ]AT_VARIANT_IF([], [$][$ = YY_NULL; delete $][1]; )[YYABORT; } -| error { ]AT_VARIANT_IF([], [$][$ = YY_NULL; ])[yyerrok; } +| 'T' { ]AT_VARIANT_IF([], [$][$ = YY_NULLPTR; delete $][1]; )[YYABORT; } +| error { ]AT_VARIANT_IF([], [$][$ = YY_NULLPTR; ])[yyerrok; } ; %% @@ -868,7 +868,7 @@ main (int argc, const char *argv[]) { std::cerr << "unknown exception caught" << std::endl; } - Object::log (YY_NULL, "end"); + Object::log (YY_NULLPTR, "end"); assert (Object::empty()); return res; } diff --git a/tests/cxx-type.at b/tests/cxx-type.at index 2c37c176..196ac0bb 100644 --- a/tests/cxx-type.at +++ b/tests/cxx-type.at @@ -94,19 +94,19 @@ prog : stmt : expr ';' $2 { $$ = ]$[1; } | decl $3 - | error ';' { $$ = new_nterm ("", YY_NULL, YY_NULL, YY_NULL); } + | error ';' { $$ = new_nterm ("", YY_NULLPTR, YY_NULLPTR, YY_NULLPTR); } | '@' { YYACCEPT; } ; expr : ID | TYPENAME '(' expr ')' - { $$ = new_nterm ("(%s,%s)", ]$[3, ]$[1, YY_NULL); } - | expr '+' expr { $$ = new_nterm ("+(%s,%s)", ]$[1, ]$[3, YY_NULL); } - | expr '=' expr { $$ = new_nterm ("=(%s,%s)", ]$[1, ]$[3, YY_NULL); } + { $$ = new_nterm ("(%s,%s)", ]$[3, ]$[1, YY_NULLPTR); } + | expr '+' expr { $$ = new_nterm ("+(%s,%s)", ]$[1, ]$[3, YY_NULLPTR); } + | expr '=' expr { $$ = new_nterm ("=(%s,%s)", ]$[1, ]$[3, YY_NULLPTR); } ; decl : TYPENAME declarator ';' - { $$ = new_nterm ("(%s,%s)", ]$[1, ]$[2, YY_NULL); } + { $$ = new_nterm ("(%s,%s)", ]$[1, ]$[2, YY_NULLPTR); } | TYPENAME declarator '=' expr ';' { $$ = new_nterm ("(%s,%s,%s)", ]$[1, ]$[2, ]$[4); } @@ -195,7 +195,7 @@ main (int argc, char **argv) { colNum += 1; tok = c; - yylval = YY_NULL; + yylval = YY_NULLPTR; }]AT_LOCATION_IF([[ yylloc.last_column = colNum-1;]])[ return tok; @@ -287,7 +287,7 @@ m4_bmatch([$2], [stmtMerge], [[static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1) { - return new_nterm ("(%s,%s)", x0, x1, YY_NULL); + return new_nterm ("(%s,%s)", x0, x1, YY_NULLPTR); } ]]) ) diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 064b37b2..b1444bbd 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -67,7 +67,7 @@ static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1) return 0; } -const char *input = YY_NULL; +const char *input = YY_NULLPTR; int main (int argc, const char* argv[]) @@ -304,7 +304,7 @@ MergeRule (int x0, int x1) } ]AT_YYERROR_DEFINE[ -FILE *input = YY_NULL; +FILE *input = YY_NULLPTR; int P[] = { P1, P2 }; int O[] = { O1, O2 }; diff --git a/tests/headers.at b/tests/headers.at index 9b71c030..f32e2a18 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -229,7 +229,7 @@ AT_CHECK([[$PERL -n -0777 -e ' |YY_IGNORE_MAYBE_UNINITIALIZED_(?:BEGIN|END) |YY_INITIAL_VALUE |YY_\w+_INCLUDED - |YY_NULL + |YY_NULLPTR |(defined|if)\ YYDEBUG )\b}{}gx; while (/^(.*YY.*)$/gm) diff --git a/tests/push.at b/tests/push.at index 7dde2957..d39ca56a 100644 --- a/tests/push.at +++ b/tests/push.at @@ -57,12 +57,12 @@ main (void) /* yypstate_delete used to leak ps->yyss if the stack was reallocated but the parse did not return on success, syntax error, or memory exhaustion. */ ps = yypstate_new (); - assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE); + assert (yypush_parse (ps, 'a', YY_NULLPTR) == YYPUSH_MORE); yypstate_delete (ps); ps = yypstate_new (); - assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE); - assert (yypush_parse (ps, 'b', YY_NULL) == YYPUSH_MORE); + assert (yypush_parse (ps, 'a', YY_NULLPTR) == YYPUSH_MORE); + assert (yypush_parse (ps, 'b', YY_NULLPTR) == YYPUSH_MORE); yypstate_delete (ps); return 0; @@ -111,11 +111,11 @@ main (void) { yypstate *ps = yypstate_new (); assert (ps); - assert (yypstate_new () == YY_NULL); + assert (yypstate_new () == YY_NULLPTR); ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; yychar = 0; assert (yypush_parse (ps) == 0); - assert (yypstate_new () == YY_NULL); + assert (yypstate_new () == YY_NULLPTR); ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; yypstate_delete (ps); } diff --git a/tests/regression.at b/tests/regression.at index b9ca94c0..223dc06a 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -770,7 +770,7 @@ static const yytype_uint8 yyrline[] = static const char *const yytname[] = { "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"", - "\"else\"", "$accept", "statement", "struct_stat", "if", "else", YY_NULL + "\"else\"", "$accept", "statement", "struct_stat", "if", "else", YY_NULLPTR }; static const yytype_uint16 yytoknum[] = { From 458171e6df5a0110a35ee45ad8b2e9f6fb426f1d Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 12 Nov 2013 15:46:27 +0100 Subject: [PATCH 24/43] aver: it is no longer "protected against NDEBUG" Apply the same rules for aver as for assert: no side effects, especially not important ones. * src/AnnotationList.c, src/muscle-tab.c: Adjust aver uses to resist to -DNDEBUG. --- src/AnnotationList.c | 10 +++++++--- src/muscle-tab.c | 15 ++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/AnnotationList.c b/src/AnnotationList.c index b14c675b..31d8a991 100644 --- a/src/AnnotationList.c +++ b/src/AnnotationList.c @@ -541,9 +541,13 @@ AnnotationList__compute_from_inadequacies ( { InadequacyList__prependTo (conflict_node, &inadequacy_lists[s->number]); - aver (AnnotationList__insertInto ( - annotation_node, &annotation_lists[s->number], - s->nitems)); + { + bool b = + AnnotationList__insertInto (annotation_node, + &annotation_lists[s->number], + s->nitems); + aver (b); + } /* This aver makes sure the AnnotationList__computeDominantContribution check above does discard annotations in the simplest case of a S/R diff --git a/src/muscle-tab.c b/src/muscle-tab.c index cc5d01df..71a79b4e 100644 --- a/src/muscle-tab.c +++ b/src/muscle-tab.c @@ -299,8 +299,9 @@ muscle_location_grow (char const *key, location loc) #define COMMON_DECODE(Value) \ case '$': \ - aver (*++(Value) == ']'); \ - aver (*++(Value) == '['); \ + ++(Value); aver (*(Value) == '['); \ + ++(Value); aver (*(Value) == ']'); \ + ++(Value); aver (*(Value) == '['); \ obstack_sgrow (&muscle_obstack, "$"); \ break; \ case '@': \ @@ -349,7 +350,7 @@ location_decode (char const *value) location loc; aver (value); aver (*value == '['); - aver (*++value == '['); + ++value; aver (*value == '['); while (*++value) switch (*value) { @@ -360,16 +361,16 @@ location_decode (char const *value) case ']': { char *boundary_str; - aver (*++value == ']'); + ++value; aver (*value == ']'); boundary_str = obstack_finish0 (&muscle_obstack); switch (*++value) { case ',': boundary_set_from_string (&loc.start, boundary_str); obstack_free (&muscle_obstack, boundary_str); - aver (*++value == ' '); - aver (*++value == '['); - aver (*++value == '['); + ++value; aver (*value == ' '); + ++value; aver (*value == '['); + ++value; aver (*value == '['); break; case '\0': boundary_set_from_string (&loc.end, boundary_str); From c2ecada32b06915f83037ddc420d72efdfdca384 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 12 Nov 2013 15:55:33 +0100 Subject: [PATCH 25/43] version 3.0.1 * NEWS: Record release date. --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 5df8b81a..533f99cc 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ GNU Bison NEWS -* Noteworthy changes in release ?.? (????-??-??) [?] +* Noteworthy changes in release 3.0.1 (2013-11-12) [stable] ** Bug fixes From 6d94eebba7bdc817f8534ff0b9541e509e004ad1 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 12 Nov 2013 18:37:14 +0100 Subject: [PATCH 26/43] maint: post-release administrivia * NEWS: Add header line for next release. * .prev-version: Record previous version. * cfg.mk (old_NEWS_hash): Auto-update. --- .prev-version | 2 +- NEWS | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.prev-version b/.prev-version index 9f55b2cc..cb2b00e4 100644 --- a/.prev-version +++ b/.prev-version @@ -1 +1 @@ -3.0 +3.0.1 diff --git a/NEWS b/NEWS index 533f99cc..29cfe727 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,8 @@ GNU Bison NEWS +* Noteworthy changes in release ?.? (????-??-??) [?] + + * Noteworthy changes in release 3.0.1 (2013-11-12) [stable] ** Bug fixes From edb2e90531197dfd3250bd3ca2e5993376002182 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 14 Nov 2013 16:14:39 +0100 Subject: [PATCH 27/43] skeletons: use better names when computing a "goto" * data/glr.c (yyLRgotoState): Name the symbol argument yysym, instead of yylhs. * data/lalr1.cc (yy_lr_goto_state_): Likewise. * data/lalr1.java (yy_lr_goto_state_): New, modeled after the previous two routines. Use it. --- data/glr.c | 10 +++++++--- data/lalr1.cc | 10 +++++----- data/lalr1.java | 22 ++++++++++++++-------- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/data/glr.c b/data/glr.c index 5069f613..39d12a0e 100644 --- a/data/glr.c +++ b/data/glr.c @@ -910,14 +910,18 @@ yygetLRActions (yyStateNum yystate, int yytoken, } } +/** Compute post-reduction state. + * \param yystate the current state + * \param yysym the nonterminal to push on the stack + */ static inline yyStateNum -yyLRgotoState (yyStateNum yystate, yySymbol yylhs) +yyLRgotoState (yyStateNum yystate, yySymbol yysym) { - int yyr = yypgoto[yylhs - YYNTOKENS] + yystate; + int yyr = yypgoto[yysym - YYNTOKENS] + yystate; if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) return yytable[yyr]; else - return yydefgoto[yylhs - YYNTOKENS]; + return yydefgoto[yysym - YYNTOKENS]; } static inline yybool diff --git a/data/lalr1.cc b/data/lalr1.cc index 9703e44a..d3d063ab 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -220,8 +220,8 @@ b4_location_define])])[ /// Compute post-reduction state. /// \param yystate the current state - /// \param yylhs the nonterminal to push on the stack - state_type yy_lr_goto_state_ (state_type yystate, int yylhs); + /// \param yysym the nonterminal to push on the stack + state_type yy_lr_goto_state_ (state_type yystate, int yysym); /// Whether the given \c yypact_ value indicates a defaulted state. /// \param yyvalue the value to check @@ -671,13 +671,13 @@ m4_if(b4_prefix, [yy], [], #endif // ]b4_api_PREFIX[DEBUG inline ]b4_parser_class_name[::state_type - ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs) + ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yysym) { - int yyr = yypgoto_[yylhs - yyntokens_] + yystate; + int yyr = yypgoto_[yysym - yyntokens_] + yystate; if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate) return yytable_[yyr]; else - return yydefgoto_[yylhs - yyntokens_]; + return yydefgoto_[yysym - yyntokens_]; } inline bool diff --git a/data/lalr1.java b/data/lalr1.java index d137ed81..bd32fa75 100644 --- a/data/lalr1.java +++ b/data/lalr1.java @@ -453,6 +453,19 @@ b4_define_state])[ return yyerrstatus_ == 0; } + /** Compute post-reduction state. + * @@param yystate the current state + * @@param yysym the nonterminal to push on the stack + */ + private int yy_lr_goto_state_ (int yystate, int yysym) + { + int yyr = yypgoto_[yysym - yyntokens_] + yystate; + if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate) + return yytable_[yyr]; + else + return yydefgoto_[yysym - yyntokens_]; + } + private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[ { ]b4_yystype[ yyval; @@ -483,14 +496,7 @@ b4_define_state])[ yylen = 0; /* Shift the result of the reduction. */ - yyn = yyr1_[yyn]; - int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0); - if (0 <= yystate && yystate <= yylast_ - && yycheck_[yystate] == yystack.stateAt (0)) - yystate = yytable_[yystate]; - else - yystate = yydefgoto_[yyn - yyntokens_]; - + int yystate = yy_lr_goto_state_ (yystack.stateAt (0), yyr1_[yyn]); yystack.push (yystate, yyval]b4_locations_if([, yyloc])[); return YYNEWSTATE; } From 16bb9f1647c4666d8f4e55c672e0ee5010df9e51 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 14 Nov 2013 16:58:42 +0100 Subject: [PATCH 28/43] tests: simplify useless obfuscation * tests/c++.at: $$ is not special for M4, there is no need to "escape" it. --- tests/c++.at | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/c++.at b/tests/c++.at index e403c554..14a001a4 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -243,7 +243,7 @@ typedef std::list strings_type; // digraph for the left square bracket. %type <::std::list> list result; -%printer { yyo << $][$; } +%printer { yyo << $$; } <::std::string> <::std::list>; %% @@ -253,13 +253,13 @@ result: list: /* nothing */ { /* Generates an empty string list */ } -| list item { std::swap ($][$,$][1); $$.push_back ($][2); } -| list error { std::swap ($][$,$][1); } +| list item { std::swap ($$,$][1); $$.push_back ($][2); } +| list error { std::swap ($$,$][1); } ; item: - TEXT { std::swap ($][$,$][1); } -| NUMBER { if ($][1 == 3) YYERROR; else $][$ = string_cast ($][1); } + TEXT { std::swap ($$,$][1); } +| NUMBER { if ($][1 == 3) YYERROR; else $$ = string_cast ($][1); } ; %% ]AT_TOKEN_CTOR_IF([], @@ -785,21 +785,21 @@ $1 start: list {]AT_VARIANT_IF([], [ delete $][1]; )[}; list: - item { $][$ = $][1; } + item { $$ = $][1; } // Right recursion to load the stack. -| item list { $][$ = $][1; ]AT_VARIANT_IF([], [delete $][2]; )[} +| item list { $$ = $][1; ]AT_VARIANT_IF([], [delete $][2]; )[} ; item: - 'a' { $$][ = $][1; } -| 'e' { YYUSE ($][$); YYUSE($][1); error ("syntax error"); } + 'a' { $$ = $][1; } +| 'e' { YYUSE ($$); YYUSE($][1); error ("syntax error"); } // Not just 'E', otherwise we reduce when 'E' is the lookahead, and // then the stack is emptied, defeating the point of the test. -| 'E' 'a' { YYUSE($][1); $][$ = $][2; } -| 'R' { ]AT_VARIANT_IF([], [$][$ = YY_NULLPTR; delete $][1]; )[YYERROR; } -| 'p' { $][$ = $][1; } -| 's' { $][$ = $][1; throw std::runtime_error ("reduction"); } -| 'T' { ]AT_VARIANT_IF([], [$][$ = YY_NULLPTR; delete $][1]; )[YYABORT; } +| 'E' 'a' { YYUSE($][1); $$ = $][2; } +| 'R' { ]AT_VARIANT_IF([], [$$ = YY_NULLPTR; delete $][1]; )[YYERROR; } +| 'p' { $$ = $][1; } +| 's' { $$ = $][1; throw std::runtime_error ("reduction"); } +| 'T' { ]AT_VARIANT_IF([], [$$ = YY_NULLPTR; delete $][1]; )[YYABORT; } | error { ]AT_VARIANT_IF([], [$][$ = YY_NULLPTR; ])[yyerrok; } ; %% From 5cf6e669af1b6133e1ec8cb66a5bd5754ee437c2 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 15 Nov 2013 09:43:01 +0100 Subject: [PATCH 29/43] tests: check $$'s destruction with variant, YYERROR, and no error recovery When variant are enabled, the yylhs variable (the left-hand side of the rule being reduced, i.e. $$ and @$) is explicitly destroyed when YYERROR is called. This is because before running the user code, $$ is initialized, so that the user can properly use it. However, when quitting yyparse, yylhs is also reclaimed by the C++ compiler: the variable goes out of scope. This was not detected by the test suite because (i) the Object tracker was too weak, and (ii) the problem does not show when there is error recovery. Reported by Paolo Simone Gasparello. * tests/c++.at (Exception safety): Improve the objects logger to make sure that we never destroy twice an object. Also track copy-constructors. Use a set instead of a list. Display the logs before running the function body, this is more useful in case of failure. Generalize to track with and without error recovery. --- THANKS | 1 + tests/c++.at | 66 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/THANKS b/THANKS index 9b7a8963..ebadb447 100644 --- a/THANKS +++ b/THANKS @@ -96,6 +96,7 @@ Odd Arild Olsen oao@fibula.no Oleg Smolsky oleg.smolsky@pacific-simulators.co.nz Oleksii Taran oleksii.taran@gmail.com Paolo Bonzini bonzini@gnu.org +Paolo Simone Gasparello djgaspa@gmail.com Pascal Bart pascal.bart@epita.fr Paul Eggert eggert@cs.ucla.edu Paul Hilfinger Hilfinger@CS.Berkeley.EDU diff --git a/tests/c++.at b/tests/c++.at index 14a001a4..355e6247 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -649,14 +649,18 @@ AT_CLEANUP ## Exception safety. ## ## ------------------ ## -# AT_TEST([BISON-DIRECTIVES]) -# --------------------------- +# AT_TEST([BISON-DIRECTIVES = ''], [WITH-RECOVERY = "with"]) +# ---------------------------------------------------------- # Check that no object is leaked when exceptions are thrown. +# WITH-RECOVERY = "with" or "without". m4_pushdef([AT_TEST], -[AT_SETUP([[Exception safety $1]]) +[AT_SETUP([[Exception safety $2 error recovery $1]]) AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR +m4_if([$1], [], [], + [m4_if([$2], [without], [AT_XFAIL_IF([true])])]) + AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" $1]) AT_DATA_GRAMMAR([[input.yy]], @@ -669,27 +673,43 @@ $1 #include #include // size_t and getenv. #include - #include + #include bool debug = false; - /// A class that counts its number of instances. + /// A class that tracks its instances. struct Object { char val; - Object (char v) - : val (v) - { - Object::instances.push_back(this); - log (this, "Object::Object"); - } - Object () : val ('?') { - Object::instances.push_back(this); log (this, "Object::Object"); + Object::instances.insert (this); + } + + Object (const Object& that) + : val (that.val) + { + log (this, "Object::Object"); + Object::instances.insert (this); + } + + Object (char v) + : val (v) + { + log (this, "Object::Object"); + Object::instances.insert (this); + } + + ~Object () + { + log (this, "Object::~Object"); + objects::const_iterator i = instances.find (this); + // Make sure this object is alive. + assert (i != instances.end ()); + Object::instances.erase (i); } Object& operator= (char v) @@ -698,14 +718,8 @@ $1 return *this; } - ~Object () - { - Object::instances.remove (this); - log (this, "Object::~Object"); - } - // Static part. - typedef std::list objects; + typedef std::set objects; static objects instances; static bool @@ -800,7 +814,8 @@ item: | 'p' { $$ = $][1; } | 's' { $$ = $][1; throw std::runtime_error ("reduction"); } | 'T' { ]AT_VARIANT_IF([], [$$ = YY_NULLPTR; delete $][1]; )[YYABORT; } -| error { ]AT_VARIANT_IF([], [$][$ = YY_NULLPTR; ])[yyerrok; } +]m4_if([$2], [with], +[[| error { $$ = ]AT_VARIANT_IF([], [new ])[Object ('R'); yyerrok; }]])[ ; %% @@ -903,16 +918,17 @@ AT_PARSER_CHECK([[./input aaaaE]], [[2]], [[]], AT_PARSER_CHECK([[./input aaaaT]], [[1]]) -# There is error-recovery, so exit success. -AT_PARSER_CHECK([[./input aaaaR]], [[0]]) +AT_PARSER_CHECK([[./input aaaaR]], [m4_if([$2], [with], [0], [1])]) AT_BISON_OPTION_POPDEFS AT_CLEANUP ]) -AT_TEST -AT_TEST([%define api.value.type variant]) +AT_TEST([], [with]) +AT_TEST([], [without]) +AT_TEST([%define api.value.type variant], [with]) +AT_TEST([%define api.value.type variant], [without]) m4_popdef([AT_TEST]) From 5c77412162fbdd2187cb384e55d1088b46a5c56d Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 15 Nov 2013 10:08:31 +0100 Subject: [PATCH 30/43] lalr1.cc: fix the support of YYERROR with variants When variant are enabled, the yylhs variable (the left-hand side of the rule being reduced, i.e. $$ and @$) is explicitly destroyed when YYERROR is called. This is because before running the user code, $$ is initialized, so that the user can properly use it. However, when quitting yyparse, yylhs is also reclaimed by the C++ compiler: the variable goes out of scope. Instead of trying to be too smart, let the compiler do its job: reduce the scope of yylhs to exactly the reduction. This way, whatever the type of scope exit (regular, exception, return, goto...) this variable will be properly reclaimed. Reported by Paolo Simone Gasparello. * data/lalr1.cc (yyparse): Reduce the scope of yylhs. * tests/c++.at: We now pass this test. --- data/lalr1.cc | 12 +++++------- tests/c++.at | 3 --- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/data/lalr1.cc b/data/lalr1.cc index d3d063ab..61dc6663 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -700,6 +700,7 @@ m4_if(b4_prefix, [yy], [], // State. int yyn; + /// Length of the RHS of the rule being reduced. int yylen = 0; // Error handling. @@ -712,9 +713,6 @@ m4_if(b4_prefix, [yy], [], /// The locations where the error started and ended. stack_symbol_type yyerror_range[3];]])[ - /// $$ and @@$. - stack_symbol_type yylhs; - /// The return value of parse (). int yyresult; @@ -815,6 +813,8 @@ b4_dollar_popdef])[]dnl `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; + { + stack_symbol_type yylhs; yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([ /* Variants are always initialized to an empty instance of the correct type. The default $$=$1 action is NOT applied when using @@ -861,6 +861,7 @@ b4_dollar_popdef])[]dnl // Shift the result of the reduction. yypush_ (YY_NULLPTR, yylhs); + } goto yynewstate; /*--------------------------------------. @@ -907,10 +908,7 @@ b4_dollar_popdef])[]dnl code. */ if (false) goto yyerrorlab;]b4_locations_if([[ - yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[ - /* $$ was initialized before running the user action. */ - YY_SYMBOL_PRINT ("Error: discarding", yylhs); - yylhs.~stack_symbol_type();]])[ + yyerror_range[1].location = yystack_[yylen - 1].location;]])[ /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ yypop_ (yylen); diff --git a/tests/c++.at b/tests/c++.at index 355e6247..5b3df02b 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -658,9 +658,6 @@ m4_pushdef([AT_TEST], AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR -m4_if([$1], [], [], - [m4_if([$2], [without], [AT_XFAIL_IF([true])])]) - AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" $1]) AT_DATA_GRAMMAR([[input.yy]], From 44186fc4ecddf0b026ce1107c6347e6ac4e96ea8 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 15 Nov 2013 10:10:41 +0100 Subject: [PATCH 31/43] lalr1.cc: formatting changes * data/lalr1.cc: Fix indentation. --- data/lalr1.cc | 80 +++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/data/lalr1.cc b/data/lalr1.cc index 61dc6663..876de8c9 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -815,52 +815,52 @@ b4_dollar_popdef])[]dnl yylen = yyr2_[yyn]; { stack_symbol_type yylhs; - yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([ - /* Variants are always initialized to an empty instance of the - correct type. The default $$=$1 action is NOT applied when using - variants. */ - b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[ - /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. Otherwise, use the top of the stack. + yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([ + /* Variants are always initialized to an empty instance of the + correct type. The default '$$ = $1' action is NOT applied + when using variants. */ + b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])], [ + /* If YYLEN is nonzero, implement the default value of the + action: '$$ = $1'. Otherwise, use the top of the stack. - Otherwise, the following line sets YYLHS.VALUE to garbage. - This behavior is undocumented and Bison - users should not rely upon it. */ - if (yylen) - yylhs.value = yystack_@{yylen - 1@}.value; - else - yylhs.value = yystack_@{0@}.value;])[ + Otherwise, the following line sets YYLHS.VALUE to garbage. + This behavior is undocumented and Bison users should not rely + upon it. */ + if (yylen) + yylhs.value = yystack_@{yylen - 1@}.value; + else + yylhs.value = yystack_@{0@}.value;])[ ]b4_locations_if([dnl [ - // Compute the default @@$. - { - slice slice (yystack_, yylen); - YYLLOC_DEFAULT (yylhs.location, slice, yylen); - }]])[ - - // Perform the reduction. - YY_REDUCE_PRINT (yyn); - try + // Compute the default @@$. { - switch (yyn) - { + slice slice (yystack_, yylen); + YYLLOC_DEFAULT (yylhs.location, slice, yylen); + }]])[ + + // Perform the reduction. + YY_REDUCE_PRINT (yyn); + try + { + switch (yyn) + { ]b4_user_actions[ - default: - break; - } - } - catch (const syntax_error& yyexc) - { - error (yyexc); - YYERROR; - } - YY_SYMBOL_PRINT ("-> $$ =", yylhs); - yypop_ (yylen); - yylen = 0; - YY_STACK_PRINT (); + default: + break; + } + } + catch (const syntax_error& yyexc) + { + error (yyexc); + YYERROR; + } + YY_SYMBOL_PRINT ("-> $$ =", yylhs); + yypop_ (yylen); + yylen = 0; + YY_STACK_PRINT (); - // Shift the result of the reduction. - yypush_ (YY_NULLPTR, yylhs); + // Shift the result of the reduction. + yypush_ (YY_NULLPTR, yylhs); } goto yynewstate; From a339aef48a90a4d8e3b477cfcc2a07f1d5072424 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 18 Nov 2013 10:29:23 +0100 Subject: [PATCH 32/43] style: scope reduction in lalr.cc * src/lalr.c: Shorten variable scopes. (lookahead_tokens_print): Use the same variable name in two loops iterating over the same structure. --- src/lalr.c | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/lalr.c b/src/lalr.c index d99f960f..dc04eab3 100644 --- a/src/lalr.c +++ b/src/lalr.c @@ -67,17 +67,13 @@ static goto_number **includes; static goto_list **lookback; - - void set_goto_map (void) { state_number s; - goto_number *temp_map; + goto_number *temp_map = xnmalloc (nvars + 1, sizeof *temp_map); goto_map = xcalloc (nvars + 1, sizeof *goto_map); - temp_map = xnmalloc (nvars + 1, sizeof *temp_map); - ngotos = 0; for (s = 0; s < nstates; ++s) { @@ -132,16 +128,13 @@ set_goto_map (void) goto_number map_goto (state_number s0, symbol_number sym) { - goto_number high; - goto_number low; - goto_number middle; - state_number s; - - low = goto_map[sym - ntokens]; - high = goto_map[sym - ntokens + 1] - 1; + goto_number low = goto_map[sym - ntokens]; + goto_number high = goto_map[sym - ntokens + 1] - 1; for (;;) { + goto_number middle; + state_number s; aver (low <= high); middle = (low + high) / 2; s = from_state[middle]; @@ -412,7 +405,6 @@ static void lookahead_tokens_print (FILE *out) { state_number i; - int j, k; fprintf (out, "Lookahead tokens: BEGIN\n"); for (i = 0; i < nstates; ++i) { @@ -421,21 +413,25 @@ lookahead_tokens_print (FILE *out) int n_lookahead_tokens = 0; if (reds->lookahead_tokens) - for (k = 0; k < reds->num; ++k) - if (reds->lookahead_tokens[k]) - ++n_lookahead_tokens; + { + int j; + for (j = 0; j < reds->num; ++j) + if (reds->lookahead_tokens[j]) + ++n_lookahead_tokens; + } fprintf (out, "State %d: %d lookahead tokens\n", i, n_lookahead_tokens); if (reds->lookahead_tokens) - for (j = 0; j < reds->num; ++j) - BITSET_FOR_EACH (iter, reds->lookahead_tokens[j], k, 0) - { - fprintf (out, " on %d (%s) -> rule %d\n", - k, symbols[k]->tag, - reds->rules[j]->number); - }; + { + int j, k; + for (j = 0; j < reds->num; ++j) + BITSET_FOR_EACH (iter, reds->lookahead_tokens[j], k, 0) + fprintf (out, " on %d (%s) -> rule %d\n", + k, symbols[k]->tag, + reds->rules[j]->number); + } } fprintf (out, "Lookahead tokens: END\n"); } From 7b0ca050f7153f3d038243bf1182b23854996788 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 26 Nov 2013 15:31:33 +0100 Subject: [PATCH 33/43] news: YYERROR vs variants --- NEWS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NEWS b/NEWS index 29cfe727..98516886 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,12 @@ GNU Bison NEWS * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug fixes + +*** YYERROR and variants + + When C++ variant support is enabled, an error triggered via YYERROR, but + not caught via error recovery, resulted in a double deletion. * Noteworthy changes in release 3.0.1 (2013-11-12) [stable] From 21cf80399f199a565fc5cffe2cad734313ad4e8f Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 26 Nov 2013 15:24:53 +0100 Subject: [PATCH 34/43] reports: display %empty in the generated pointed-rules * src/print.c (print_core): Use %empty for empty rules. * src/print_graph.c (print_core): Ditto. * tests/conflicts.at, tests/output.at, tests/reduce.at: Adjust expectations. --- src/print.c | 7 +++++-- src/print_graph.c | 7 +++++-- tests/conflicts.at | 24 ++++++++++++------------ tests/output.at | 12 ++++++------ tests/reduce.at | 10 +++++----- 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/print.c b/src/print.c index 824bb4ae..53779def 100644 --- a/src/print.c +++ b/src/print.c @@ -106,8 +106,11 @@ print_core (FILE *out, state *s) for (sp = rules[r].rhs; sp < sp1; sp++) fprintf (out, " %s", symbols[*sp]->tag); fputs (" .", out); - for (/* Nothing */; *sp >= 0; ++sp) - fprintf (out, " %s", symbols[*sp]->tag); + if (0 <= *rules[r].rhs) + for (/* Nothing */; 0 <= *sp; ++sp) + fprintf (out, " %s", symbols[*sp]->tag); + else + fprintf (out, " %%empty"); /* Display the lookahead tokens? */ if (report_flag & report_lookahead_tokens diff --git a/src/print_graph.c b/src/print_graph.c index 7e429dbd..f15bc523 100644 --- a/src/print_graph.c +++ b/src/print_graph.c @@ -84,8 +84,11 @@ print_core (struct obstack *oout, state *s) obstack_1grow (oout, '.'); - for (/* Nothing */; *sp >= 0; ++sp) - obstack_printf (oout, " %s", escape (symbols[*sp]->tag)); + if (0 <= *r->rhs) + for (/* Nothing */; *sp >= 0; ++sp) + obstack_printf (oout, " %s", escape (symbols[*sp]->tag)); + else + obstack_printf (oout, " %%empty"); /* Experimental feature: display the lookahead tokens. */ if (report_flag & report_lookahead_tokens diff --git a/tests/conflicts.at b/tests/conflicts.at index bbb3f89d..1ba94bcd 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -1447,7 +1447,7 @@ State 0 0 $accept: . start $end 1 start: . resolved_conflict 'a' reported_conflicts 'a' 2 resolved_conflict: . 'a' unreachable1 - 3 | . ['a'] + 3 | . %empty ['a'] $default reduce using rule 3 (resolved_conflict) @@ -1483,7 +1483,7 @@ State 4 1 start: resolved_conflict 'a' . reported_conflicts 'a' 8 reported_conflicts: . 'a' 9 | . 'a' - 10 | . ['a'] + 10 | . %empty ['a'] 'a' shift, and go to state 5 @@ -1576,11 +1576,11 @@ AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, 6 | . empty_c1 'c' 7 | . empty_c2 'c' 8 | . empty_c3 'c' - 9 empty_a: . ['a'] - 10 empty_b: . [] - 11 empty_c1: . [] - 12 empty_c2: . [] - 13 empty_c3: . ['c'] + 9 empty_a: . %empty ['a'] + 10 empty_b: . %empty [] + 11 empty_c1: . %empty [] + 12 empty_c2: . %empty [] + 13 empty_c3: . %empty ['c'] 'b' shift, and go to state 1 @@ -1652,11 +1652,11 @@ AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0, 6 | . empty_c1 'c' 7 | . empty_c2 'c' 8 | . empty_c3 'c' - 9 empty_a: . [] - 10 empty_b: . [] - 11 empty_c1: . [] - 12 empty_c2: . ['c'] - 13 empty_c3: . ['c'] + 9 empty_a: . %empty [] + 10 empty_b: . %empty [] + 11 empty_c1: . %empty [] + 12 empty_c2: . %empty ['c'] + 13 empty_c3: . %empty ['c'] 'a' error (nonassociative) 'b' error (nonassociative) diff --git a/tests/output.at b/tests/output.at index 6c98ef7e..266a5032 100644 --- a/tests/output.at +++ b/tests/output.at @@ -290,7 +290,7 @@ a: ; b: 'b'; ]], [[ - 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a '?' b\l 2 a: .\l"] + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a '?' b\l 2 a: . %empty\l"] 0 -> 1 [style=dashed label="exp"] 0 -> 2 [style=dashed label="a"] 0 -> "0R2" [style=solid] @@ -332,7 +332,7 @@ empty_b: %prec 'b'; empty_c: %prec 'c'; ]], [[ - 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . ['b']\l 9 empty_c: . ['c']\l"] + 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . %empty ['a']\l 8 empty_b: . %empty ['b']\l 9 empty_c: . %empty ['c']\l"] 0 -> 1 [style=solid label="'a'"] 0 -> 2 [style=solid label="'b'"] 0 -> 3 [style=solid label="'c'"] @@ -399,7 +399,7 @@ empty_b: %prec 'b'; empty_c: %prec 'c'; ]], [[ - 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . []\l 9 empty_c: . []\l"] + 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . %empty ['a']\l 8 empty_b: . %empty []\l 9 empty_c: . %empty []\l"] 0 -> 1 [style=solid label="'b'"] 0 -> 2 [style=solid label="'c'"] 0 -> 3 [style=dashed label="start"] @@ -447,7 +447,7 @@ a: ; b: ; ]], [[ - 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a\l 2 | . b\l 3 a: . [$end]\l 4 b: . [$end]\l"] + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a\l 2 | . b\l 3 a: . %empty [$end]\l 4 b: . %empty [$end]\l"] 0 -> 1 [style=dashed label="exp"] 0 -> 2 [style=dashed label="a"] 0 -> 3 [style=dashed label="b"] @@ -480,7 +480,7 @@ b: ; c: ; ]], [[ - 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a ';'\l 2 | . a ';'\l 3 | . a '.'\l 4 | . b '?'\l 5 | . b '!'\l 6 | . c '?'\l 7 | . c ';'\l 8 a: . [';', '.']\l 9 b: . ['?', '!']\l 10 c: . [';', '?']\l"] + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a ';'\l 2 | . a ';'\l 3 | . a '.'\l 4 | . b '?'\l 5 | . b '!'\l 6 | . c '?'\l 7 | . c ';'\l 8 a: . %empty [';', '.']\l 9 b: . %empty ['?', '!']\l 10 c: . %empty [';', '?']\l"] 0 -> 1 [style=dashed label="exp"] 0 -> 2 [style=dashed label="a"] 0 -> 3 [style=dashed label="b"] @@ -595,7 +595,7 @@ imm: '0'; "11R7d" [label="R7", fillcolor=5, shape=diamond, style=filled] 11 -> "11R7" [style=solid] "11R7" [label="R7", fillcolor=3, shape=diamond, style=filled] - 12 [label="State 12\n\l 4 ifexp: \"if\" exp \"then\" exp . elseexp\l 5 elseexp: . \"else\" exp\l 6 | . [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"] + 12 [label="State 12\n\l 4 ifexp: \"if\" exp \"then\" exp . elseexp\l 5 elseexp: . \"else\" exp\l 6 | . %empty [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"] 12 -> 13 [style=solid label="\"else\""] 12 -> 9 [style=solid label="'+'"] 12 -> 14 [style=dashed label="elseexp"] diff --git a/tests/reduce.at b/tests/reduce.at index 7e4977a0..9da9f49b 100644 --- a/tests/reduce.at +++ b/tests/reduce.at @@ -1057,7 +1057,7 @@ State 12 4 A: 'a' 'a' . B 5 B: . 'a' - 6 | . ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[ + 6 | . %empty ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[ ]AT_COND_CASE([[canonical LR]], [['a']], [[$default]])[ reduce using rule 6 (B) @@ -1087,7 +1087,7 @@ State 15 4 A: 'a' 'a' . B 5 B: . 'a' - 6 | . [$end] + 6 | . %empty [$end] 7 c: 'a' 'a' . 'b' 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[20]], @@ -1150,7 +1150,7 @@ State 22]])[ 4 A: 'a' 'a' . B 5 B: . 'a' - 6 | . ['b'] + 6 | . %empty ['b'] 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[23]], [[16]])[ @@ -1575,8 +1575,8 @@ State 3 1 start: a . b 2 | a . b 'a' 3 | a . c 'b' - 5 b: . [$end, 'a'] - 6 c: . ['b']]AT_COND_CASE([[most]], [[ + 5 b: . %empty [$end, 'a'] + 6 c: . %empty ['b']]AT_COND_CASE([[most]], [[ 'b' reduce using rule 6 (c) $default reduce using rule 5 (b)]], [[ From f3d2a1b2ac717cd9faabd5106ff2bc366c49bd6a Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 26 Nov 2013 16:20:52 +0100 Subject: [PATCH 35/43] xml: also display %empty for empty right-hand sides * data/xslt/xml2dot.xsl, data/xslt/xml2text.xsl: Display %empty where needed. --- data/xslt/xml2dot.xsl | 6 +++++- data/xslt/xml2text.xsl | 7 +------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/data/xslt/xml2dot.xsl b/data/xslt/xml2dot.xsl index 93bec599..7b62d6e2 100644 --- a/data/xslt/xml2dot.xsl +++ b/data/xslt/xml2dot.xsl @@ -201,6 +201,8 @@ . + + @@ -214,7 +216,9 @@ - + + %empty + [ diff --git a/data/xslt/xml2text.xsl b/data/xslt/xml2text.xsl index 2626f566..4d34be16 100644 --- a/data/xslt/xml2text.xsl +++ b/data/xslt/xml2text.xsl @@ -350,12 +350,7 @@ . - - - - - - + . From d439985436e5a4a29930a24b9ceebe9dd9e71257 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 26 Nov 2013 16:20:55 +0100 Subject: [PATCH 36/43] style: formatting changes * src/print-xml.c: here. --- src/print-xml.c | 66 ++++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/print-xml.c b/src/print-xml.c index e5c25c54..2d86443a 100644 --- a/src/print-xml.c +++ b/src/print-xml.c @@ -65,40 +65,39 @@ print_core (FILE *out, int level, state *s) sitems = itemset; snritems = nitemset; - if (!snritems) { - xml_puts (out, level, ""); - return; - } + if (!snritems) + { + xml_puts (out, level, ""); + return; + } xml_puts (out, level, ""); for (i = 0; i < snritems; i++) { bool printed = false; - item_number *sp; - item_number *sp1; - rule_number r; + item_number *sp1 = ritem + sitems[i]; + item_number *sp = sp1; + rule *r; - sp1 = sp = ritem + sitems[i]; - - while (*sp >= 0) + while (0 <= *sp) sp++; - r = item_number_as_rule_number (*sp); - sp = rules[r].rhs; + r = &rules[item_number_as_rule_number (*sp)]; + sp = r->rhs; /* Display the lookahead tokens? */ if (item_number_is_rule_number (*sp1)) { reductions *reds = s->reductions; - int red = state_reduction_find (s, &rules[r]); + int red = state_reduction_find (s, r); /* Print item with lookaheads if there are. */ if (reds->lookahead_tokens && red != -1) { xml_printf (out, level + 1, "", - rules[r].number, sp1 - sp); - state_rule_lookahead_tokens_print_xml (s, &rules[r], + r->number, sp1 - sp); + state_rule_lookahead_tokens_print_xml (s, r, out, level + 2); xml_puts (out, level + 1, ""); printed = true; @@ -106,12 +105,10 @@ print_core (FILE *out, int level, state *s) } if (!printed) - { - xml_printf (out, level + 1, - "", - rules[r].number, - sp1 - sp); - } + xml_printf (out, level + 1, + "", + r->number, + sp1 - sp); } xml_puts (out, level, ""); } @@ -136,10 +133,11 @@ print_transitions (state *s, FILE *out, int level) } /* Nothing to report. */ - if (!n) { - xml_puts (out, level, ""); - return; - } + if (!n) + { + xml_puts (out, level, ""); + return; + } /* Report lookahead tokens and shifts. */ xml_puts (out, level, ""); @@ -190,10 +188,11 @@ print_errs (FILE *out, int level, state *s) count = true; /* Nothing to report. */ - if (!count) { - xml_puts (out, level, ""); - return; - } + if (!count) + { + xml_puts (out, level, ""); + return; + } /* Report lookahead tokens and errors. */ xml_puts (out, level, ""); @@ -287,10 +286,11 @@ print_reductions (FILE *out, int level, state *s) } /* Nothing to report. */ - if (!report) { - xml_puts (out, level, ""); - return; - } + if (!report) + { + xml_puts (out, level, ""); + return; + } xml_puts (out, level, ""); From be29c71dd8867cca0c1aab4cf3ef9d4d4d0cb7b6 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Tue, 26 Nov 2013 16:23:52 +0100 Subject: [PATCH 37/43] xml: also use "%empty" with html output * data/xslt/xml2xhtml.xsl: No longer issue an Epsilon, display as in dot and text formats. --- NEWS | 5 +++++ data/xslt/xml2xhtml.xsl | 9 ++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 98516886..1fa7d9b7 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,11 @@ GNU Bison NEWS ** Bug fixes +*** %empty is used in reports + + Empty right-hand sides are denoted by '%empty' in all the reports (text, + dot, XML and formats derived from it). + *** YYERROR and variants When C++ variant support is enabled, an error triggered via YYERROR, but diff --git a/data/xslt/xml2xhtml.xsl b/data/xslt/xml2xhtml.xsl index d2cfed4c..c7c56887 100644 --- a/data/xslt/xml2xhtml.xsl +++ b/data/xslt/xml2xhtml.xsl @@ -532,12 +532,7 @@ . - - - - - - + . @@ -563,7 +558,7 @@ - ε + %empty From 184b42c85be3d42c958173c550ea442baf96a8cd Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 4 Dec 2013 09:30:08 +0100 Subject: [PATCH 38/43] output: do not generate source files when early errors are caught Reported by Alexandre Duret-Lutz as "second problem" in: http://lists.gnu.org/archive/html/bug-bison/2013-09/msg00015.html One problem is that some errors are caught early, before the generation of output files, while others can only be detected afterwards (since, for instance, skeletons can raise errors themselves). This will be addressed in two steps: early errors do not generate source files at all, while later errors will remove the files that have already been generated. * src/scan-skel.l (yyout): Open to /dev/null when there are errors. * tests/output.at (AT_CHECK_FILES): Factored out of... (AT_CHECK_OUTPUT): this. Fuse the "SHELLIO" argument in the "FLAGS" one. Use $5 to denote the expected exit status. Add a test case for early errors. --- NEWS | 10 ++++++++++ src/scan-skel.l | 3 ++- tests/output.at | 35 +++++++++++++++++++++++------------ 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/NEWS b/NEWS index 1fa7d9b7..fdd92483 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,16 @@ GNU Bison NEWS ** Bug fixes +*** Generated source files when errors are reported + + When warnings are issued and -Werror is set, bison would still generate + the source files (*.c, *.h...). As a consequence, some runs of "make" + could fail the first time, but not the second (as the files were generated + anyway). + + This is fixed: bison no longer generates this source files, but, of + course, still produces the various reports (*.output, *.xml, etc.). + *** %empty is used in reports Empty right-hand sides are denoted by '%empty' in all the reports (text, diff --git a/src/scan-skel.l b/src/scan-skel.l index f13ee813..48c5e46a 100644 --- a/src/scan-skel.l +++ b/src/scan-skel.l @@ -245,7 +245,8 @@ at_output (int argc, char *argv[], char **out_namep, int *out_linenop) } *out_namep = xstrdup (argv[1]); output_file_name_check (out_namep); - yyout = xfopen (*out_namep, "w"); + /* If there were errors, do not generate the output. */ + yyout = xfopen (complaint_status ? "/dev/null" : *out_namep, "w"); *out_linenop = 1; } diff --git a/tests/output.at b/tests/output.at index 266a5032..66a3e5e9 100644 --- a/tests/output.at +++ b/tests/output.at @@ -17,12 +17,23 @@ AT_BANNER([[Output file names.]]) +# AT_CHECK_FILES(EXPECTED-FILES, [IGNORED-FILES]) +# ----------------------------------------------- +# Check that the current directory contains FILE... (sorted). +m4_define([AT_CHECK_FILES], +[AT_CHECK([[find . -type f | + $PERL -ne ' + s,\./,,; chomp; + push @file, $_ unless m{^($2|testsuite.log)$}; + END { print join (" ", sort @file), "\n" }']], + [], [$1 +])]) -# AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES, [SHELLIO], +# AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES, [STATUS], # [ADDITIONAL-TESTS], [PRE-TESTS]) # ----------------------------------------------------------------------------- m4_define([AT_CHECK_OUTPUT], -[AT_SETUP([[Output files: ]$2 $3 $5])[ +[AT_SETUP([[Output files: ]$2 $3])[ ]$7[ for file in ]$1 $4[; do case $file in @@ -35,15 +46,9 @@ done foo: {}; ]])[ -]AT_BISON_CHECK([$3 $1 $5], 0)[ +]AT_BISON_CHECK([$3 $1], [$5], [], [ignore])[ # Ignore the files non-generated files -]AT_CHECK([[find . -type f | - $PERL -ne ' - s,\./,,; chomp; - push @file, $_ unless m{^($1|testsuite.log)$}; - END { print join (" ", sort @file), "\n" }']], - [], [$4 -])[ +]AT_CHECK_FILES([$4], [$1])[ ]$6[ ]AT_CLEANUP[ ]]) @@ -54,9 +59,9 @@ AT_CHECK_OUTPUT([foo.y], [], [-dv], # Some versions of Valgrind (at least valgrind-3.6.0.SVN-Debian) report # "fgrep: write error: Bad file descriptor" when stdout is closed, so we # skip this test group during maintainer-check-valgrind. -AT_CHECK_OUTPUT([foo.y], [], [-dv], +AT_CHECK_OUTPUT([foo.y], [], [-dv >&-], [foo.output foo.tab.c foo.tab.h], - [>&-], [], + [], [], [AT_CHECK([[case "$PREBISON" in *valgrind*) exit 77;; esac]])]) AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c], @@ -114,6 +119,12 @@ AT_CHECK_OUTPUT([foo.yy], [], [-o foo.c++ --graph=foo.gph], [foo.c++ foo.gph]) +# Do not generate code when there are early errors (even warnings as +# errors). +AT_CHECK_OUTPUT([foo.y], [%type useless], + [--defines --graph --xml --report=all -Wall -Werror], + [foo.dot foo.output foo.xml], + [1]) ## ------------ ## ## C++ output. ## From ea99d6e6a02a06bd63e788393fd42cde5cb1fa71 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 4 Dec 2013 10:26:46 +0100 Subject: [PATCH 39/43] output: record what generated files are source or report files * src/files.h, src/files.c (output_file_name_check): Take an additional argument to record whether a file is a source or report file. * src/files.c (generated_file): New. (file_names, file_names_count): Replace with... (generated_files, generated_files_size): these. * src/scan-skel.l: Adjust. --- src/files.c | 40 +++++++++++++++++++++++++--------------- src/files.h | 7 ++++++- src/scan-skel.l | 2 +- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/files.c b/src/files.c index 76aa7fe3..46868365 100644 --- a/src/files.c +++ b/src/files.c @@ -51,8 +51,17 @@ char *spec_defines_file = NULL; /* for --defines. */ char *parser_file_name; /* All computed output file names. */ -static char **file_names = NULL; -static int file_names_count = 0; +typedef struct generated_file +{ + /** File name. */ + char *name; + /** Whether is a generated source file (e.g., *.c, *.java...), as + opposed to the report file (e.g., *.output). When late errors + are detected, generated source files are removed. */ + bool is_source; +} generated_file; +static generated_file *generated_files = NULL; +static int generated_files_size = 0; uniqstr grammar_file = NULL; uniqstr current_file = NULL; @@ -332,21 +341,21 @@ compute_output_file_names (void) { if (! spec_graph_file) spec_graph_file = concat2 (all_but_tab_ext, ".dot"); - output_file_name_check (&spec_graph_file); + output_file_name_check (&spec_graph_file, false); } if (xml_flag) { if (! spec_xml_file) spec_xml_file = concat2 (all_but_tab_ext, ".xml"); - output_file_name_check (&spec_xml_file); + output_file_name_check (&spec_xml_file, false); } if (report_flag) { if (!spec_verbose_file) spec_verbose_file = concat2 (all_but_tab_ext, OUTPUT_EXT); - output_file_name_check (&spec_verbose_file); + output_file_name_check (&spec_verbose_file, false); } free (all_but_tab_ext); @@ -355,7 +364,7 @@ compute_output_file_names (void) } void -output_file_name_check (char **file_name) +output_file_name_check (char **file_name, bool source) { bool conflict = false; if (STREQ (*file_name, grammar_file)) @@ -367,11 +376,11 @@ output_file_name_check (char **file_name) else { int i; - for (i = 0; i < file_names_count; i++) - if (STREQ (file_names[i], *file_name)) + for (i = 0; i < generated_files_size; i++) + if (STREQ (generated_files[i].name, *file_name)) { complain (NULL, Wother, _("conflicting outputs to file %s"), - quote (*file_name)); + quote (generated_files[i].name)); conflict = true; } } @@ -382,9 +391,10 @@ output_file_name_check (char **file_name) } else { - file_names = xnrealloc (file_names, ++file_names_count, - sizeof *file_names); - file_names[file_names_count-1] = xstrdup (*file_name); + generated_files = xnrealloc (generated_files, ++generated_files_size, + sizeof *generated_files); + generated_files[generated_files_size-1].name = xstrdup (*file_name); + generated_files[generated_files_size-1].is_source = source; } } @@ -400,8 +410,8 @@ output_file_names_free (void) free (dir_prefix); { int i; - for (i = 0; i < file_names_count; i++) - free (file_names[i]); + for (i = 0; i < generated_files_size; i++) + free (generated_files[i].name); } - free (file_names); + free (generated_files); } diff --git a/src/files.h b/src/files.h index ebe5037c..94833f71 100644 --- a/src/files.h +++ b/src/files.h @@ -63,7 +63,12 @@ extern char *all_but_ext; void compute_output_file_names (void); void output_file_names_free (void); -void output_file_name_check (char **file_name); + +/** Record that we generate file \a file_name. + * \param source whether this is a source file (*c, *.java...) + * as opposed to a report (*.output, *.dot...). + */ +void output_file_name_check (char **file_name, bool source); FILE *xfopen (const char *name, char const *mode); void xfclose (FILE *ptr); diff --git a/src/scan-skel.l b/src/scan-skel.l index 48c5e46a..129b8899 100644 --- a/src/scan-skel.l +++ b/src/scan-skel.l @@ -244,7 +244,7 @@ at_output (int argc, char *argv[], char **out_namep, int *out_linenop) xfclose (yyout); } *out_namep = xstrdup (argv[1]); - output_file_name_check (out_namep); + output_file_name_check (out_namep, true); /* If there were errors, do not generate the output. */ yyout = xfopen (complaint_status ? "/dev/null" : *out_namep, "w"); *out_linenop = 1; From 461983270c01b28cbb73424535408c8aded31573 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 4 Dec 2013 10:51:47 +0100 Subject: [PATCH 40/43] output: do not generate source files when late errors are caught Reported by Alexandre Duret-Lutz as "second problem" in: http://lists.gnu.org/archive/html/bug-bison/2013-09/msg00015.html * bootstrap.conf: We need the "unlink" module. * src/files.h, src/files.c (unlink_generated_sources): New. * src/output.c: Use it. * tests/output.at: Check the case of late errors. --- bootstrap.conf | 3 ++- src/files.c | 10 ++++++++++ src/files.h | 3 +++ src/output.c | 5 +++++ tests/output.at | 10 +++++++++- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/bootstrap.conf b/bootstrap.conf index c58470e2..186afa71 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -34,7 +34,8 @@ gnulib_modules=' readme-release realloc-posix spawn-pipe stdbool stpcpy strdup-posix strerror strtoul strverscmp - unistd unistd-safer unlocked-io update-copyright unsetenv verify + unistd unistd-safer unlink unlocked-io + update-copyright unsetenv verify warnings xalloc xalloc-die diff --git a/src/files.c b/src/files.c index 46868365..c50f774a 100644 --- a/src/files.c +++ b/src/files.c @@ -398,6 +398,16 @@ output_file_name_check (char **file_name, bool source) } } +void +unlink_generated_sources (void) +{ + int i; + for (i = 0; i < generated_files_size; i++) + if (generated_files[i].is_source) + /* Ignore errors. The file might not even exist. */ + unlink (generated_files[i].name); +} + void output_file_names_free (void) { diff --git a/src/files.h b/src/files.h index 94833f71..9b857190 100644 --- a/src/files.h +++ b/src/files.h @@ -70,6 +70,9 @@ void output_file_names_free (void); */ void output_file_name_check (char **file_name, bool source); +/** Remove all the generated source files. */ +void unlink_generated_sources (void); + FILE *xfopen (const char *name, char const *mode); void xfclose (FILE *ptr); FILE *xfdopen (int fd, char const *mode); diff --git a/src/output.c b/src/output.c index 5eafb2e3..ab1bdea1 100644 --- a/src/output.c +++ b/src/output.c @@ -704,6 +704,11 @@ output (void) /* Process the selected skeleton file. */ output_skeleton (); + /* If late errors were generated, destroy the generated source + files. */ + if (complaint_status) + unlink_generated_sources (); + obstack_free (&format_obstack, NULL); } diff --git a/tests/output.at b/tests/output.at index 66a3e5e9..be3078f8 100644 --- a/tests/output.at +++ b/tests/output.at @@ -43,7 +43,7 @@ done ]AT_DATA([$1], [$2[ %% -foo: {}; +foo: %empty {}; ]])[ ]AT_BISON_CHECK([$3 $1], [$5], [], [ignore])[ @@ -126,6 +126,14 @@ AT_CHECK_OUTPUT([foo.y], [%type useless], [foo.dot foo.output foo.xml], [1]) +# Do not generate code when there are late errors (even warnings as +# errors). +AT_CHECK_OUTPUT([foo.y], [%define useless], + [--defines --graph --xml --report=all -Wall -Werror], + [foo.dot foo.output foo.xml], + [1]) + + ## ------------ ## ## C++ output. ## ## ------------ ## From a4122000c6a46989617c68d7dec9451c50b632ee Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 5 Dec 2013 14:39:30 +0100 Subject: [PATCH 41/43] gnulib: update * gnulib: here. --- gnulib | 2 +- lib/.gitignore | 2 ++ m4/.gitignore | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gnulib b/gnulib index d208f3ab..74540d44 160000 --- a/gnulib +++ b/gnulib @@ -1 +1 @@ -Subproject commit d208f3ab64d5d5b70356ca61cc2d8d0373407a3c +Subproject commit 74540d44dc16bfd3546e39ae2d7262f32a4147ab diff --git a/lib/.gitignore b/lib/.gitignore index e021ab05..0197e833 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -272,3 +272,5 @@ /sig-handler.c /unistd.c /wctype-h.c +/lstat.c +/unlink.c diff --git a/m4/.gitignore b/m4/.gitignore index 5b7d3630..465d4d6c 100644 --- a/m4/.gitignore +++ b/m4/.gitignore @@ -180,3 +180,6 @@ /obstack-printf.m4 /extern-inline.m4 /non-recursive-gnulib-prefix-hack.m4 +/absolute-header.m4 +/lstat.m4 +/unlink.m4 From a3efd13e447e53a6174c100bc40acaaddea22da5 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 5 Dec 2013 14:58:22 +0100 Subject: [PATCH 42/43] version 3.0.2 * NEWS: Record release date. --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index fdd92483..64f4180e 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ GNU Bison NEWS -* Noteworthy changes in release ?.? (????-??-??) [?] +* Noteworthy changes in release 3.0.2 (2013-12-05) [stable] ** Bug fixes From 0bd5ee5f8919a74cd3f4b8da3f51da99193e1319 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 5 Dec 2013 15:16:28 +0100 Subject: [PATCH 43/43] maint: post-release administrivia * NEWS: Add header line for next release. * .prev-version: Record previous version. * cfg.mk (old_NEWS_hash): Auto-update. --- .prev-version | 2 +- NEWS | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.prev-version b/.prev-version index cb2b00e4..b5021469 100644 --- a/.prev-version +++ b/.prev-version @@ -1 +1 @@ -3.0.1 +3.0.2 diff --git a/NEWS b/NEWS index 64f4180e..39322da8 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,8 @@ GNU Bison NEWS +* Noteworthy changes in release ?.? (????-??-??) [?] + + * Noteworthy changes in release 3.0.2 (2013-12-05) [stable] ** Bug fixes