mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
POSIX: warn if %prec's token was not defined.
Reported by Florian Krohm at
<http://lists.gnu.org/archive/html/bug-bison/2009-12/msg00005.html>.
* NEWS (2.4.2): Document.
* src/reader.c (grammar_rule_check): Implement.
(grammar_current_rule_prec_set): Add comments explaining that we
here assume a %prec identifier is a token, but we still manage
to support POSIX.
* tests/input.at (%prec's token must be defined): New test
group.
(cherry picked from commit f1ceed0774)
This commit is contained in:
13
ChangeLog
13
ChangeLog
@@ -1,3 +1,16 @@
|
||||
2009-12-30 Joel E. Denny <jdenny@clemson.edu>
|
||||
|
||||
POSIX: warn if %prec's token was not defined.
|
||||
Reported by Florian Krohm at
|
||||
<http://lists.gnu.org/archive/html/bug-bison/2009-12/msg00005.html>.
|
||||
* NEWS (2.4.2): Document.
|
||||
* src/reader.c (grammar_rule_check): Implement.
|
||||
(grammar_current_rule_prec_set): Add comments explaining that we
|
||||
here assume a %prec identifier is a token, but we still manage
|
||||
to support POSIX.
|
||||
* tests/input.at (%prec's token must be defined): New test
|
||||
group.
|
||||
|
||||
2009-12-31 Joel E. Denny <jdenny@clemson.edu>
|
||||
|
||||
* HACKING (Release Procedure): Recommend a secure automake.
|
||||
|
||||
10
NEWS
10
NEWS
@@ -232,6 +232,16 @@ Bison News
|
||||
|
||||
* Changes in version 2.4.2 (????-??-??):
|
||||
|
||||
** `%prec IDENTIFIER' requires IDENTIFIER to be defined separately.
|
||||
|
||||
POSIX specifies that an error be reported for any identifier that does
|
||||
not appear on the LHS of a grammar rule and that is not defined by
|
||||
%token, %left, %right, or %nonassoc. Bison 2.3b and later lost this
|
||||
error report for the case when an identifier appears only after a
|
||||
%prec directive. It is now restored. However, for backward
|
||||
compatibility with recent Bison releases, it is only a warning for
|
||||
now. In Bison 2.5 and later, it will return to being an error.
|
||||
|
||||
** Detection of GNU M4 1.4.6 or newer during configure is improved.
|
||||
|
||||
** Warnings from gcc's -Wundef option about undefined YYENABLE_NLS,
|
||||
|
||||
19
src/reader.c
19
src/reader.c
@@ -320,6 +320,15 @@ grammar_rule_check (const symbol_list *r)
|
||||
warn_at (r->location, _("unset value: $$"));
|
||||
}
|
||||
}
|
||||
|
||||
/* See comments in grammar_current_rule_prec_set for how POSIX
|
||||
mandates this complaint. It's only for identifiers, so skip
|
||||
it for char literals and strings, which are always tokens. */
|
||||
if (r->ruleprec
|
||||
&& r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"'
|
||||
&& !r->ruleprec->declared && !r->ruleprec->prec)
|
||||
warn_at (r->location, _("token for %%prec is not defined: %s"),
|
||||
r->ruleprec->tag);
|
||||
}
|
||||
|
||||
|
||||
@@ -396,6 +405,16 @@ grammar_midrule_action (void)
|
||||
void
|
||||
grammar_current_rule_prec_set (symbol *precsym, location loc)
|
||||
{
|
||||
/* POSIX says that any identifier is a nonterminal if it does not
|
||||
appear on the LHS of a grammar rule and is not defined by %token
|
||||
or by one of the directives that assigns precedence to a token. We
|
||||
ignore this here because the only kind of identifier that POSIX
|
||||
allows to follow a %prec is a token and because assuming it's a
|
||||
token now can produce more logical error messages. Nevertheless,
|
||||
grammar_rule_check does obey what we believe is the real intent of
|
||||
POSIX here: that an error be reported for any identifier that
|
||||
appears after %prec but that is not defined separately as a
|
||||
token. */
|
||||
symbol_class_set (precsym, token_sym, loc, false);
|
||||
if (current_rule->ruleprec)
|
||||
complain_at (loc, _("only one %s allowed per rule"), "%prec");
|
||||
|
||||
@@ -794,6 +794,26 @@ AT_BISON_CHECK([input.y], [1], [],
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## ------------------------------- ##
|
||||
## %prec's token must be defined. ##
|
||||
## ------------------------------- ##
|
||||
|
||||
AT_SETUP([[%prec's token must be defined]])
|
||||
|
||||
# According to POSIX, a %prec token must be defined separately.
|
||||
|
||||
AT_DATA([[input.y]],
|
||||
[[%%
|
||||
start: %prec PREC ;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[input.y]], [[0]], [],
|
||||
[[input.y:2.8-17: warning: token for %prec is not defined: PREC
|
||||
]])
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## -------------------------------- ##
|
||||
## Reject unused %code qualifiers. ##
|
||||
## -------------------------------- ##
|
||||
|
||||
Reference in New Issue
Block a user