bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/4] diagnostics: always point to the first directive


From: Akim Demaille
Subject: [PATCH 4/4] diagnostics: always point to the first directive
Date: Mon, 22 Apr 2013 14:22:05 +0200

Some directives cannot be used several times (e.g., a given symbol may
only have a single printer).  In case of repeated definitions, an
error is issued for the second definition, yet it is not discarded,
and becomes the definition used for the rest of the file.

This is not consistent with the idea that multiple definitions are not
allowed: discard any repeated directive.

* src/symtab.c (symbol_type_set, symbol_code_props_set)
(semantic_type_code_props_set, symbol_class_set, symbol_translation):
Discard repeated directives.
* tests/input.at (Default %printer and %destructor redeclared)
(Per-type %printer and %destructor redeclared): Update expectations.
---
 src/symtab.c   | 22 ++++++++++++++--------
 tests/input.at | 16 ++++++++--------
 2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/src/symtab.c b/src/symtab.c
index 11a0d75..7141f7d 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -243,9 +243,12 @@ symbol_type_set (symbol *sym, uniqstr type_name, location 
loc)
     {
       if (sym->type_name)
         symbol_redeclaration (sym, "%type", sym->type_location, loc);
-      uniqstr_assert (type_name);
-      sym->type_name = type_name;
-      sym->type_location = loc;
+      else
+        {
+          uniqstr_assert (type_name);
+          sym->type_name = type_name;
+          sym->type_location = loc;
+        }
     }
 }
 
@@ -261,7 +264,8 @@ symbol_code_props_set (symbol *sym, code_props_type kind,
     symbol_redeclaration (sym, code_props_type_string (kind),
                           sym->props[kind].location,
                           code->location);
-  sym->props[kind] = *code;
+  else
+    sym->props[kind] = *code;
 }
 
 /*-----------------------------------------------------.
@@ -277,7 +281,8 @@ semantic_type_code_props_set (semantic_type *type,
     semantic_type_redeclaration (type, code_props_type_string (kind),
                                  type->props[kind].location,
                                  code->location);
-  type->props[kind] = *code;
+  else
+    type->props[kind] = *code;
 }
 
 /*---------------------------------------------------.
@@ -363,7 +368,8 @@ symbol_class_set (symbol *sym, symbol_class class, location 
loc, bool declaring)
     {
       if (sym->status == declared && !warned)
         complain (&loc, Wother, _("symbol %s redeclared"), sym->tag);
-      sym->status = declared;
+      else
+        sym->status = declared;
     }
 }
 
@@ -618,8 +624,8 @@ symbol_translation (symbol *this)
           (this->user_token_number,
            symbols[token_translations[this->user_token_number]],
            this);
-
-      token_translations[this->user_token_number] = this->number;
+      else
+        token_translations[this->user_token_number] = this->number;
     }
 
   return true;
diff --git a/tests/input.at b/tests/input.at
index 8239658..eb73bf9 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -382,14 +382,14 @@ input.y:2.10-24:     previous declaration
 input.y:11.13-29: error: %destructor redeclaration for <>
  %destructor { destroy ($$); } <>;
              ^^^^^^^^^^^^^^^^^
-input.y:4.13-29:      previous declaration
- %destructor { destroy ($$); } <>
+input.y:1.13-29:      previous declaration
+ %destructor { destroy ($$); } <> <>
              ^^^^^^^^^^^^^^^^^
 input.y:12.10-24: error: %printer redeclaration for <>
  %printer { print ($$); } <>;
           ^^^^^^^^^^^^^^^
-input.y:5.10-24:      previous declaration
- %printer { print ($$); } <>
+input.y:2.10-24:      previous declaration
+ %printer { print ($$); } <> <>
           ^^^^^^^^^^^^^^^
 ]])
 ])
@@ -426,17 +426,17 @@ AT_BISON_CHECK([input.y], [1], [],
 [[input.y:4.13-29: error: %destructor redeclaration for <field1>
 input.y:1.13-29:     previous declaration
 input.y:4.13-29: error: %destructor redeclaration for <field1>
-input.y:4.13-29:     previous declaration
+input.y:1.13-29:     previous declaration
 input.y:5.10-24: error: %printer redeclaration for <field2>
 input.y:2.10-24:     previous declaration
 input.y:5.10-24: error: %printer redeclaration for <field2>
-input.y:5.10-24:     previous declaration
+input.y:2.10-24:     previous declaration
 input.y:11.13-29: error: %destructor redeclaration for <field2>
 input.y:1.13-29:      previous declaration
 input.y:11.13-29: error: %destructor redeclaration for <field1>
-input.y:4.13-29:      previous declaration
+input.y:1.13-29:      previous declaration
 input.y:12.10-24: error: %printer redeclaration for <field2>
-input.y:5.10-24:      previous declaration
+input.y:2.10-24:      previous declaration
 input.y:12.10-24: error: %printer redeclaration for <field1>
 input.y:2.10-24:      previous declaration
 ]])
-- 
1.8.2.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]