summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2020-12-31 07:55:05 +0100
committerAkim Demaille <akim.demaille@gmail.com>2021-01-23 15:02:49 +0100
commit3abad26a2d0c063719745156dc2d40681c5f969d (patch)
tree318776a1f8030ea8cd442028ebe169baab94ed6a /src
parent1bac4ecc44f6b7a20b4688b2cb9eeecc91bdb503 (diff)
downloadbison-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.c27
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;
}
/*--------------------------------------.