Merge remote-tracking branch 'origin/maint'
authorTheophile Ranquet <ranquet@lrde.epita.fr>
Mon, 10 Dec 2012 16:01:55 +0000 (17:01 +0100)
committerTheophile Ranquet <ranquet@lrde.epita.fr>
Mon, 10 Dec 2012 16:01:55 +0000 (17:01 +0100)
* origin/maint:
  news: prepare for forthcoming release
  doc: explain how mid-rule actions are translated
  error: use better locations for unused midrule values
  doc: various minor improvements and fixes
  tests: ignore more useless compiler warnings
  tests: be robust to C being compiled with a C++11 compiler
  build: beware of Clang++ not supporting POSIXLY_CORRECT
  maint: post-release administrivia
  version 2.6.90
  build: fix syntax-check error.
  cpp: simplify the Flex version checking macro
  news: improve the carets example and fix a typo
  cpp: improve the Flex version checking macro
  carets: improve the code
  maint: update news
  build: keep -Wmissing-declarations and -Wmissing-prototypes for modern GCCs
  build: drop -Wcast-qual
  gnulib: update

Conflicts:
NEWS
doc/Makefile.am
doc/bison.texi
gnulib
src/reader.c
tests/actions.at
tests/atlocal.in
tests/input.at

14 files changed:
1  2 
NEWS
cfg.mk
configure.ac
doc/bison.texi
m4/c-working.m4
m4/cxx.m4
src/flex-scanner.h
src/location.c
src/reader.c
tests/actions.at
tests/atlocal.in
tests/glr-regression.at
tests/input.at
tests/local.at

diff --cc NEWS
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -2,295 -2,66 +2,311 @@@ GNU Bison NEW
  
  * Noteworthy changes in release ?.? (????-??-??) [?]
  
- ** New format for error reports: carets
 +** Incompatible changes
 +
 +*** Obsolete features
 +
 +  Support for YYFAIL is removed (deprecated in Bison 2.4.2).
 +  Support for yystype and yyltype (instead of YYSTYPE and YYLTYPE)
 +  is removed (deprecated in Bison 1.875).
 +  Support for YYPARSE_PARAM is removed (deprecated in Bison 1.875).
 +
 +** Warnings
 +
 +*** Enhancements of the -Werror option
 +
 +  The -Werror=CATEGORY option is now recognized, and will treat specified
 +  warnings as errors. The warnings need not have been explicitly activated
 +  using the -W option, this is similar to what GCC 4.7 does.
 +
 +  For example, given the following command line, Bison will treat both
 +  warnings related to POSIX Yacc incompatibilities and S/R conflicts as
 +  errors (and only those):
 +
 +    $ bison -Werror=yacc,error=conflicts-sr input.y
 +
 +  If no categories are specified, -Werror will make all active warnings into
 +  errors. For example, the following line does the same the previous example:
 +
 +    $ bison -Werror -Wnone -Wyacc -Wconflicts-sr input.y
 +
 +  (By default -Wconflicts-sr,conflicts-rr,deprecated,other is enabled.)
 +
 +  Note that the categories in this -Werror option may not be prefixed with
 +  "no-". However, -Wno-error[=CATEGORY] is valid.
 +
 +  Note that -y enables -Werror=yacc. Therefore it is now possible to require
 +  Yacc-like behavior (e.g., always generate y.tab.c), but to report
 +  incompatibilities as warnings: "-y -Wno-error=yacc".
 +
 +*** The display of warnings is now richer
 +
 +  The option that controls a given warning is now displayed:
 +
 +    foo.y:4.6: warning: type clash on default action: <foo> != <bar> [-Wother]
 +
 +  In the case of warnings treated as errors, the prefix is changed from
 +  "warning: " to "error: ", and the suffix is displayed, in a manner similar
 +  to GCC, as [-Werror=CATEGORY].
 +
 +  For instance, where the previous version of Bison would report (and exit
 +  with failure):
 +
 +    bison: warnings being treated as errors
 +    input.y:1.1: warning: stray ',' treated as white space
 +
 +  it now reports:
 +
 +    input.y:1.1: error: stray ',' treated as white space [-Werror=other]
 +
 +*** Deprecated constructs
 +
 +  The new 'deprecated' warning category flags obsolete constructs whose
 +  support will be discontinued.  It is enabled by default.  These warnings
 +  used to be reported as 'other' warnings.
 +
 +*** Useless semantic types
 +
 +  Bison now warns about useless (uninhabited) semantic types.  Since
 +  semantic types are not declared to Bison (they are defined in the opaque
 +  %union structure), it is %printer/%destructor directives about useless
 +  types that trigger the warning:
 +
 +    %token <type1> term
 +    %type  <type2> nterm
 +    %printer    {} <type1> <type3>
 +    %destructor {} <type2> <type4>
 +    %%
 +    nterm: term { $$ = $1; };
 +
 +    3.28-34: warning: type <type3> is used, but is not associated to any symbol
 +    4.28-34: warning: type <type4> is used, but is not associated to any symbol
 +
 +*** Undefined but unused symbols
 +
 +  Bison used to raise an error for undefined symbols that are not used in
 +  the grammar.  This is now only a warning.
 +
 +    %printer    {} symbol1
 +    %destructor {} symbol2
 +    %type <type>   symbol3
 +    %%
 +    exp: "a";
 +
 +*** Useless destructors or printers
 +
 +  Bison now warns about useless destructors or printers.  In the following
 +  example, the printer for <type1>, and the destructor for <type2> are
 +  useless: all symbols of <type1> (token1) already have a printer, and all
 +  symbols of type <type2> (token2) already have a destructor.
 +
 +    %token <type1> token1
 +           <type2> token2
 +           <type3> token3
 +           <type4> token4
 +    %printer    {} token1 <type1> <type3>
 +    %destructor {} token2 <type2> <type4>
 +
 +*** Conflicts
 +
 +  The warnings and error messages about shift/reduce and reduce/reduce
 +  conflicts have been normalized.  For instance on the following foo.y file:
 +
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  compare the previous version of bison:
 +
 +    $ bison foo.y
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    $ bison -Werror foo.y
 +    bison: warnings being treated as errors
 +    foo.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +
 +  with the new behavior:
 +
 +    $ bison foo.y
 +    foo.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
 +    foo.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]
 +    $ bison -Werror foo.y
 +    foo.y: error: 1 shift/reduce conflict [-Werror=conflicts-sr]
 +    foo.y: error: 2 reduce/reduce conflicts [-Werror=conflicts-rr]
 +
 +  When %expect or %expect-rr is used, such as with bar.y:
 +
 +    %expect 0
 +    %glr-parser
 +    %%
 +    exp: exp '+' exp | '0' | '0';
 +
 +  Former behavior:
 +
 +    $ bison bar.y
 +    bar.y: conflicts: 1 shift/reduce, 2 reduce/reduce
 +    bar.y: expected 0 shift/reduce conflicts
 +    bar.y: expected 0 reduce/reduce conflicts
 +
 +  New one:
 +
 +    $ bison bar.y
 +    bar.y: error: shift/reduce conflicts: 1 found, 0 expected
 +    bar.y: error: reduce/reduce conflicts: 2 found, 0 expected
 +
 +** Additional yylex/yyparse arguments
 +
 +  The new directive %param declares additional arguments to both yylex and
 +  yyparse.  The %lex-param, %parse-param, and %param directives support one
 +  or more arguments.  Instead of
 +
 +    %lex-param   {arg1_type *arg1}
 +    %lex-param   {arg2_type *arg2}
 +    %parse-param {arg1_type *arg1}
 +    %parse-param {arg2_type *arg2}
 +
 +  one may now declare
 +
 +    %param {arg1_type *arg1} {arg2_type *arg2}
 +
 +** Java skeleton improvements
 +
 +  The constants for token names were moved to the Lexer interface.  Also, it
 +  is possible to add code to the parser's constructors using "%code init"
 +  and "%define init_throws".
 +
 +** C++ skeletons improvements
 +
 +*** The parser header is no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Using %defines is now optional.  Without it, the needed support classes
 +  are defined in the generated parser, instead of additional files (such as
 +  location.hh, position.hh and stack.hh).
 +
 +*** Locations are no longer mandatory (lalr1.cc, glr.cc)
 +
 +  Both lalr1.cc and glr.cc no longer require %location.
 +
 +*** syntax_error exception (lalr1.cc)
 +
 +  The C++ parser features a syntax_error exception, which can be
 +  thrown from the scanner or from user rules to raise syntax errors.
 +  This facilitates reporting errors caught in sub-functions (e.g.,
 +  rejecting too large integral literals from a conversion function
 +  used by the scanner, or rejecting invalid combinations from a
 +  factory invoked by the user actions).
 +
 +** Variable api.token.prefix
 +
 +  The variable api.token.prefix changes the way tokens are identified in
 +  the generated files.  This is especially useful to avoid collisions
 +  with identifiers in the target language.  For instance
 +
 +    %token FILE for ERROR
 +    %define api.token.prefix "TOK_"
 +    %%
 +    start: FILE for ERROR;
 +
 +  will generate the definition of the symbols TOK_FILE, TOK_for, and
 +  TOK_ERROR in the generated sources.  In particular, the scanner must
 +  use these prefixed token names, although the grammar itself still
 +  uses the short names (as in the sample rule given above).
 +
 +** Renamed %define variables
 +
 +  The following variables have been renamed for consistency.  Backward
 +  compatibility is ensured, but upgrading is recommended.
 +
 +    lr.default-reductions      -> lr.default-reduction
 +    lr.keep-unreachable-states -> lr.keep-unreachable-state
 +    namespace                  -> api.namespace
 +
 +** Variable parse.error
 +
 +  This variable controls the verbosity of error messages.  The use of the
 +  %error-verbose directive is deprecated in favor of "%define parse.error
 +  verbose".
 +
 +** Semantic predicates
 +
 +  The new, experimental, semantic-predicate feature allows actions of the
 +  form "%?{ BOOLEAN-EXPRESSION }", which cause syntax errors (as for
 +  YYERROR) if the expression evaluates to 0, and are evaluated immediately
 +  in GLR parsers, rather than being deferred.  The result is that they allow
 +  the programmer to prune possible parses based on the values of run-time
 +  expressions.
 +
 +** The directive %expect-rr is now an error in non GLR mode
 +
 +  It used to be an error only if used in non GLR mode, _and_ if there are
 +  reduce/reduce conflicts.
 +
 +* Noteworthy changes in release ?.? (????-??-??) [?]
 +
 +** %language is no longer an experimental feature.
 +
 +  The introduction of this feature, in 2.4, was four years ago. The --language
 +  option and the %language directive are no longer experimental.
 +
+ ** Bug fixes
  
-   Caret errors have been added to Bison, for example (taken from the
-   documentation):
+   Warnings about uninitialized yylloc in yyparse have been fixed.
  
-     input.y:3.20-23: error: ambiguous reference: '$exp'
-      exp: exp '+' exp { $exp = $1 + $2; };
-                         ^^^^
+ ** Diagnostics are improved
  
-   The default behaviour for now is still not to display these unless explictly
-   asked with -fall of -fcaret. However, in a later release, it will be made the
-   default behavior (but may still be deactivated with -fno-caret).
+ *** Changes in the format of error messages
  
- ** New value for %define variable: api.pure full
+   This used to be the format of many error reports:
  
-   The %define variable api.pure requests a pure (reentrant) parser. However,
-   for historical reasons, using it in a location-tracking Yacc parser resulted
-   in an yyerror function that did not take a location as a parameter. With this
-   new value, the user may request a better pure parser, where yyerror does take
-   a location as a parameter (in location-tracking parsers).
+     input.y:2.7-12: %type redeclaration for exp
+     input.y:1.7-12: previous declaration
  
-   The use of "%define api.pure true" is deprecated in favor of this new
-   "%define api.pure full".
+   It is now:
  
- ** Changes in the format of error messages
+     input.y:2.7-12: error: %type redeclaration for exp
+     input.y:1.7-12:     previous declaration
  
-   This used to be the format of many error reports:
+ *** New format for error reports: carets
  
-     foo.y:5.10-24: result type clash on merge function 'merge': <t3> != <t2>
-     foo.y:4.13-27: previous declaration
+   Caret errors have been added to Bison:
  
-   It is now:
+     input.y:2.7-12: error: %type redeclaration for exp
+      %type <sval> exp
+            ^^^^^^
+     input.y:1.7-12:     previous declaration
+      %type <ival> exp
+            ^^^^^^
  
-     foo.y:5.10-25: result type clash on merge function 'merge': <t3> != <t2>
-     foo.y:4.13-27:     previous declaration
+   or
  
- ** Exception safety (lalr1.cc)
+     input.y:3.20-23: error: ambiguous reference: '$exp'
+      exp: exp '+' exp { $exp = $1 + $3; };
+                         ^^^^
+     input.y:3.1-3:       refers to: $exp at $$
+      exp: exp '+' exp { $exp = $1 + $3; };
+      ^^^
+     input.y:3.6-8:       refers to: $exp at $1
+      exp: exp '+' exp { $exp = $1 + $3; };
+           ^^^
+     input.y:3.14-16:     refers to: $exp at $3
+      exp: exp '+' exp { $exp = $1 + $3; };
+                   ^^^
+   The default behaviour for now is still not to display these unless
+   explictly asked with -fcaret (or -fall). However, in a later release, it
+   will be made the default behavior (but may still be deactivated with
+   -fno-caret).
  
-   The parse function now catches exceptions, uses the %destructors to
-   release memory (the lookahead symbol and the symbols pushed on the stack)
-   before re-throwing the exception.
+ ** New value for %define variable: api.pure full
  
-   This feature is somewhat experimental.  User feedback would be
-   appreciated.
+   The %define variable api.pure requests a pure (reentrant) parser. However,
+   for historical reasons, using it in a location-tracking Yacc parser
+   resulted in a yyerror function that did not take a location as a
+   parameter. With this new value, the user may request a better pure parser,
+   where yyerror does take a location as a parameter (in location-tracking
+   parsers).
+   The use of "%define api.pure true" is deprecated in favor of this new
+   "%define api.pure full".
  
  ** New %define variable: api.location.type (glr.cc, lalr1.cc, lalr1.java)
  
diff --cc cfg.mk
--- 1/cfg.mk
--- 2/cfg.mk
+++ b/cfg.mk
@@@ -77,10 -83,11 +77,11 @@@ $(call exclude,                                                            
    prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$    \
    prohibit_always-defined_macros+=?|^tests/regression.at$$            \
    prohibit_defined_have_decl_tests=?|^lib/timevar.c$$                 \
+   prohibit_doubled_word=^tests/named-refs.at$$                          \
    prohibit_magic_number_exit=^doc/bison.texi$$                                \
    prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$    \
 +  prohibit_strcmp=^doc/bison\.texi$$                                  \
    require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$          \
    space_tab=^tests/(input|c\+\+)\.at$$                                        \
 -  trailing_blank=^src/parse-gram.[ch]$$                                       \
    unmarked_diagnostics=^(djgpp/|doc/bison.texi$$|tests/c\+\+\.at$$)   \
  )
diff --cc configure.ac
@@@ -69,11 -81,9 +83,10 @@@ AC_ARG_ENABLE([gcc-warnings]
                [enable_gcc_warnings=no])
  if test "$enable_gcc_warnings" = yes; then
    warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align
-     -Wcast-qual -Wformat -Wpointer-arith -Wwrite-strings'
-   warn_c='-Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes
-     -Wshadow -Wstrict-prototypes'
+     -Wformat -Wpointer-arith -Wwrite-strings'
+   warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes'
    warn_cxx='-Wnoexcept'
 +
    AC_LANG_PUSH([C])
    # Clang supports many of GCC's -W options, but only issues warnings
    # on the ones it does not recognize.  In that case, gl_WARN_ADD
diff --cc doc/bison.texi
@@@ -12088,21 -11558,9 +12234,22 @@@ the grammar file.  @xref{Grammar Outlin
  Grammar}.
  @end deffn
  
- @deffn {Construct} /*@dots{}*/
- Comment delimiters, as in C.
 +@deffn {Directive} %?@{@var{expression}@}
 +Predicate actions.  This is a type of action clause that may appear in
 +rules. The expression is evaluated, and if false, causes a syntax error.  In
 +GLR parsers during nondeterministic operation,
 +this silently causes an alternative parse to die.  During deterministic
 +operation, it is the same as the effect of YYERROR.
 +@xref{Semantic Predicates}.
 +
 +This feature is experimental.
 +More user feedback will help to determine whether it should become a permanent
 +feature.
 +@end deffn
 +
+ @deffn {Construct} /* @dots{} */
+ @deffnx {Construct} // @dots{}
+ Comments, as in C/C++.
  @end deffn
  
  @deffn {Delimiter} :
diff --cc m4/c-working.m4
@@@ -21,9 -21,10 +21,10 @@@ AC_DEFUN([BISON_TEST_FOR_WORKING_C_COMP
    AC_COMPILE_IFELSE(
      [AC_LANG_PROGRAM(
         [[#include <limits.h>
 -       int test_array[CHAR_BIT];]])],
 +         int test_array[CHAR_BIT];]])],
      [],
      [AC_MSG_FAILURE([cannot compile a simple C program])])
+    AC_SUBST([BISON_C_WORKS], [:])
  ])
  
  # BISON_CHECK_WITH_POSIXLY_CORRECT(CODE)
diff --cc m4/cxx.m4
Simple merge
Simple merge
diff --cc src/location.c
Simple merge
diff --cc src/reader.c
@@@ -324,11 -322,12 +324,11 @@@ grammar_rule_check (const symbol_list *
              /* The default action, $$ = $1, `uses' both.  */
              && (r->action_props.code || (n != 0 && n != 1)))
            {
 -            void (*warn_at_ptr)(location, char const*, ...) =
 -              midrule_warning ? midrule_value_at : warn_at;
 +            warnings warn_flag = midrule_warning ? Wmidrule_values : Wother;
              if (n)
-               complain (&r->location, warn_flag, _("unused value: $%d"), n);
 -              warn_at_ptr (l->location, _("unused value: $%d"), n);
++              complain (&l->location, warn_flag, _("unused value: $%d"), n);
              else
-               complain (&r->location, warn_flag, _("unset value: $$"));
 -              warn_at_ptr (l->location, _("unset value: $$"));
++              complain (&l->location, warn_flag, _("unset value: $$"));
            }
        }
    }
@@@ -1323,25 -1300,17 +1323,25 @@@ main (void
  AT_BISON_OPTION_POPDEFS
  
  AT_BISON_CHECK([-o input.c input.y], 0,,
 -[[input.y:33.3-23: warning: unset value: $$
 -input.y:32.3-23: warning: unused value: $3
 +[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother]
 +input.y:24.70-72: warning: useless %printer for type <*> [-Wother]
 +input.y:33.3-23: warning: unset value: $$ [-Wother]
- input.y:30.3-35.37: warning: unused value: $3 [-Wother]
++input.y:32.3-23: warning: unused value: $3 [-Wother]
  ]])
  
  AT_BISON_CHECK([-fcaret -o input.c input.y], 0,,
 -[[input.y:33.3-23: warning: unset value: $$
 +[[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother]
 + %printer { fprintf (yyoutput, "<*> printer should not be called"); } <*>
 +                                                                      ^^^
 +input.y:24.70-72: warning: useless %printer for type <*> [-Wother]
 + %printer { fprintf (yyoutput, "<*> printer should not be called"); } <*>
 +                                                                      ^^^
 +input.y:33.3-23: warning: unset value: $$ [-Wother]
     {           @$ = 4; } // Only used.
     ^^^^^^^^^^^^^^^^^^^^^
- input.y:30.3-35.37: warning: unused value: $3 [-Wother]
-    {           @$ = 1; } // Not set or used.
-    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:32.3-23: warning: unused value: $3
++input.y:32.3-23: warning: unused value: $3 [-Wother]
+    { USE ($$); @$ = 3; } // Only set.
+    ^^^^^^^^^^^^^^^^^^^^^
  ]])
  
  AT_COMPILE([input])
@@@ -38,12 -47,21 +47,23 @@@ NO_WERROR_CXXFLAGS='@CXXFLAGS@ @WARN_CX
    CFLAGS="$NO_WERROR_CFLAGS   @WERROR_CFLAGS@"
  CXXFLAGS="$NO_WERROR_CXXFLAGS @WERROR_CXXFLAGS@"
  
 -# If 'exit 77'; skip all C/C++ tests; otherwise ':'.
 -BISON_C_WORKS='@BISON_C_WORKS@'
 +# C++ variants break strict aliasing analysis.
 +NO_STRICT_ALIAS_CXXFLAGS='@NO_STRICT_ALIAS_CXXFLAGS@'
 +
 +# If 'exit 77'; skip all C++ tests; otherwise ':'.
  BISON_CXX_WORKS='@BISON_CXX_WORKS@'
  
+ # Whether the compiler supports POSIXLY_CORRECT defined.
+ : ${C_COMPILER_POSIXLY_CORRECT='@C_COMPILER_POSIXLY_CORRECT@'}
+ : ${CXX_COMPILER_POSIXLY_CORRECT='@CXX_COMPILER_POSIXLY_CORRECT@'}
+ if $POSIXLY_CORRECT_IS_EXPORTED; then
+   $C_COMPILER_POSIXLY_CORRECT ||
+     BISON_C_WORKS="as_fn_error 77 POSIXLY_CORRECT"
+   $CXX_COMPILER_POSIXLY_CORRECT ||
+     BISON_CXX_WORKS="as_fn_error 77 POSIXLY_CORRECT"
+ fi
  # Handle --compile-c-with-cxx here, once CXX and CXXFLAGS are known.
  if "$at_arg_compile_c_with_cxx"; then
    CC_IS_CXX=1
Simple merge
diff --cc tests/input.at
@@@ -169,42 -174,109 +169,109 @@@ l: INT | INT { $<integer>$ = $<integer>
  _AT_UNUSED_VALUES_DECLARATIONS])
  )
  
- AT_BISON_CHECK(m4_ifval($2, [ --warnings=midrule-values ])[ input.y], [0], [],
- [[input.y:11.10-32: warning: unset value: $]$[ [-Wother]
- input.y:11.10-32: warning: unused value: $]1[ [-Wother]
- input.y:11.10-32: warning: unused value: $]3[ [-Wother]
- input.y:11.10-32: warning: unused value: $]5[ [-Wother]
+ AT_BISON_CHECK(m4_ifval($2, [--warnings=midrule-values ])[-fcaret input.y],
+                [0], [],
 -[[input.y:11.10-32: warning: unset value: $][$
++[[input.y:11.10-32: warning: unset value: $][$ [-Wother]
+  a: INT | INT { } INT { } INT { };
+           ^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:11.10-12: warning: unused value: $][1
++input.y:11.10-12: warning: unused value: $][1 [-Wother]
+  a: INT | INT { } INT { } INT { };
+           ^^^
 -input.y:11.18-20: warning: unused value: $][3
++input.y:11.18-20: warning: unused value: $][3 [-Wother]
+  a: INT | INT { } INT { } INT { };
+                   ^^^
 -input.y:11.26-28: warning: unused value: $][5
++input.y:11.26-28: warning: unused value: $][5 [-Wother]
+  a: INT | INT { } INT { } INT { };
+                           ^^^
 -input.y:12.9: warning: empty rule for typed nonterminal, and no action
 +input.y:12.9: warning: empty rule for typed nonterminal, and no action [-Wother]
- ]]m4_ifval($2, [[[input.y:13.14-20: warning: unset value: $$ [-Wmidrule-values]
- input.y:13.26-41: warning: unset value: $$ [-Wmidrule-values]
- ]]])[[input.y:13.10-62: warning: unset value: $]$[ [-Wother]
- input.y:13.10-62: warning: unused value: $]3[ [-Wother]
- input.y:13.10-62: warning: unused value: $]5[ [-Wother]
- ]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $$ [-Wmidrule-values]
- ]]])[[input.y:14.10-49: warning: unset value: $]$[ [-Wother]
- input.y:14.10-49: warning: unused value: $]3[ [-Wother]
- input.y:14.10-49: warning: unused value: $]5[ [-Wother]
- input.y:15.10-37: warning: unset value: $]$[ [-Wother]
- input.y:15.10-37: warning: unused value: $]3[ [-Wother]
- input.y:15.10-37: warning: unused value: $]5[ [-Wother]
- input.y:17.10-58: warning: unset value: $]$[ [-Wother]
- input.y:17.10-58: warning: unused value: $]1[ [-Wother]
- ]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]2[ [-Wmidrule-values]
- ]]])[[input.y:17.10-58: warning: unused value: $]3[ [-Wother]
- ]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]4[ [-Wmidrule-values]
- ]]])[[input.y:17.10-58: warning: unused value: $]5[ [-Wother]
- input.y:18.10-72: warning: unset value: $]$[ [-Wother]
- input.y:18.10-72: warning: unused value: $]1[ [-Wother]
- input.y:18.10-72: warning: unused value: $]3[ [-Wother]
- ]]m4_ifval($2, [[[input.y:18.10-72: warning: unused value: $]4[ [-Wmidrule-values]
- ]]])[[input.y:18.10-72: warning: unused value: $]5[ [-Wother]
- ]]m4_ifval($2, [[[input.y:20.10-55: warning: unused value: $]3[ [-Wmidrule-values]
- ]]])[[input.y:21.10-68: warning: unset value: $]$[ [-Wother]
- input.y:21.10-68: warning: unused value: $]1[ [-Wother]
- input.y:21.10-68: warning: unused value: $]2[ [-Wother]
- ]]m4_ifval($2, [[[input.y:21.10-68: warning: unused value: $]4[ [-Wmidrule-values]
- ]]]))])
+  b: INT | /* empty */;
+          ^
 -]]m4_ifval($2, [[[input.y:13.14-20: warning: unset value: $][$
++]]m4_ifval($2, [[[input.y:13.14-20: warning: unset value: $][$ [-Wmidrule-values]
+  c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
+               ^^^^^^^
 -input.y:13.26-41: warning: unset value: $][$
++input.y:13.26-41: warning: unset value: $][$ [-Wmidrule-values]
+  c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
+                           ^^^^^^^^^^^^^^^^
 -]]])[[input.y:13.10-62: warning: unset value: $][$
++]]])[[input.y:13.10-62: warning: unset value: $][$ [-Wother]
+  c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
+           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:13.22-24: warning: unused value: $][3
++input.y:13.22-24: warning: unused value: $][3 [-Wother]
+  c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
+                       ^^^
 -input.y:13.43-45: warning: unused value: $][5
++input.y:13.43-45: warning: unused value: $][5 [-Wother]
+  c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
+                                            ^^^
 -]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $][$
++]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $][$ [-Wmidrule-values]
+  d: INT | INT { } INT { $][1; } INT { $<integer>2; };
+               ^^^
 -]]])[[input.y:14.10-49: warning: unset value: $][$
++]]])[[input.y:14.10-49: warning: unset value: $][$ [-Wother]
+  d: INT | INT { } INT { $][1; } INT { $<integer>2; };
+           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:14.18-20: warning: unused value: $][3
++input.y:14.18-20: warning: unused value: $][3 [-Wother]
+  d: INT | INT { } INT { $][1; } INT { $<integer>2; };
+                   ^^^
 -input.y:14.30-32: warning: unused value: $][5
++input.y:14.30-32: warning: unused value: $][5 [-Wother]
+  d: INT | INT { } INT { $][1; } INT { $<integer>2; };
+                               ^^^
 -input.y:15.10-37: warning: unset value: $][$
++input.y:15.10-37: warning: unset value: $][$ [-Wother]
+  e: INT | INT { } INT {  } INT { $][1; };
+           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:15.18-20: warning: unused value: $][3
++input.y:15.18-20: warning: unused value: $][3 [-Wother]
+  e: INT | INT { } INT {  } INT { $][1; };
+                   ^^^
 -input.y:15.27-29: warning: unused value: $][5
++input.y:15.27-29: warning: unused value: $][5 [-Wother]
+  e: INT | INT { } INT {  } INT { $][1; };
+                            ^^^
 -input.y:17.10-58: warning: unset value: $][$
++input.y:17.10-58: warning: unset value: $][$ [-Wother]
+  g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
+           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:17.10-12: warning: unused value: $][1
++input.y:17.10-12: warning: unused value: $][1 [-Wother]
+  g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
+           ^^^
 -]]m4_ifval($2, [[[input.y:17.14-29: warning: unused value: $][2
++]]m4_ifval($2, [[[input.y:17.14-29: warning: unused value: $][2 [-Wmidrule-values]
+  g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
+               ^^^^^^^^^^^^^^^^
 -]]])[[input.y:17.31-33: warning: unused value: $][3
++]]])[[input.y:17.31-33: warning: unused value: $][3 [-Wother]
+  g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
+                                ^^^
 -]]m4_ifval($2, [[[input.y:17.35-50: warning: unused value: $][4
++]]m4_ifval($2, [[[input.y:17.35-50: warning: unused value: $][4 [-Wmidrule-values]
+  g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
+                                    ^^^^^^^^^^^^^^^^
 -]]])[[input.y:17.52-54: warning: unused value: $][5
++]]])[[input.y:17.52-54: warning: unused value: $][5 [-Wother]
+  g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
+                                                     ^^^
 -input.y:18.10-72: warning: unset value: $][$
++input.y:18.10-72: warning: unset value: $][$ [-Wother]
+  h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
+           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:18.10-12: warning: unused value: $][1
++input.y:18.10-12: warning: unused value: $][1 [-Wother]
+  h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
+           ^^^
 -input.y:18.31-33: warning: unused value: $][3
++input.y:18.31-33: warning: unused value: $][3 [-Wother]
+  h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
+                                ^^^
 -]]m4_ifval($2, [[[input.y:18.35-64: warning: unused value: $][4
++]]m4_ifval($2, [[[input.y:18.35-64: warning: unused value: $][4 [-Wmidrule-values]
+  h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
+                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -]]])[[input.y:18.66-68: warning: unused value: $][5
++]]])[[input.y:18.66-68: warning: unused value: $][5 [-Wother]
+  h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
+                                                                   ^^^
 -]]m4_ifval($2, [[[input.y:20.18-37: warning: unused value: $][3
++]]m4_ifval($2, [[[input.y:20.18-37: warning: unused value: $][3 [-Wmidrule-values]
+  j: INT | INT INT { $<integer>$ = 1; } { $][$ = $][1 + $][2; };
+                   ^^^^^^^^^^^^^^^^^^^^
 -]]])[[input.y:21.10-68: warning: unset value: $][$
++]]])[[input.y:21.10-68: warning: unset value: $][$ [-Wother]
+  k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
+           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 -input.y:21.10-12: warning: unused value: $][1
++input.y:21.10-12: warning: unused value: $][1 [-Wother]
+  k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
+           ^^^
 -input.y:21.14-16: warning: unused value: $][2
++input.y:21.14-16: warning: unused value: $][2 [-Wother]
+  k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
+               ^^^
 -]]m4_ifval($2, [[[input.y:21.35-64: warning: unused value: $][4
++]]m4_ifval($2, [[[input.y:21.35-64: warning: unused value: $][4 [-Wmidrule-values]
+  k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
+                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ ]]]))
+ ])
  
  ## --------------- ##
  ## Unused values.  ##
@@@ -464,9 -419,9 +531,9 @@@ tagged: { } 
  ]])
  
  AT_BISON_CHECK([input.y], [0], [],
 -[[input.y:6.8-45: warning: unset value: $$
 -input.y:6.12-14: warning: unused value: $2
 -input.y:7.6-8: warning: unset value: $$
 +[[input.y:6.8-45: warning: unset value: $$ [-Wother]
- input.y:6.8-45: warning: unused value: $2 [-Wother]
++input.y:6.12-14: warning: unused value: $2 [-Wother]
 +input.y:7.6-8: warning: unset value: $$ [-Wother]
  ]])
  
  AT_DATA([[input.y]],
@@@ -481,8 -436,8 +548,8 @@@ tagged: { } 
  ]])
  
  AT_BISON_CHECK([input.y], [0], [],
- [[input.y:6.8-45: warning: unused value: $4 [-Wother]
 -[[input.y:6.23-28: warning: unused value: $4
 -input.y:8.9-11: warning: unset value: $$
++[[input.y:6.23-28: warning: unused value: $4 [-Wother]
 +input.y:8.9-11: warning: unset value: $$ [-Wother]
  ]])
  
  AT_CLEANUP
@@@ -505,9 -460,9 +572,9 @@@ end: { }  
  ]])
  
  AT_BISON_CHECK([input.y], [0], [],
 -[[input.y:6.8-22: warning: unset value: $$
 -input.y:6.12-14: warning: unused value: $2
 -input.y:7.6-8: warning: unset value: $$
 +[[input.y:6.8-22: warning: unset value: $$ [-Wother]
- input.y:6.8-22: warning: unused value: $2 [-Wother]
++input.y:6.12-14: warning: unused value: $2 [-Wother]
 +input.y:7.6-8: warning: unset value: $$ [-Wother]
  ]])
  
  AT_CLEANUP
diff --cc tests/local.at
Simple merge