]> git.saurik.com Git - bison.git/commitdiff
-Wempty-rule: diagnose empty rules without %empty
authorAkim Demaille <akim@lrde.epita.fr>
Sat, 9 Feb 2013 17:26:38 +0000 (18:26 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Mon, 18 Feb 2013 09:01:27 +0000 (10:01 +0100)
* src/complain.h, src/complain.c (warning_empty_rule, Wempty_rule):
New warning category.
(warnings_args, warnings_types): Adjust.
* src/reader.c (grammar_rule_check): Check the empty rules are
flagged by %empty.
* tests/actions.at (Implicitly empty rule): New.
* tests/existing.at: Add expected warnings.

src/complain.c
src/complain.h
src/getargs.c
src/reader.c
tests/actions.at
tests/existing.at

index 1162da29ea5c33dff99fdaa84bc16ab91e1c9b6d..cdc8803034227ce2774353a4ba3bb5dac08b5c47 100644 (file)
@@ -63,6 +63,7 @@ static const char * const warnings_args[] =
   "conflicts-sr",
   "conflicts-rr",
   "deprecated",
+  "empty-rule",
   "precedence",
   "other",
   "all",
@@ -78,6 +79,7 @@ static const int warnings_types[] =
   Wconflicts_sr,
   Wconflicts_rr,
   Wdeprecated,
+  Wempty_rule,
   Wprecedence,
   Wother,
   Wall,
index 10ea19bf7675aa1d3cda1e55a7342a0807951f9e..422c48f484dd95e971ea08115a6337e184acf509 100644 (file)
@@ -35,6 +35,7 @@ typedef enum
     warning_yacc,           /**< POSIXME.  */
     warning_conflicts_sr,   /**< S/R conflicts.  */
     warning_conflicts_rr,   /**< R/R conflicts.  */
+    warning_empty_rule,     /**< Implicitly empty rules.  */
     warning_deprecated,     /**< Obsolete constructs.  */
     warning_precedence,     /**< Useless precedence and associativity.  */
     warning_other,          /**< All other warnings.  */
@@ -85,6 +86,7 @@ typedef enum
     Wconflicts_sr     = 1 << warning_conflicts_sr,
     Wconflicts_rr     = 1 << warning_conflicts_rr,
     Wdeprecated       = 1 << warning_deprecated,
+    Wempty_rule       = 1 << warning_empty_rule,
     Wprecedence       = 1 << warning_precedence,
     Wother            = 1 << warning_other,
 
index 82c12983472c4af1f9c6b1f683bfd3b0f3a5c9c2..15c765a455d219708eb0426c9cb36ab55fa27906 100644 (file)
@@ -327,6 +327,7 @@ Warning categories include:\n\
   `conflicts-sr'      S/R conflicts (enabled by default)\n\
   `conflicts-rr'      R/R conflicts (enabled by default)\n\
   `deprecated'        obsolete constructs\n\
+  `empty-rule'        empty rules without %empty\n\
   `precedence'        useless precedence and associativity\n\
   `other'             all other warnings (enabled by default)\n\
   `all'               all the warnings\n\
index a83f11c1a8da97973efceeb873e62792d4b17027..0422d2046ed4b33a486ed1f2f813c6e3d1bc5286 100644 (file)
@@ -339,6 +339,12 @@ grammar_rule_check (const symbol_list *r)
     complain (&r->percent_empty_loc, complaint,
               _("%%empty on non-empty rule"));
 
+  /* Check that empty rule => %empty.  */
+  if (!(r->next && r->next->content.sym)
+      && !r->midrule_parent_rule
+      && !r->percent_empty_loc.start.file)
+    complain (&r->location, Wempty_rule, _("empty rule without %%empty"));
+
   /* 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.  */
index 8a545dc092e62fa52f810fc81489f1cce50e3d12..1f6630a9dfb9611d1e2356224285856cfd69373a 100644 (file)
@@ -64,6 +64,28 @@ AT_PARSER_CHECK([./input], 0,
 
 AT_CLEANUP
 
+## ----------------------- ##
+## Implicitly empty rule.  ##
+## ----------------------- ##
+
+AT_SETUP([Implicitly empty rule])
+
+AT_DATA_GRAMMAR([[1.y]],
+[[%%
+exp: a b;
+a: /* empty. */ {};
+// A mid-rule action does not count as an empty rule.
+b: {} {};
+]])
+
+AT_BISON_CHECK([-fcaret -Wempty-rule 1.y], [0], [],
+[[1.y:11.17-18: warning: empty rule without %empty [-Wempty-rule]
+ a: /* empty. */ {};
+                 ^^
+]])
+
+AT_CLEANUP
+
 ## ------------------------ ##
 ## Invalid uses of %empty.  ##
 ## ------------------------ ##
index cd80c50a301dc82411de627b759f7fbd9fb4046f..6aa7a398e99cd211a220c79679f72cdf805767f1 100644 (file)
@@ -427,7 +427,17 @@ dnl don't like even `print $!4;'.
 
 dnl BISON-STDERR
 [AT_COND_CASE([[canonical LR]],
-[[input.y: warning: 265 shift/reduce conflicts [-Wconflicts-sr]
+[[input.y:66.10: warning: empty rule without %empty [-Wempty-rule]
+input.y:169.8: warning: empty rule without %empty [-Wempty-rule]
+input.y:174.12: warning: empty rule without %empty [-Wempty-rule]
+input.y:179.13: warning: empty rule without %empty [-Wempty-rule]
+input.y:187.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:201.8: warning: empty rule without %empty [-Wempty-rule]
+input.y:206.21: warning: empty rule without %empty [-Wempty-rule]
+input.y:220.20: warning: empty rule without %empty [-Wempty-rule]
+input.y:299.13: warning: empty rule without %empty [-Wempty-rule]
+input.y:322.9: warning: empty rule without %empty [-Wempty-rule]
+input.y: warning: 265 shift/reduce conflicts [-Wconflicts-sr]
 input.y:19.8-16: warning: useless associativity for FUNC_CALL, use %precedence [-Wprecedence]
 input.y:21.8-14: warning: useless associativity for YNUMBER, use %precedence [-Wprecedence]
 input.y:21.16-22: warning: useless associativity for YSTRING, use %precedence [-Wprecedence]
@@ -446,7 +456,17 @@ input.y:47.12-16: warning: useless associativity for UNARY, use %precedence [-Wp
 input.y:50.7-9: warning: useless associativity for '$', use %precedence [-Wprecedence]
 input.y:51.7-9: warning: useless associativity for '(', use %precedence [-Wprecedence]
 input.y:51.11-13: warning: useless precedence and associativity for ')' [-Wprecedence]]],
-[[input.y: warning: 65 shift/reduce conflicts [-Wconflicts-sr]
+[[input.y:66.10: warning: empty rule without %empty [-Wempty-rule]
+input.y:169.8: warning: empty rule without %empty [-Wempty-rule]
+input.y:174.12: warning: empty rule without %empty [-Wempty-rule]
+input.y:179.13: warning: empty rule without %empty [-Wempty-rule]
+input.y:187.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:201.8: warning: empty rule without %empty [-Wempty-rule]
+input.y:206.21: warning: empty rule without %empty [-Wempty-rule]
+input.y:220.20: warning: empty rule without %empty [-Wempty-rule]
+input.y:299.13: warning: empty rule without %empty [-Wempty-rule]
+input.y:322.9: warning: empty rule without %empty [-Wempty-rule]
+input.y: warning: 65 shift/reduce conflicts [-Wconflicts-sr]
 input.y:19.8-16: warning: useless associativity for FUNC_CALL, use %precedence [-Wprecedence]
 input.y:21.8-14: warning: useless associativity for YNUMBER, use %precedence [-Wprecedence]
 input.y:21.16-22: warning: useless associativity for YSTRING, use %precedence [-Wprecedence]
@@ -1404,7 +1424,29 @@ dnl INPUT
 
 dnl BISON-STDERR
 [AT_COND_CASE([[canonical LR]],
-[[input.y: warning: 1876 shift/reduce conflicts [-Wconflicts-sr]
+[[input.y:128.12: warning: empty rule without %empty [-Wempty-rule]
+input.y:137.10: warning: empty rule without %empty [-Wempty-rule]
+input.y:142.8: warning: empty rule without %empty [-Wempty-rule]
+input.y:161.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:179.17: warning: empty rule without %empty [-Wempty-rule]
+input.y:205.16: warning: empty rule without %empty [-Wempty-rule]
+input.y:213.9: warning: empty rule without %empty [-Wempty-rule]
+input.y:225.6: warning: empty rule without %empty [-Wempty-rule]
+input.y:292.18: warning: empty rule without %empty [-Wempty-rule]
+input.y:294.19: warning: empty rule without %empty [-Wempty-rule]
+input.y:367.16: warning: empty rule without %empty [-Wempty-rule]
+input.y:373.11: warning: empty rule without %empty [-Wempty-rule]
+input.y:387.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:401.18: warning: empty rule without %empty [-Wempty-rule]
+input.y:413.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:443.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:471.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:474.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:489.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:506.14: warning: empty rule without %empty [-Wempty-rule]
+input.y:587.9: warning: empty rule without %empty [-Wempty-rule]
+input.y:591.14: warning: empty rule without %empty [-Wempty-rule]
+input.y: warning: 1876 shift/reduce conflicts [-Wconflicts-sr]
 input.y: warning: 144 reduce/reduce conflicts [-Wconflicts-rr]
 input.y:32.9-12: warning: useless associativity for HQUA, use %precedence [-Wprecedence]
 input.y:53.8-14: warning: useless associativity for HASSIGN, use %precedence [-Wprecedence]
@@ -1412,7 +1454,29 @@ input.y:54.9-15: warning: useless associativity for HORELSE, use %precedence [-W
 input.y:55.9-16: warning: useless associativity for HANDTHEN, use %precedence [-Wprecedence]
 input.y:61.9-12: warning: useless associativity for HNOT, use %precedence [-Wprecedence]
 input.y:68.7-11: warning: useless associativity for UNEAR, use %precedence [-Wprecedence]]],
-[[input.y: warning: 78 shift/reduce conflicts [-Wconflicts-sr]
+[[input.y:128.12: warning: empty rule without %empty [-Wempty-rule]
+input.y:137.10: warning: empty rule without %empty [-Wempty-rule]
+input.y:142.8: warning: empty rule without %empty [-Wempty-rule]
+input.y:161.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:179.17: warning: empty rule without %empty [-Wempty-rule]
+input.y:205.16: warning: empty rule without %empty [-Wempty-rule]
+input.y:213.9: warning: empty rule without %empty [-Wempty-rule]
+input.y:225.6: warning: empty rule without %empty [-Wempty-rule]
+input.y:292.18: warning: empty rule without %empty [-Wempty-rule]
+input.y:294.19: warning: empty rule without %empty [-Wempty-rule]
+input.y:367.16: warning: empty rule without %empty [-Wempty-rule]
+input.y:373.11: warning: empty rule without %empty [-Wempty-rule]
+input.y:387.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:401.18: warning: empty rule without %empty [-Wempty-rule]
+input.y:413.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:443.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:471.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:474.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:489.15: warning: empty rule without %empty [-Wempty-rule]
+input.y:506.14: warning: empty rule without %empty [-Wempty-rule]
+input.y:587.9: warning: empty rule without %empty [-Wempty-rule]
+input.y:591.14: warning: empty rule without %empty [-Wempty-rule]
+input.y: warning: 78 shift/reduce conflicts [-Wconflicts-sr]
 input.y: warning: 10 reduce/reduce conflicts [-Wconflicts-rr]
 input.y:32.9-12: warning: useless associativity for HQUA, use %precedence [-Wprecedence]
 input.y:53.8-14: warning: useless associativity for HASSIGN, use %precedence [-Wprecedence]
@@ -2001,7 +2065,12 @@ dnl without being followed by "of".)
 [[VARIABLE, '=', LABEL, LEFT, DOT_X]],
 
 dnl BISON-STDERR
-[[input.y:471.11-48: warning: rule useless in parser due to conflicts [-Wother]
+[[input.y:202.19: warning: empty rule without %empty [-Wempty-rule]
+input.y:270.6: warning: empty rule without %empty [-Wempty-rule]
+input.y:292.12: warning: empty rule without %empty [-Wempty-rule]
+input.y:309.17: warning: empty rule without %empty [-Wempty-rule]
+input.y:382.13: warning: empty rule without %empty [-Wempty-rule]
+input.y:471.11-48: warning: rule useless in parser due to conflicts [-Wother]
 input.y:19.8-12: warning: useless associativity for LABEL, use %precedence [-Wprecedence]
 input.y:20.8-15: warning: useless associativity for VARIABLE, use %precedence [-Wprecedence]
 input.y:21.8-13: warning: useless associativity for NUMBER, use %precedence [-Wprecedence]