summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkim Demaille <akim@lrde.epita.fr>2013-12-09 15:26:52 +0100
committerAkim Demaille <akim@lrde.epita.fr>2013-12-09 16:53:03 +0100
commit461f1516f8d301f5be532e496f6def0d15e502ed (patch)
treec8fe57f0d23456b3691334c244a3003aed6bda0d
parent26eb4f0bdcd78ea56c05c49363b9fbe6072c425c (diff)
downloadbison-461f1516f8d301f5be532e496f6def0d15e502ed.tar.gz
diagnostics: fix the order of multiple declarations reports
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.
-rw-r--r--NEWS21
-rw-r--r--src/symtab.c15
-rw-r--r--tests/input.at130
3 files changed, 135 insertions, 31 deletions
diff --git a/NEWS b/NEWS
index 39322da8..689c5019 100644
--- 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]
diff --git a/src/symtab.c b/src/symtab.c
index 1b446119..acbc58df 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -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;
diff --git a/tests/input.at b/tests/input.at
index 4ddf955a..28a0a038 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -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