]> 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>
Mon, 4 Apr 2011 03:52:28 +0000 (23:52 -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.

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 baa1d9624f1bafe0d07811026e33874e0e9dec68..27c6a8d8bbc8235618680f28dc8885bbfee776aa 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 7584f18ebf9debede7c8ee26952e5d0d67158a2c..3d02e031114c9b274a7f08f1318b9b37c802ba2c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -309,6 +309,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 cb50a017d52b16a458c922480d1908d956d41c90..e0d5aa5b7a7d621377f06ce862166558926b5e05 100644 (file)
@@ -8429,6 +8429,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 0437670b30a30a46198a2aa423e088997fa63a6e..d8eddf0b7c2fe1e7f69c281175e000d7ee0b405b 100644 (file)
@@ -594,8 +594,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 772d7dfc51530aac24a72154bb6a76a8391d5651..e1298f3ef1a83f9b562316f3490e590c9cc9dfb7 100644 (file)
@@ -63,7 +63,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 },
@@ -234,6 +235,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",
@@ -245,6 +248,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
@@ -335,6 +340,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 dc92584cb58f10d063c0ffb79d0389a8a9b0de53..20a4143763f074646c4c102842aab7f3d65bec47 100644 (file)
@@ -123,7 +123,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 e7a1c1c6135c506cc9b3effd644f743f87c61e25..1fcd69b5e757d50f955176ac6d0a875eeade9096 100644 (file)
@@ -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
index f08185a5abf8ca86dfb59d3e45b2f73658201042..33f00fa55676a6a8079b2b69813fe78f074879f8 100644 (file)
@@ -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