diff options
author | Akim Demaille <akim.demaille@gmail.com> | 2020-12-31 07:55:05 +0100 |
---|---|---|
committer | Akim Demaille <akim.demaille@gmail.com> | 2021-01-23 15:02:49 +0100 |
commit | 3abad26a2d0c063719745156dc2d40681c5f969d (patch) | |
tree | 318776a1f8030ea8cd442028ebe169baab94ed6a /src | |
parent | 1bac4ecc44f6b7a20b4688b2cb9eeecc91bdb503 (diff) | |
download | bison-3abad26a2d0c063719745156dc2d40681c5f969d.tar.gz |
%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.
Diffstat (limited to 'src')
-rw-r--r-- | src/reader.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/reader.c b/src/reader.c index b71dd916..a43c5e41 100644 --- a/src/reader.c +++ b/src/reader.c @@ -122,19 +122,24 @@ record_merge_function_type (int merger, symbol *sym, location declaration_loc) merge_function = merge_function->next) merger_find += 1; aver (merge_function != NULL && merger_find == merger); - if (merge_function->sym && merge_function->sym->content->type_name - && !UNIQSTR_EQ (merge_function->sym->content->type_name, type)) + if (merge_function->sym && merge_function->sym->content->type_name) { - complain (&declaration_loc, complaint, - _("result type clash on merge function %s: " - "<%s> != <%s>"), - quote (merge_function->name), type, - merge_function->sym->content->type_name); - subcomplain (&merge_function->type_declaration_loc, complaint, - _("previous declaration")); + if (!UNIQSTR_EQ (merge_function->sym->content->type_name, type)) + { + complain (&declaration_loc, complaint, + _("result type clash on merge function %s: " + "<%s> != <%s>"), + quote (merge_function->name), type, + 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; } /*--------------------------------------. |