diff options
author | Joel E. Denny <joeldenny@joeldenny.org> | 2011-03-27 22:38:32 -0400 |
---|---|---|
committer | Joel E. Denny <joeldenny@joeldenny.org> | 2011-04-03 23:52:28 -0400 |
commit | 6f8bdce25df5669b0b200c2a3848a1c08a44eb79 (patch) | |
tree | e17f1ee2c70127d3f564df18ff3eb0837e4d3362 /tests | |
parent | fc7ce9970f2972443c1a031c91ffef2dfdf28651 (diff) | |
download | bison-6f8bdce25df5669b0b200c2a3848a1c08a44eb79.tar.gz |
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.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/conflicts.at | 101 | ||||
-rw-r--r-- | tests/local.at | 11 |
2 files changed, 110 insertions, 2 deletions
diff --git a/tests/conflicts.at b/tests/conflicts.at index e7a1c1c6..1fcd69b5 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -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 diff --git a/tests/local.at b/tests/local.at index f08185a5..33f00fa5 100644 --- a/tests/local.at +++ b/tests/local.at @@ -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 |