mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-12 22:03:02 +00:00
yacc.c: always initialize yylloc
The initial location might be used if the parser starts by an empty reduction, so really ensure proper initialization of the initial location. The previous approach fails for PostgreSQL, which uses Reported by Peter Eisentraut. http://lists.gnu.org/archive/html/bug-bison/2012-11/msg00023.html With help from Théophile Ranquet. * data/yacc.c (b4_declare_scanner_communication_variables): Be sure to initialize yylloc, even when its structure is unknown. (yyparse): Simplify the call to b4_dollar_pushdef. * tests/actions.at (Initial location): Check of similar pattern as in the case of PostgreSQL.
This commit is contained in:
committed by
Akim Demaille
parent
53e2cd1ebd
commit
fb4c8a7cb9
@@ -73,8 +73,8 @@ AT_CLEANUP
|
||||
## Initial location. ##
|
||||
## ------------------ ##
|
||||
|
||||
# AT_TEST(SKELETON-NAME, DIRECTIVES)
|
||||
# ----------------------------------
|
||||
# AT_TEST(SKELETON-NAME, DIRECTIVES, [MORE-DIRECTIVES], [LOCATION = 1.1])
|
||||
# -----------------------------------------------------------------------
|
||||
# Check that the initial location is correct.
|
||||
m4_pushdef([AT_TEST],
|
||||
[AT_SETUP([Initial location: $1 $2])
|
||||
@@ -85,7 +85,8 @@ AT_DATA_GRAMMAR([[input.y]],
|
||||
%locations
|
||||
%debug
|
||||
%skeleton "$1"
|
||||
$2
|
||||
]$2[
|
||||
]$3[
|
||||
%parse-param { int x } // Useless, but used to force yyerror purity.
|
||||
%code
|
||||
{
|
||||
@@ -122,8 +123,8 @@ main (void)
|
||||
|
||||
AT_FULL_COMPILE([input])
|
||||
AT_PARSER_CHECK([./input], 1, [],
|
||||
[[1.1
|
||||
1.1: syntax error
|
||||
[m4_default([$4], [1.1])
|
||||
m4_default([$4], [1.1])[: syntax error
|
||||
]])
|
||||
AT_BISON_OPTION_POPDEFS
|
||||
AT_CLEANUP
|
||||
@@ -138,6 +139,36 @@ AT_TEST([glr.c])
|
||||
AT_TEST([lalr1.cc])
|
||||
AT_TEST([glr.cc])
|
||||
|
||||
## A very different test, based on PostgreSQL's implementation of the
|
||||
## locations. See
|
||||
## http://lists.gnu.org/archive/html/bug-bison/2012-11/msg00023.html
|
||||
##
|
||||
## Weirdly enough, to trigger the warning with GCC 4.7, we must not
|
||||
## use fprintf, so run the test twice: once to check the warning
|
||||
## (absence thereof), and another time to check the value.
|
||||
AT_TEST([yacc.c], [%define api.pure],
|
||||
[[%{
|
||||
# define YYLTYPE int
|
||||
# define YY_LOCATION_PRINT(Stream, Loc) \
|
||||
(void) (Loc)
|
||||
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
||||
(Current) = ((Rhs)[N ? 1 : 0])
|
||||
%}
|
||||
]],
|
||||
[@&t@])
|
||||
|
||||
AT_TEST([yacc.c], [%define api.pure],
|
||||
[[%{
|
||||
# define YYLTYPE int
|
||||
# define YY_LOCATION_PRINT(Stream, Loc) \
|
||||
fprintf ((Stream), "%d", (Loc))
|
||||
# define YYLLOC_DEFAULT(Current, Rhs, N) \
|
||||
(Current) = ((Rhs)[N ? 1 : 0])
|
||||
%}
|
||||
]],
|
||||
[0])
|
||||
|
||||
|
||||
m4_popdef([AT_TEST])
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user