diagnostics: better location for type redeclarations

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
I was working on a grammar which had many type redefinitions, and the location was not helping because the grammar looked like

%type <foo> ... bar ... bar

where the 'bar's were far appart one another, so I had to search for them, since the location was only pointing to the <foo> part, which is the same.

commit cb655534494201ff80af8adc885ae46998fcb6b3
Author: Akim Demaille <[email protected]>
Date:   Sat Aug 1 08:51:24 2020 +0200

    diagnostics: better location for type redeclarations
    
    From
    
        foo.y:1.7-11: error: %type redeclaration for bar
            1 | %type <foo> bar bar
              |       ^~~~~
        foo.y:1.7-11: note: previous declaration
            1 | %type <foo> bar bar
              |       ^~~~~
    
    to
    
        foo.y:1.17-19: error: %type redeclaration for bar
            1 | %type <foo> bar bar
              |                 ^~~
        foo.y:1.13-15: note: previous declaration
            1 | %type <foo> bar bar
              |             ^~~
    
    * src/symlist.h, src/symlist.c (symbol_list_type_set): There's no need
    for the tag's location, use that of the symbol.
    * src/parse-gram.y: Adjust.
    * tests/input.at: Adjust.

diff --git a/NEWS b/NEWS
index 57e37923..cf79ac1e 100644
--- a/NEWS
+++ b/NEWS
@@ -2,8 +2,16 @@ GNU Bison NEWS
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Bug fixes
+
+  Fixed a crash when a token alias contains a NUL byte.
+
+** Changes
+
   Improvements and fixes in the documentation.
 
+  More precise location about symbol type redefinitions.
+
 
 * Noteworthy changes in release 3.7 (2020-07-23) [stable]
 
diff --git a/src/parse-gram.y b/src/parse-gram.y
index fc046f60..269f776e 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -532,11 +532,11 @@ token_decls:
     }
 | TAG token_decl.1[syms]
     {
-      $$ = symbol_list_type_set ($syms, $TAG, @TAG);
+      $$ = symbol_list_type_set ($syms, $TAG);
     }
 | token_decls TAG token_decl.1[syms]
     {
-      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG, @TAG));
+      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG));
     }
 ;
 
@@ -592,11 +592,11 @@ token_decls_for_prec:
     }
 | TAG token_decl_for_prec.1[syms]
     {
-      $$ = symbol_list_type_set ($syms, $TAG, @TAG);
+      $$ = symbol_list_type_set ($syms, $TAG);
     }
 | token_decls_for_prec TAG token_decl_for_prec.1[syms]
     {
-      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG, @TAG));
+      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG));
     }
 ;
 
@@ -632,11 +632,11 @@ symbol_decls:
     }
 | TAG symbol_decl.1[syms]
     {
-      $$ = symbol_list_type_set ($syms, $TAG, @TAG);
+      $$ = symbol_list_type_set ($syms, $TAG);
     }
 | symbol_decls TAG symbol_decl.1[syms]
     {
-      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG, @TAG));
+      $$ = symbol_list_append ($1, symbol_list_type_set ($syms, $TAG));
     }
 ;
 
diff --git a/src/symlist.c b/src/symlist.c
index 9bb0deaa..55c1fb6b 100644
--- a/src/symlist.c
+++ b/src/symlist.c
@@ -83,10 +83,10 @@ symbol_list_type_new (uniqstr type_name, location loc)
 
 
 symbol_list *
-symbol_list_type_set (symbol_list *syms, uniqstr type_name, location loc)
+symbol_list_type_set (symbol_list *syms, uniqstr type_name)
 {
   for (symbol_list *l = syms; l; l = l->next)
-    symbol_type_set (l->content.sym, type_name, loc);
+    symbol_type_set (l->content.sym, type_name, l->sym_loc);
   return syms;
 }
 
diff --git a/src/symlist.h b/src/symlist.h
index d94b7aa1..39fdec40 100644
--- a/src/symlist.h
+++ b/src/symlist.h
@@ -110,8 +110,7 @@ symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
 
 /** Assign the type \c type_name to all the members of \c syms.
  ** \returns \c syms */
-symbol_list *symbol_list_type_set (symbol_list *syms,
-                                   uniqstr type_name, location loc);
+symbol_list *symbol_list_type_set (symbol_list *syms, uniqstr type_name);
 
 /** Print this list.
 
diff --git a/tests/input.at b/tests/input.at
index effcd1cc..f5035c3c 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -1252,12 +1252,12 @@ AT_TEST([[%token foo "foo"
 %%
 exp: foo;
 ]],
-[[input.y:3.7-11: error: %type redeclaration for foo
+[[input.y:3.13-15: error: %type redeclaration for foo
     3 | %type <baz> foo
-      |       ^~~~~
-input.y:2.7-11: note: previous declaration
+      |             ^~~
+input.y:2.13-17: note: previous declaration
     2 | %type <bar> "foo"
-      |       ^~~~~
+      |             ^~~~~
 ]])
 
 AT_TEST([[%token foo "foo"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.