Skip to content

Commit cbbf4ad

Browse files
CohenArthurphilberty
authored andcommitted
derive(Ord, Eq): Use different node IDs for variant paths
gcc/rust/ChangeLog: * expand/rust-derive-cmp-common.cc (EnumMatchBuilder::tuple): Create two different variant paths. (EnumMatchBuilder::strukt): Likewise. * expand/rust-derive-cmp-common.h: Change API. * expand/rust-derive-ord.cc (DeriveOrd::visit_enum): Use new EnumMatchBuilder API. * expand/rust-derive-partial-eq.cc (DerivePartialEq::visit_enum): Likewise. gcc/testsuite/ChangeLog: * rust/compile/derive_partial_ord1.rs: New test.
1 parent a103cb4 commit cbbf4ad

File tree

5 files changed

+496
-23
lines changed

5 files changed

+496
-23
lines changed

gcc/rust/expand/rust-derive-cmp-common.cc

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,23 @@ EnumMatchBuilder::tuple (EnumItem &variant_raw)
9696
});
9797
}
9898

99+
// TODO: Replace with `reconstruct()` instead of building these twice
100+
auto self_variant_path = builder.variant_path (enum_path, variant_path);
101+
auto other_variant_path = builder.variant_path (enum_path, variant_path);
102+
99103
auto self_pattern_items = std::unique_ptr<TupleStructItems> (
100104
new TupleStructItemsNoRange (std::move (self_patterns)));
101105
auto other_pattern_items = std::unique_ptr<TupleStructItems> (
102106
new TupleStructItemsNoRange (std::move (other_patterns)));
103107

104108
auto self_pattern = std::unique_ptr<Pattern> (
105109
new ReferencePattern (std::unique_ptr<Pattern> (new TupleStructPattern (
106-
variant_path, std::move (self_pattern_items))),
107-
false, false, builder.loc));
108-
auto other_pattern = std::unique_ptr<Pattern> (
109-
new ReferencePattern (std::unique_ptr<Pattern> (new TupleStructPattern (
110-
variant_path, std::move (other_pattern_items))),
110+
self_variant_path, std::move (self_pattern_items))),
111111
false, false, builder.loc));
112+
auto other_pattern = std::unique_ptr<Pattern> (new ReferencePattern (
113+
std::unique_ptr<Pattern> (new TupleStructPattern (
114+
other_variant_path, std::move (other_pattern_items))),
115+
false, false, builder.loc));
112116

113117
auto tuple_items = std::make_unique<TuplePatternItemsMultiple> (
114118
vec (std::move (self_pattern), std::move (other_pattern)));
@@ -155,16 +159,21 @@ EnumMatchBuilder::strukt (EnumItem &variant_raw)
155159
});
156160
}
157161

162+
// TODO: Replace with `reconstruct()` instead of building these twice
163+
auto self_variant_path = builder.variant_path (enum_path, variant_path);
164+
auto other_variant_path = builder.variant_path (enum_path, variant_path);
165+
158166
auto self_elts = StructPatternElements (std::move (self_fields));
159167
auto other_elts = StructPatternElements (std::move (other_fields));
160168

161-
auto self_pattern = std::unique_ptr<Pattern> (
162-
new ReferencePattern (std::unique_ptr<Pattern> (new StructPattern (
163-
variant_path, builder.loc, std::move (self_elts))),
164-
false, false, builder.loc));
169+
auto self_pattern = std::unique_ptr<Pattern> (new ReferencePattern (
170+
std::unique_ptr<Pattern> (new StructPattern (self_variant_path, builder.loc,
171+
std::move (self_elts))),
172+
false, false, builder.loc));
165173
auto other_pattern = std::unique_ptr<Pattern> (
166-
new ReferencePattern (std::unique_ptr<Pattern> (new StructPattern (
167-
variant_path, builder.loc, std::move (other_elts))),
174+
new ReferencePattern (std::unique_ptr<Pattern> (
175+
new StructPattern (other_variant_path, builder.loc,
176+
std::move (other_elts))),
168177
false, false, builder.loc));
169178

170179
auto tuple_items = std::make_unique<TuplePatternItemsMultiple> (

gcc/rust/expand/rust-derive-cmp-common.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,11 @@ class EnumMatchBuilder
6565
using ExprFn
6666
= std::function<std::unique_ptr<Expr> (std::vector<SelfOther> &&)>;
6767

68-
EnumMatchBuilder (PathInExpression &variant_path, ExprFn fn, Builder &builder)
69-
: variant_path (variant_path), fn (fn), builder (builder)
68+
EnumMatchBuilder (const std::string &enum_path,
69+
const std::string &variant_path, ExprFn fn,
70+
Builder &builder)
71+
: enum_path (enum_path), variant_path (variant_path), fn (fn),
72+
builder (builder)
7073
{}
7174

7275
/**
@@ -84,7 +87,8 @@ class EnumMatchBuilder
8487
MatchCase strukt (EnumItem &variant);
8588

8689
private:
87-
PathInExpression &variant_path;
90+
const std::string &enum_path;
91+
const std::string &variant_path;
8892
ExprFn fn;
8993
Builder &builder;
9094
};

gcc/rust/expand/rust-derive-ord.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,9 @@ DeriveOrd::visit_enum (Enum &item)
274274

275275
for (auto &variant : item.get_variants ())
276276
{
277-
auto variant_path
278-
= builder.variant_path (type_name,
279-
variant->get_identifier ().as_string ());
280277
auto enum_builder
281-
= EnumMatchBuilder (variant_path, recursive_match_fn, builder);
278+
= EnumMatchBuilder (type_name, variant->get_identifier ().as_string (),
279+
recursive_match_fn, builder);
282280

283281
switch (variant->get_enum_item_kind ())
284282
{

gcc/rust/expand/rust-derive-partial-eq.cc

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,9 @@ DerivePartialEq::visit_enum (Enum &item)
287287

288288
for (auto &variant : item.get_variants ())
289289
{
290-
auto variant_path
291-
= builder.variant_path (type_name,
292-
variant->get_identifier ().as_string ());
293-
294-
auto enum_builder = EnumMatchBuilder (variant_path, eq_expr_fn, builder);
290+
auto enum_builder
291+
= EnumMatchBuilder (type_name, variant->get_identifier ().as_string (),
292+
eq_expr_fn, builder);
295293

296294
switch (variant->get_enum_item_kind ())
297295
{

0 commit comments

Comments
 (0)