mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
diagnostics: always point to the first directive
Some directives cannot be used several times (e.g., a given symbol may only have a single printer). In case of repeated definitions, an error is issued for the second definition, yet it is not discarded, and becomes the definition used for the rest of the file. This is not consistent with the idea that multiple definitions are not allowed: discard any repeated directive. * src/symtab.c (symbol_type_set, symbol_code_props_set) (semantic_type_code_props_set, symbol_class_set, symbol_translation): Discard repeated directives. * tests/input.at (Default %printer and %destructor redeclared) (Per-type %printer and %destructor redeclared): Update expectations.
This commit is contained in:
22
src/symtab.c
22
src/symtab.c
@@ -243,9 +243,12 @@ symbol_type_set (symbol *sym, uniqstr type_name, location loc)
|
||||
{
|
||||
if (sym->type_name)
|
||||
symbol_redeclaration (sym, "%type", sym->type_location, loc);
|
||||
uniqstr_assert (type_name);
|
||||
sym->type_name = type_name;
|
||||
sym->type_location = loc;
|
||||
else
|
||||
{
|
||||
uniqstr_assert (type_name);
|
||||
sym->type_name = type_name;
|
||||
sym->type_location = loc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -261,7 +264,8 @@ symbol_code_props_set (symbol *sym, code_props_type kind,
|
||||
symbol_redeclaration (sym, code_props_type_string (kind),
|
||||
sym->props[kind].location,
|
||||
code->location);
|
||||
sym->props[kind] = *code;
|
||||
else
|
||||
sym->props[kind] = *code;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------.
|
||||
@@ -277,7 +281,8 @@ semantic_type_code_props_set (semantic_type *type,
|
||||
semantic_type_redeclaration (type, code_props_type_string (kind),
|
||||
type->props[kind].location,
|
||||
code->location);
|
||||
type->props[kind] = *code;
|
||||
else
|
||||
type->props[kind] = *code;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------.
|
||||
@@ -363,7 +368,8 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
|
||||
{
|
||||
if (sym->status == declared && !warned)
|
||||
complain (&loc, Wother, _("symbol %s redeclared"), sym->tag);
|
||||
sym->status = declared;
|
||||
else
|
||||
sym->status = declared;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,8 +624,8 @@ symbol_translation (symbol *this)
|
||||
(this->user_token_number,
|
||||
symbols[token_translations[this->user_token_number]],
|
||||
this);
|
||||
|
||||
token_translations[this->user_token_number] = this->number;
|
||||
else
|
||||
token_translations[this->user_token_number] = this->number;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user