mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
Add -Wconflicts-sr and -Wconflicts-rr.
Thus, conflict reports are now affected by -Werror and -Wnone (unless %expect or %expect-rr is specified). Reported by George Neuner at <http://lists.gnu.org/archive/html/bug-bison/2010-08/msg00002.html>. * NEWS (2.5): Document. * doc/bison.texinfo (Bison Options): Document. * src/complain.c, src/complain.h (set_warning_issued): Export function. * src/conflicts.c (conflicts_print): Suppress conflict report based on -Wno-conflicts-sr and -Wno-conflicts-rr, and treat conflicts as errors if -Werror. * src/getargs.c (warnings_flag): Initialize with warnings_conflicts_sr and warnings_conflicts_rr as well. (warnings_args, warnings_types): Add entries for warnings_conflicts_sr and warnings_conflicts_rr. (usage): Update. * src/getargs.h (enum warnings): Add entries for warnings_conflicts_sr and warnings_conflicts_rr. * tests/conflicts.at (-W versus %expect and %expect-rr): New test group. * tests/local.at (AT_BISON_CHECK_NO_XML): Update now that the conflict report can produce a "warnings being treated as errors" message. Also, check that stderr is now fully scrubbed by -Wnone when the exit status is 0.
This commit is contained in:
@@ -1440,3 +1440,104 @@ AT_CHECK([[cat input.output | sed -n '/^state 0$/,/^state 1$/p']], 0,
|
||||
state 1
|
||||
]])
|
||||
AT_CLEANUP
|
||||
|
||||
|
||||
## --------------------------------- ##
|
||||
## -W versus %expect and %expect-rr ##
|
||||
## --------------------------------- ##
|
||||
|
||||
AT_SETUP([[-W versus %expect and %expect-rr]])
|
||||
|
||||
AT_DATA([[sr-rr.y]],
|
||||
[[%glr-parser
|
||||
%%
|
||||
start: 'a' | A 'a' | B 'a' ;
|
||||
A: ;
|
||||
B: ;
|
||||
]])
|
||||
AT_DATA([[sr.y]],
|
||||
[[%glr-parser
|
||||
%%
|
||||
start: 'a' | A 'a' ;
|
||||
A: ;
|
||||
]])
|
||||
AT_DATA([[rr.y]],
|
||||
[[%glr-parser
|
||||
%%
|
||||
start: A | B ;
|
||||
A: ;
|
||||
B: ;
|
||||
]])
|
||||
|
||||
AT_BISON_CHECK([[sr-rr.y]], [[0]], [[]],
|
||||
[[sr-rr.y: conflicts: 1 shift/reduce, 1 reduce/reduce
|
||||
]])
|
||||
AT_BISON_CHECK([[-Wno-conflicts-sr sr-rr.y]], [[0]], [[]],
|
||||
[[sr-rr.y: conflicts: 1 reduce/reduce
|
||||
]])
|
||||
AT_BISON_CHECK([[-Wno-conflicts-rr sr-rr.y]], [[0]], [[]],
|
||||
[[sr-rr.y: conflicts: 1 shift/reduce
|
||||
]])
|
||||
|
||||
[for gram in sr-rr sr rr; do
|
||||
for sr_exp_i in '' 0 1 2; do
|
||||
for rr_exp_i in '' 0 1 2; do
|
||||
test -z "$sr_exp_i" && test -z "$rr_exp_i" && continue
|
||||
|
||||
# Build grammar file.
|
||||
sr_exp=0
|
||||
rr_exp=0
|
||||
file=$gram
|
||||
directives=
|
||||
if test -n "$sr_exp_i"; then
|
||||
sr_exp=$sr_exp_i
|
||||
file=$file-expect-$sr_exp
|
||||
directives="%expect $sr_exp"
|
||||
fi
|
||||
if test -n "$rr_exp_i"; then
|
||||
rr_exp=$rr_exp_i
|
||||
file=$file-expect-rr-$rr_exp
|
||||
directives="$directives %expect-rr $rr_exp"
|
||||
fi
|
||||
file=$file.y
|
||||
echo "$directives" > $file
|
||||
cat $gram.y >> $file
|
||||
|
||||
# Count actual conflicts.
|
||||
conflicts=
|
||||
sr_count=0
|
||||
rr_count=0
|
||||
if test $gram = sr || test $gram = sr-rr; then
|
||||
conflicts="1 shift/reduce"
|
||||
sr_count=1
|
||||
fi
|
||||
if test $gram = rr || test $gram = sr-rr; then
|
||||
if test -n "$conflicts"; then
|
||||
conflicts="$conflicts, "
|
||||
fi
|
||||
conflicts="${conflicts}1 reduce/reduce"
|
||||
rr_count=1
|
||||
fi
|
||||
|
||||
# Run tests.
|
||||
if test $sr_count -eq $sr_exp && test $rr_count -eq $rr_exp; then
|
||||
]AT_BISON_CHECK([[-Wnone $file]])[
|
||||
]AT_BISON_CHECK([[-Werror $file]])[
|
||||
else
|
||||
echo "$file: conflicts: $conflicts" > experr
|
||||
if test $sr_count -ne $sr_exp; then
|
||||
if test $sr_exp -ne 1; then s=s; else s= ; fi
|
||||
echo "$file: expected $sr_exp shift/reduce conflict$s" >> experr
|
||||
fi
|
||||
if test $rr_count -ne $rr_exp; then
|
||||
if test $rr_exp -ne 1; then s=s; else s= ; fi
|
||||
echo "$file: expected $rr_exp reduce/reduce conflict$s" >> experr
|
||||
fi
|
||||
]AT_BISON_CHECK([[-Wnone $file]], [[1]], [[]], [[experr]])[
|
||||
]AT_BISON_CHECK([[-Werror $file]], [[1]], [[]], [[experr]])[
|
||||
fi
|
||||
done
|
||||
done
|
||||
done]
|
||||
|
||||
AT_CLEANUP
|
||||
|
||||
@@ -301,6 +301,13 @@ m4_if(m4_bregexp([$4], [: warning: ]), [-1], [],
|
||||
sed -n '/: warning: /=' at-bison-check-warnings \
|
||||
| sed -n 1p \
|
||||
`"
|
||||
at_bison_check_first_tmp="` \
|
||||
sed -n '/conflicts: [0-9].*reduce$/=' at-bison-check-warnings \
|
||||
| sed -n 1p \
|
||||
`"
|
||||
if test $at_bison_check_first_tmp -lt $at_bison_check_first; then
|
||||
at_bison_check_first=$at_bison_check_first_tmp
|
||||
fi
|
||||
if test $at_bison_check_first -gt 1; then
|
||||
sed -n "1,`expr $at_bison_check_first - 1`"p \
|
||||
at-bison-check-warnings > experr
|
||||
@@ -330,9 +337,9 @@ m4_if(m4_bregexp([$4], [: warning: ]), [-1], [],
|
||||
# -Werror doesn't change the exit status when -Wnone or
|
||||
# --warnings=none is specified.
|
||||
]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ -Wnone -Werror]],
|
||||
[[0]], [expout], [ignore])[
|
||||
[[0]], [expout])[
|
||||
]AT_CHECK(AT_QUELL_VALGRIND[[ bison ]$1[ --warnings=none \
|
||||
-Werror]], [[0]], [expout], [ignore])[
|
||||
-Werror]], [[0]], [expout])[
|
||||
|
||||
# Restore caller's files.
|
||||
if test -f at-bison-check-expout.bak; then
|
||||
|
||||
Reference in New Issue
Block a user