]> git.saurik.com Git - bison.git/commitdiff
warnings: used but undeclared symbols are warnings
authorVictor Santet <victor.santet@epita.fr>
Tue, 19 Jun 2012 14:14:55 +0000 (16:14 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Wed, 20 Jun 2012 08:30:26 +0000 (10:30 +0200)
We used to raise an error if a symbol appears only in a %printer or
%destructor.  Make it a warning.

* src/symtab.h (status): New enum.
(symbol): Replace the binary "declared" with the three-state "status".
Adjust dependencies.
* src/symtab.c (symbol_check_defined): Needed symbols are an error,
whereas "used" are simply warnings.
* src/symlist.c (symbol_list_destructor_set, symbol_list_printer): Set
symbol status to 'used' when associated to destructors or printers.
* input.at (Undeclared symbols used for a printer or destructor): New.

NEWS
src/reader.c
src/symlist.c
src/symtab.c
src/symtab.h
tests/input.at

diff --git a/NEWS b/NEWS
index 7b75972c4ace5457e59ee46acdc29c20c208ab9e..2b4ef26eeedcd22a3d89f1c4486cf9f764ffab4e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,18 @@ GNU Bison NEWS
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Warnings about undeclared symbols
+
+  Bison used to raise an error for %printer and %destructor directives for
+  undefined symbols.
+
+    %printer    {} symbol1
+    %destructor {} symbol2
+    %%
+    exp: "a";
+
+  This is now only a warning.
+
 ** Additional yylex/yyparse arguments
 
   The new directive %param declare additional argument to both yylex
index 2e0aa5ee81449787635c1af365d39f63cb2472da..27ddad0835422b13bf7e9fdc7df7b69b1428c5cc 100644 (file)
@@ -333,7 +333,7 @@ grammar_rule_check (const symbol_list *r)
      it for char literals and strings, which are always tokens.  */
   if (r->ruleprec
       && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"'
-      && !r->ruleprec->declared && !r->ruleprec->prec)
+      && r->ruleprec->status != declared && !r->ruleprec->prec)
     warn_at (r->location, _("token for %%prec is not defined: %s"),
              r->ruleprec->tag);
 }
index 874e238ac3faccbdf229aceec15dde684a1755b0..03169450d32b86940f7d85cc157e9f383144b51f 100644 (file)
@@ -232,6 +232,8 @@ symbol_list_destructor_set (symbol_list *node, char const *code, location loc)
     {
       case SYMLIST_SYMBOL:
         symbol_destructor_set (node->content.sym, &destructor);
+        if (node->content.sym->status == needed)
+          node->content.sym->status = used;
         break;
       case SYMLIST_TYPE:
         semantic_type_destructor_set (
@@ -256,6 +258,8 @@ symbol_list_printer_set (symbol_list *node, char const *code, location loc)
     {
       case SYMLIST_SYMBOL:
         symbol_printer_set (node->content.sym, &printer);
+        if (node->content.sym->status == needed)
+          node->content.sym->status = used;
         break;
       case SYMLIST_TYPE:
         semantic_type_printer_set (
index d25b93680685318b9fddb25bfb3dcf19ee378cbb..719cb9fd3a30e12366fd542d3cc7347a63aa5254 100644 (file)
@@ -85,7 +85,7 @@ symbol_new (uniqstr tag, location loc)
 
   res->alias = NULL;
   res->class = unknown_sym;
-  res->declared = false;
+  res->status = needed;
 
   if (nsyms == SYMBOL_NUMBER_MAXIMUM)
     fatal (_("too many symbols in input grammar (limit is %d)"),
@@ -361,7 +361,7 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
   if (sym->class != unknown_sym && sym->class != class)
     {
       complain_at (loc, _("symbol %s redefined"), sym->tag);
-      sym->declared = false;
+      sym->status = needed;
     }
 
   if (class == nterm_sym && sym->class != nterm_sym)
@@ -373,9 +373,9 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
 
   if (declaring)
     {
-      if (sym->declared)
+      if (sym->status == declared)
         warn_at (loc, _("symbol %s redeclared"), sym->tag);
-      sym->declared = true;
+      sym->status = declared;
     }
 }
 
@@ -421,10 +421,19 @@ symbol_check_defined (symbol *sym)
 {
   if (sym->class == unknown_sym)
     {
-      complain_at
-        (sym->location,
-         _("symbol %s is used, but is not defined as a token and has no rules"),
-         sym->tag);
+      if (sym->status == needed)
+        complain_at
+          (sym->location,
+           _("symbol %s is used, but is not defined as a token and has no"
+             " rules"),
+           sym->tag);
+      else
+        warn_at
+          (sym->location,
+           _("symbol %s is used, but is not defined as a token and has no"
+             " rules"),
+           sym->tag);
+
       sym->class = nterm_sym;
       sym->number = nvars++;
     }
index 651552278fcd4f3d3b8cef84280b55391b23961f..d9ee96efa23e2167a9c24ac8d091ba738bc69967 100644 (file)
@@ -51,6 +51,13 @@ typedef int symbol_number;
 
 typedef struct symbol symbol;
 
+typedef enum
+  {
+    needed,   /**< found but not "defined".  */
+    used,     /**< used by %printer but not declared.  */
+    declared, /**< defined with %type or %token.  */
+  } status;
+
 /* When extending this structure, be sure to complete
    symbol_check_alias_consistency.  */
 struct symbol
@@ -90,7 +97,7 @@ struct symbol
      symbol-string pair for an alias.  */
   symbol *alias;
   symbol_class class;
-  bool declared;
+  status status;
 };
 
 /** Undefined user number.  */
index d94b652ec6cb36cf45b1596e3d087bbee66f4adf..0e0b0041ec8fb6bee5efea5aac5861a3dd754248 100644 (file)
@@ -271,6 +271,30 @@ input.y:5.10-24: previous declaration
 
 AT_CLEANUP
 
+## ---------------------------------------------------- ##
+## Undeclared symbols used for a printer or destructor. ##
+## ---------------------------------------------------- ##
+
+AT_SETUP([Undeclared symbols used for a printer or destructor])
+
+AT_DATA([[input.y]],
+[[%printer {} token1
+%destructor {} token2
+
+%%
+exp: "a";
+]])
+
+AT_BISON_CHECK([input.y], [0], [],
+[[input.y:1.13-18: warning: symbol token1 is used, but is not defined as a token and has no rules
+input.y:2.16-21: warning: symbol token2 is used, but is not defined as a token and has no rules
+input.y: warning: 2 nonterminals useless in grammar
+input.y:1.13-18: warning: nonterminal useless in grammar: token1
+input.y:2.16-21: warning: nonterminal useless in grammar: token2
+]])
+
+AT_CLEANUP
+
 
 ## ---------------------------------------- ##
 ## Unused values with default %destructor.  ##