]> git.saurik.com Git - bison.git/commitdiff
Add -Wconflicts-sr and -Wconflicts-rr.
authorJoel E. Denny <joeldenny@joeldenny.org>
Mon, 28 Mar 2011 02:38:32 +0000 (22:38 -0400)
committerJoel E. Denny <joeldenny@joeldenny.org>
Sat, 9 Apr 2011 17:01:41 +0000 (13:01 -0400)
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.
(cherry picked from commit 6f8bdce25df5669b0b200c2a3848a1c08a44eb79)

ChangeLog
NEWS
doc/bison.texinfo
src/complain.c
src/complain.h
src/conflicts.c
src/getargs.c
src/getargs.h
tests/conflicts.at
tests/local.at

index 7886ddfaa16f66a3939e97e4c26036a47c63b331..9f70d4d89ff693e9d96577d3ff9327e1950dc2e3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2011-03-27  Joel E. Denny  <joeldenny@joeldenny.org>
+
+       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.
+
 2011-03-27  Joel E. Denny  <joeldenny@joeldenny.org>
 
        Pacify maintainer-check-posix.
diff --git a/NEWS b/NEWS
index eff33c080e113f6d957e888ecf76b7bed76d4a43..d22e246adfdf02df7dc53d8519cd73d177c8ad89 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -368,6 +368,24 @@ Bison News
 
     bison -Wall,no-yacc gram.y
 
+*** Bison now treats S/R and R/R conflicts like other warnings:
+
+  Previously, conflict reports were independent of Bison's normal
+  warning system.  Now, Bison recognizes the warning categories
+  "conflicts-sr" and "conflicts-rr".  This change has important
+  consequences for the -W and --warnings command-line options.  For
+  example:
+
+    bison -Wno-conflicts-sr gram.y  # S/R conflicts not reported
+    bison -Wno-conflicts-rr gram.y  # R/R conflicts not reported
+    bison -Wnone            gram.y  # no conflicts are reported
+    bison -Werror           gram.y  # any conflict is an error
+
+  However, as before, if the %expect or %expect-rr directive is
+  specified, an unexpected number of conflicts is an error, and an
+  expected number of conflicts is not reported, so -W and --warning
+  then have no effect on the conflict report.
+
 *** The "none" category no longer disables a preceding "error":
 
   For example, for the following command line, Bison now reports
index 1a1da5303c8683468f0df8fef49179c0f52930c1..ce86334df1fb3ac643ec9f823ecf83177912c7e6 100644 (file)
@@ -8742,6 +8742,14 @@ be false alarms in existing grammars employing the Yacc constructs
 @item yacc
 Incompatibilities with POSIX Yacc.
 
+@item conflicts-sr
+@itemx conflicts-rr
+S/R and R/R conflicts.  These warnings are enabled by default.  However, if
+the @code{%expect} or @code{%expect-rr} directive is specified, an
+unexpected number of conflicts is an error, and an expected number of
+conflicts is not reported, so @option{-W} and @option{--warning} then have
+no effect on the conflict report.
+
 @item other
 All warnings not categorized above.  These warnings are enabled by default.
 
index 5629dd3a1c59adfc875596b7e6929b9c85046fed..5c07fb3dd8b68f2732dcaddfb6da72ee59f3eb6b 100644 (file)
@@ -94,7 +94,7 @@ error_message (location *loc,
 | Report a warning, and proceed.  |
 `--------------------------------*/
 
-static void
+void
 set_warning_issued (void)
 {
   static bool warning_issued = false;
index 3d867f5ea62618b87f7ad90c94fabf522f16dc32..07d401cbb193385dff37ac428f6bf78f876baf5e 100644 (file)
 extern "C" {
 # endif
 
+/** Record that a warning is about to be issued, and treat it as an
+    error if <tt>warnings_flag & warnings_error</tt>.  This is exported
+    only for the sake of Yacc-compatible conflict reports in conflicts.c.
+    All other warnings should be implemented in complain.c and should use
+    the normal warning format.  */
+void set_warning_issued (void);
+
 /** Informative messages, but we proceed.  Report iff
     <tt>warnings_flag & warnings_other</tt>.  */
 
index 9603498970c4185f285e2864a634cd15053861ec..c676e33c5e04b2cb1e8a34b44504caf99e307bc4 100644 (file)
@@ -599,8 +599,17 @@ conflicts_print (void)
     return;
 
   /* Report the total number of conflicts on STDERR.  */
+  if (expected_sr_conflicts == -1 && expected_rr_conflicts == -1)
+    {
+      if (!(warnings_flag & warnings_conflicts_sr))
+        src_total = 0;
+      if (!(warnings_flag & warnings_conflicts_rr))
+        rrc_total = 0;
+    }
   if (src_total | rrc_total)
     {
+      if (expected_sr_conflicts == -1 && expected_rr_conflicts == -1)
+        set_warning_issued ();
       if (! yacc_flag)
        fprintf (stderr, "%s: ", current_file);
       conflict_report (stderr, src_total, rrc_total);
index b0e34503566555a6f9d9547ce4ea37d19d5a68dd..50881aa2f9a529819d7e93bdce3470ade83a51f6 100644 (file)
@@ -59,7 +59,8 @@ bool glr_parser = false;
 
 int report_flag = report_none;
 int trace_flag = trace_none;
-int warnings_flag = warnings_other;
+int warnings_flag = warnings_conflicts_sr | warnings_conflicts_rr
+                    | warnings_other;
 
 static struct bison_language const valid_languages[] = {
   { "c", "c-skel.m4", ".c", ".h", true },
@@ -230,6 +231,8 @@ static const char * const warnings_args[] =
   "none            - no warnings",
   "midrule-values  - unset or unused midrule values",
   "yacc            - incompatibilities with POSIX Yacc",
+  "conflicts-sr    - S/R conflicts",
+  "conflicts-rr    - R/R conflicts",
   "other           - all other warnings",
   "all             - all of the above",
   "error           - warnings are errors",
@@ -241,6 +244,8 @@ static const int warnings_types[] =
   warnings_none,
   warnings_midrule_values,
   warnings_yacc,
+  warnings_conflicts_sr,
+  warnings_conflicts_rr,
   warnings_other,
   warnings_all,
   warnings_error
@@ -332,6 +337,8 @@ Output:\n\
 Warning categories include:\n\
   `midrule-values'  unset or unused midrule values\n\
   `yacc'            incompatibilities with POSIX Yacc\n\
+  `conflicts-sr'    S/R conflicts (enabled by default)\n\
+  `conflicts-rr'    R/R conflicts (enabled by default)\n\
   `other'           all other warnings (enabled by default)\n\
   `all'             all the warnings\n\
   `no-CATEGORY'     turn off warnings in CATEGORY\n\
index 1a9d913df52b48b4aa81dc4a5ba11e60a87e9309..9c505b070498b18b97b5306c3d5b3d6457306192 100644 (file)
@@ -119,7 +119,9 @@ enum warnings
     warnings_error            = 1 << 0, /**< Warnings are treated as errors.  */
     warnings_midrule_values   = 1 << 1, /**< Unset or unused midrule values.  */
     warnings_yacc             = 1 << 2, /**< POSIXME.  */
-    warnings_other            = 1 << 3, /**< All other warnings.  */
+    warnings_conflicts_sr     = 1 << 3, /**< S/R conflicts.  */
+    warnings_conflicts_rr     = 1 << 4, /**< R/R conflicts.  */
+    warnings_other            = 1 << 5, /**< All other warnings.  */
     warnings_all              = ~warnings_error /**< All above warnings.  */
   };
 /** What warnings are issued.  */
index c933601dc98e83bcb725f02096b3faeebed44e23..046c3b0447c9444d66ddce1a8325370b824e9864 100644 (file)
@@ -1490,3 +1490,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
index c5e673383aaac10ed9cca23f77dd46f103406ee3..9bee00166da5b788774fbdfc870e20a3eda037b9 100644 (file)
@@ -306,6 +306,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
@@ -335,9 +342,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