]> git.saurik.com Git - bison.git/commitdiff
diagnostics: fix the order of multiple declarations reports
authorAkim Demaille <akim@lrde.epita.fr>
Mon, 9 Dec 2013 14:26:52 +0000 (15:26 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Mon, 9 Dec 2013 15:53:03 +0000 (16:53 +0100)
On

  %token FOO "foo"
  %printer {} "foo"
  %printer {} FOO

we report

  /tmp/foo.yy:2.10-11: error: %printer redeclaration for FOO
   %printer {} "foo"
            ^^
  /tmp/foo.yy:3.10-11:     previous declaration
   %printer {} FOO
            ^^

* src/symtab.c (locations_sort): New.
Use it.
* tests/input.at (Invalid Aliases): Stress the order of diagnostics.

NEWS
src/symtab.c
tests/input.at

diff --git a/NEWS b/NEWS
index 39322da8a5839b38e3682db1d0f2f21457a94ad5..689c50195083884e43832284d2c8312d52dcefe1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,27 @@ GNU Bison NEWS
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Bug fixes
+
+*** Redeclarations are reported in proper order
+
+  On
+
+    %token FOO "foo"
+    %printer {} "foo"
+    %printer {} FOO
+
+  bison used to report:
+
+    /tmp/foo.yy:2.10-11: error: %printer redeclaration for FOO
+     %printer {} "foo"
+              ^^
+    /tmp/foo.yy:3.10-11:     previous declaration
+     %printer {} FOO
+              ^^
+
+  Now, the "previous" declaration is always the first one.
+
 
 * Noteworthy changes in release 3.0.2 (2013-12-05) [stable]
 
index 1b446119ce99498e0598b444d7f3426c0af3c92f..acbc58dfad1c934c522c368d3897fe1754e20ae4 100644 (file)
@@ -122,6 +122,19 @@ void symbols_sort (symbol **first, symbol **second)
     }
 }
 
+/* Likewise, for locations.  */
+
+static
+void locations_sort (location *first, location *second)
+{
+  if (0 < location_cmp (*first, *second))
+    {
+      location tmp = *first;
+      *first = *second;
+      *second = tmp;
+    }
+}
+
 char const *
 code_props_type_string (code_props_type kind)
 {
@@ -232,6 +245,7 @@ symbol_redeclaration (symbol *s, const char *what, location first,
                       location second)
 {
   unsigned i = 0;
+  locations_sort (&first, &second);
   complain_indent (&second, complaint, &i,
                    _("%s redeclaration for %s"), what, s->tag);
   i += SUB_INDENT;
@@ -244,6 +258,7 @@ semantic_type_redeclaration (semantic_type *s, const char *what, location first,
                              location second)
 {
   unsigned i = 0;
+  locations_sort (&first, &second);
   complain_indent (&second, complaint, &i,
                    _("%s redeclaration for <%s>"), what, s->tag);
   i += SUB_INDENT;
index 4ddf955aabe8f466aef248a3f6a7ab03ccc46d1b..28a0a038ba7763baf3a7151804f0e667cf08f443 100644 (file)
@@ -654,50 +654,118 @@ AT_CLEANUP
 
 AT_SETUP([Incompatible Aliases])
 
-AT_DATA([input.y],
-[[%token foo "foo"
+m4_pushdef([AT_TEST],
+[AT_DATA([input.y], [$1])
+AT_BISON_CHECK([-fcaret input.y], [1], [], [$2])
+])
 
-%type <bar>       foo
-%printer {bar}    foo
-%destructor {bar} foo
-%left             foo
+# Use the string-alias first to check the order between "first
+# declaration" and second.
 
-%type <baz>       "foo"
-%printer {baz}    "foo"
-%destructor {baz} "foo"
-%left             "foo"
+AT_TEST([[%token foo "foo"
+%type <bar> "foo"
+%type <baz> foo
+%%
+exp: foo;
+]],
+[[input.y:3.7-11: error: %type redeclaration for foo
+ %type <baz> foo
+       ^^^^^
+input.y:2.7-11:     previous declaration
+ %type <bar> "foo"
+       ^^^^^
+]])
 
+AT_TEST([[%token foo "foo"
+%printer {bar} "foo"
+%printer {baz} foo
 %%
 exp: foo;
+]],
+[[input.y:3.10-14: error: %printer redeclaration for foo
+ %printer {baz} foo
+          ^^^^^
+input.y:2.10-14:     previous declaration
+ %printer {bar} "foo"
+          ^^^^^
 ]])
 
-AT_BISON_CHECK([-fcaret input.y], [1], [],
-[[input.y:8.7-11: error: %type redeclaration for foo
- %type <baz>       "foo"
-       ^^^^^
-input.y:3.7-11:     previous declaration
- %type <bar>       foo
-       ^^^^^
-input.y:10.13-17: error: %destructor redeclaration for foo
- %destructor {baz} "foo"
+AT_TEST([[%token foo "foo"
+%destructor {bar} "foo"
+%destructor {baz} foo
+%%
+exp: foo;
+]],
+[[input.y:3.13-17: error: %destructor redeclaration for foo
+ %destructor {baz} foo
              ^^^^^
-input.y:5.13-17:      previous declaration
- %destructor {bar} foo
+input.y:2.13-17:     previous declaration
+ %destructor {bar} "foo"
              ^^^^^
-input.y:9.10-14: error: %printer redeclaration for foo
- %printer {baz}    "foo"
-          ^^^^^
-input.y:4.10-14:     previous declaration
- %printer {bar}    foo
-          ^^^^^
-input.y:11.1-5: error: %left redeclaration for foo
- %left             "foo"
+]])
+
+AT_TEST([[%token foo "foo"
+%left "foo"
+%left foo
+%%
+exp: foo;
+]],
+[[input.y:3.1-5: error: %left redeclaration for foo
+ %left foo
+ ^^^^^
+input.y:2.1-5:     previous declaration
+ %left "foo"
+ ^^^^^
+]])
+
+# This time, declare the alias after its use.
+
+# Precedence/associativity.
+AT_TEST([[%left "foo"
+%left foo
+%token foo "foo"
+%%
+exp: foo;
+]],
+[[input.y:2.1-5: error: %left redeclaration for foo
+ %left foo
  ^^^^^
-input.y:6.1-5:      previous declaration
- %left             foo
+input.y:1.1-5:     previous declaration
+ %left "foo"
  ^^^^^
 ]])
 
+# Printer.
+AT_TEST([[%printer {} "foo"
+%printer {} foo
+%token foo "foo"
+%%
+exp: foo;
+]],
+[[input.y:2.10-11: error: %printer redeclaration for foo
+ %printer {} foo
+          ^^
+input.y:1.10-11:     previous declaration
+ %printer {} "foo"
+          ^^
+]])
+
+# Destructor.
+AT_TEST([[%destructor {} "foo"
+%destructor {} foo
+%token foo "foo"
+%%
+exp: foo;
+]],
+[[input.y:2.13-14: error: %destructor redeclaration for foo
+ %destructor {} foo
+             ^^
+input.y:1.13-14:     previous declaration
+ %destructor {} "foo"
+             ^^
+]])
+
+m4_popdef([AT_TEST])
 AT_CLEANUP