mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 04:13:03 +00:00
%merge: associate it to its first definition, not the latest
Currently each time we meet %merge we record this location as the
defining location (and symbol). Instead, record the first definition.
In the generated code we go from
yy0->A = merge (*yy0, *yy1);
to
yy0->S = merge (*yy0, *yy1);
where S was indeed the first symbol, and in the diagnostics we go from
glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
| ^~~~~~~
glr-regr18.y:29.18-24: note: previous declaration
29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
| ^~~~~~~
glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
31 | sym3: %merge<merge> { $$ = 0; } ;
| ^~~~~~~
glr-regr18.y:30.18-24: note: previous declaration
30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
| ^~~~~~~
to
glr-regr18.y:30.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
30 | sym2: sym3 %merge<merge> { $$ = $1; } ;
| ^~~~~~~
glr-regr18.y:29.18-24: note: previous declaration
29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
| ^~~~~~~
glr-regr18.y:31.13-19: error: result type clash on merge function 'merge': <type3> != <type1>
31 | sym3: %merge<merge> { $$ = 0; } ;
| ^~~~~~~
glr-regr18.y:29.18-24: note: previous declaration
29 | sym1: sym2 %merge<merge> { $$ = $1; } ;
| ^~~~~~~
where both duplicates are reported against definition 1, rather than
using definition 1 as a reference when diagnosing about definition 2,
and then 2 as a reference for 3.
* src/reader.c (record_merge_function_type): Keep the first definition.
* tests/glr-regression.at: Adjust.
This commit is contained in:
27
src/reader.c
27
src/reader.c
@@ -122,19 +122,24 @@ record_merge_function_type (int merger, symbol *sym, location declaration_loc)
|
|||||||
merge_function = merge_function->next)
|
merge_function = merge_function->next)
|
||||||
merger_find += 1;
|
merger_find += 1;
|
||||||
aver (merge_function != NULL && merger_find == merger);
|
aver (merge_function != NULL && merger_find == merger);
|
||||||
if (merge_function->sym && merge_function->sym->content->type_name
|
if (merge_function->sym && merge_function->sym->content->type_name)
|
||||||
&& !UNIQSTR_EQ (merge_function->sym->content->type_name, type))
|
|
||||||
{
|
{
|
||||||
complain (&declaration_loc, complaint,
|
if (!UNIQSTR_EQ (merge_function->sym->content->type_name, type))
|
||||||
_("result type clash on merge function %s: "
|
{
|
||||||
"<%s> != <%s>"),
|
complain (&declaration_loc, complaint,
|
||||||
quote (merge_function->name), type,
|
_("result type clash on merge function %s: "
|
||||||
merge_function->sym->content->type_name);
|
"<%s> != <%s>"),
|
||||||
subcomplain (&merge_function->type_declaration_loc, complaint,
|
quote (merge_function->name), type,
|
||||||
_("previous declaration"));
|
merge_function->sym->content->type_name);
|
||||||
|
subcomplain (&merge_function->type_declaration_loc, complaint,
|
||||||
|
_("previous declaration"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
merge_function->sym = sym;
|
||||||
|
merge_function->type_declaration_loc = declaration_loc;
|
||||||
}
|
}
|
||||||
merge_function->sym = sym;
|
|
||||||
merge_function->type_declaration_loc = declaration_loc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------.
|
/*--------------------------------------.
|
||||||
|
|||||||
@@ -1682,11 +1682,11 @@ AT_BISON_CHECK([[-o glr-regr18.c -rall -fcaret glr-regr18.y]], 1, [],
|
|||||||
glr-regr18.y:27.18-24: note: previous declaration
|
glr-regr18.y:27.18-24: note: previous declaration
|
||||||
27 | sym1: sym2 %merge<merge> { $$ = $][1; } ;
|
27 | sym1: sym2 %merge<merge> { $$ = $][1; } ;
|
||||||
| ^~~~~~~
|
| ^~~~~~~
|
||||||
glr-regr18.y:29.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
|
glr-regr18.y:29.13-19: error: result type clash on merge function 'merge': <type3> != <type1>
|
||||||
29 | sym3: %merge<merge> { $$ = 0; } ;
|
29 | sym3: %merge<merge> { $$ = 0; } ;
|
||||||
| ^~~~~~~
|
| ^~~~~~~
|
||||||
glr-regr18.y:28.18-24: note: previous declaration
|
glr-regr18.y:27.18-24: note: previous declaration
|
||||||
28 | sym2: sym3 %merge<merge> { $$ = $][1; } ;
|
27 | sym1: sym2 %merge<merge> { $$ = $][1; } ;
|
||||||
| ^~~~~~~
|
| ^~~~~~~
|
||||||
]])
|
]])
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user