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.
{
if (sym->type_name)
symbol_redeclaration (sym, "%type", sym->type_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;
+ }
symbol_redeclaration (sym, code_props_type_string (kind),
sym->props[kind].location,
code->location);
symbol_redeclaration (sym, code_props_type_string (kind),
sym->props[kind].location,
code->location);
- sym->props[kind] = *code;
+ else
+ sym->props[kind] = *code;
}
/*-----------------------------------------------------.
}
/*-----------------------------------------------------.
semantic_type_redeclaration (type, code_props_type_string (kind),
type->props[kind].location,
code->location);
semantic_type_redeclaration (type, code_props_type_string (kind),
type->props[kind].location,
code->location);
- type->props[kind] = *code;
+ else
+ type->props[kind] = *code;
}
/*---------------------------------------------------.
}
/*---------------------------------------------------.
{
if (sym->status == declared && !warned)
complain (&loc, Wother, _("symbol %s redeclared"), sym->tag);
{
if (sym->status == declared && !warned)
complain (&loc, Wother, _("symbol %s redeclared"), sym->tag);
- sym->status = declared;
+ else
+ sym->status = declared;
(this->user_token_number,
symbols[token_translations[this->user_token_number]],
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;
input.y:11.13-29: error: %destructor redeclaration for <>
%destructor { destroy ($$); } <>;
^^^^^^^^^^^^^^^^^
input.y:11.13-29: error: %destructor redeclaration for <>
%destructor { destroy ($$); } <>;
^^^^^^^^^^^^^^^^^
-input.y:4.13-29: previous declaration
- %destructor { destroy ($$); } <>
+input.y:1.13-29: previous declaration
+ %destructor { destroy ($$); } <> <>
^^^^^^^^^^^^^^^^^
input.y:12.10-24: error: %printer redeclaration for <>
%printer { print ($$); } <>;
^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^
input.y:12.10-24: error: %printer redeclaration for <>
%printer { print ($$); } <>;
^^^^^^^^^^^^^^^
-input.y:5.10-24: previous declaration
- %printer { print ($$); } <>
+input.y:2.10-24: previous declaration
+ %printer { print ($$); } <> <>
[[input.y:4.13-29: error: %destructor redeclaration for <field1>
input.y:1.13-29: previous declaration
input.y:4.13-29: error: %destructor redeclaration for <field1>
[[input.y:4.13-29: error: %destructor redeclaration for <field1>
input.y:1.13-29: previous declaration
input.y:4.13-29: error: %destructor redeclaration for <field1>
-input.y:4.13-29: previous declaration
+input.y:1.13-29: previous declaration
input.y:5.10-24: error: %printer redeclaration for <field2>
input.y:2.10-24: previous declaration
input.y:5.10-24: error: %printer redeclaration for <field2>
input.y:5.10-24: error: %printer redeclaration for <field2>
input.y:2.10-24: previous declaration
input.y:5.10-24: error: %printer redeclaration for <field2>
-input.y:5.10-24: previous declaration
+input.y:2.10-24: previous declaration
input.y:11.13-29: error: %destructor redeclaration for <field2>
input.y:1.13-29: previous declaration
input.y:11.13-29: error: %destructor redeclaration for <field1>
input.y:11.13-29: error: %destructor redeclaration for <field2>
input.y:1.13-29: previous declaration
input.y:11.13-29: error: %destructor redeclaration for <field1>
-input.y:4.13-29: previous declaration
+input.y:1.13-29: previous declaration
input.y:12.10-24: error: %printer redeclaration for <field2>
input.y:12.10-24: error: %printer redeclaration for <field2>
-input.y:5.10-24: previous declaration
+input.y:2.10-24: previous declaration
input.y:12.10-24: error: %printer redeclaration for <field1>
input.y:2.10-24: previous declaration
]])
input.y:12.10-24: error: %printer redeclaration for <field1>
input.y:2.10-24: previous declaration
]])