bison-patches
[Top][All Lists]
Advanced

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

diagnostics: better location for type redeclarations


From: Akim Demaille
Subject: diagnostics: better location for type redeclarations
Date: Sat, 1 Aug 2020 09:01:19 +0200

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 <akim.demaille@gmail.com>
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"




reply via email to

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