diff options
author | Akim Demaille <akim@lrde.epita.fr> | 2013-04-22 11:26:28 +0200 |
---|---|---|
committer | Akim Demaille <akim@lrde.epita.fr> | 2013-04-22 11:36:22 +0200 |
commit | d8ce7031024f463a8ba96fc7b2a75facdc52ecb9 (patch) | |
tree | 6c78041beadaa96a61cea9b45d36b053dd621145 /src | |
parent | 8782fe26cbbbcd4e53354344849ef9f0580caf8a (diff) | |
download | bison-d8ce7031024f463a8ba96fc7b2a75facdc52ecb9.tar.gz |
diagnostics: use appropriate location for useless precedence/associativity
* src/symtab.c (symbol_precedence_set): Use prec_location, not
location (which is the first occurrence of the symbol, possibly just
%token).
Also, as redefinitions are not allowed, keep the first values, not
the subsequent ones.
* tests/conflicts.at, tests/existing.at, tests/regression.at: Adjust.
Diffstat (limited to 'src')
-rw-r--r-- | src/symtab.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/symtab.c b/src/symtab.c index b132e07b..11a0d756 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -321,12 +321,15 @@ symbol_precedence_set (symbol *sym, int prec, assoc a, location loc) { if (a != undef_assoc) { - if (sym->prec != 0) + if (sym->prec) symbol_redeclaration (sym, assoc_to_string (a), sym->prec_location, loc); - sym->prec = prec; - sym->assoc = a; - sym->prec_location = loc; + else + { + sym->prec = prec; + sym->assoc = a; + sym->prec_location = loc; + } } /* Only terminals have a precedence. */ @@ -1153,14 +1156,14 @@ print_precedence_warnings (void) && !prec_nodes[i]->succ) { if (is_assoc_useless (s)) - complain (&s->location, Wprecedence, + complain (&s->prec_location, Wprecedence, _("useless precedence and associativity for %s"), s->tag); else if (s->assoc == precedence_assoc) - complain (&s->location, Wprecedence, + complain (&s->prec_location, Wprecedence, _("useless precedence for %s"), s->tag); } else if (is_assoc_useless (s)) - complain (&s->location, Wprecedence, + complain (&s->prec_location, Wprecedence, _("useless associativity for %s, use %%precedence"), s->tag); } free (used_assoc); |