Skip to content

Commit b9c5bdf

Browse files
committed
derive(Eq): Also derive StructuralEq
gcc/rust/ChangeLog: * expand/rust-derive-eq.cc: Adapt functions to return two generated impls. * expand/rust-derive-eq.h: Likewise. * expand/rust-derive.cc (DeriveVisitor::derive): Likewise.
1 parent bff0ff4 commit b9c5bdf

File tree

3 files changed

+41
-35
lines changed

3 files changed

+41
-35
lines changed

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

+35-29
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@
2727
namespace Rust {
2828
namespace AST {
2929

30+
DeriveEq::DeriveEq (location_t loc) : DeriveVisitor (loc) {}
31+
32+
std::vector<std::unique_ptr<AST::Item>>
33+
DeriveEq::go (Item &item)
34+
{
35+
item.accept_vis (*this);
36+
37+
return std::move (expanded);
38+
}
39+
3040
std::unique_ptr<AssociatedItem>
3141
DeriveEq::assert_receiver_is_total_eq_fn (
3242
std::vector<std::unique_ptr<Type>> &&types)
@@ -98,33 +108,29 @@ DeriveEq::assert_type_is_eq (std::unique_ptr<Type> &&type)
98108
return builder.let (builder.wildcard (), std::move (full_path));
99109
}
100110

101-
std::unique_ptr<Item>
102-
DeriveEq::eq_impl (
111+
std::vector<std::unique_ptr<Item>>
112+
DeriveEq::eq_impls (
103113
std::unique_ptr<AssociatedItem> &&fn, std::string name,
104114
const std::vector<std::unique_ptr<GenericParam>> &type_generics)
105115
{
106116
auto eq = builder.type_path ({"core", "cmp", "Eq"}, true);
117+
auto steq = builder.type_path (LangItem::Kind::STRUCTURAL_TEQ);
107118

108119
auto trait_items = vec (std::move (fn));
109120

110-
auto generics
121+
auto eq_generics
111122
= setup_impl_generics (name, type_generics, builder.trait_bound (eq));
123+
auto steq_generics = setup_impl_generics (name, type_generics);
112124

113-
return builder.trait_impl (eq, std::move (generics.self_type),
114-
std::move (trait_items),
115-
std::move (generics.impl));
116-
}
117-
118-
DeriveEq::DeriveEq (location_t loc) : DeriveVisitor (loc), expanded (nullptr) {}
119-
120-
std::unique_ptr<AST::Item>
121-
DeriveEq::go (Item &item)
122-
{
123-
item.accept_vis (*this);
125+
auto eq_impl = builder.trait_impl (eq, std::move (eq_generics.self_type),
126+
std::move (trait_items),
127+
std::move (eq_generics.impl));
128+
auto steq_impl
129+
= builder.trait_impl (steq, std::move (steq_generics.self_type),
130+
std::move (trait_items),
131+
std::move (steq_generics.impl));
124132

125-
rust_assert (expanded);
126-
127-
return std::move (expanded);
133+
return vec (std::move (eq_impl), std::move (steq_impl));
128134
}
129135

130136
void
@@ -135,9 +141,9 @@ DeriveEq::visit_tuple (TupleStruct &item)
135141
for (auto &field : item.get_fields ())
136142
types.emplace_back (field.get_field_type ().clone_type ());
137143

138-
expanded
139-
= eq_impl (assert_receiver_is_total_eq_fn (std::move (types)),
140-
item.get_identifier ().as_string (), item.get_generic_params ());
144+
expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)),
145+
item.get_identifier ().as_string (),
146+
item.get_generic_params ());
141147
}
142148

143149
void
@@ -148,9 +154,9 @@ DeriveEq::visit_struct (StructStruct &item)
148154
for (auto &field : item.get_fields ())
149155
types.emplace_back (field.get_field_type ().clone_type ());
150156

151-
expanded
152-
= eq_impl (assert_receiver_is_total_eq_fn (std::move (types)),
153-
item.get_identifier ().as_string (), item.get_generic_params ());
157+
expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)),
158+
item.get_identifier ().as_string (),
159+
item.get_generic_params ());
154160
}
155161

156162
void
@@ -185,9 +191,9 @@ DeriveEq::visit_enum (Enum &item)
185191
}
186192
}
187193

188-
expanded
189-
= eq_impl (assert_receiver_is_total_eq_fn (std::move (types)),
190-
item.get_identifier ().as_string (), item.get_generic_params ());
194+
expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)),
195+
item.get_identifier ().as_string (),
196+
item.get_generic_params ());
191197
}
192198

193199
void
@@ -198,9 +204,9 @@ DeriveEq::visit_union (Union &item)
198204
for (auto &field : item.get_variants ())
199205
types.emplace_back (field.get_field_type ().clone_type ());
200206

201-
expanded
202-
= eq_impl (assert_receiver_is_total_eq_fn (std::move (types)),
203-
item.get_identifier ().as_string (), item.get_generic_params ());
207+
expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)),
208+
item.get_identifier ().as_string (),
209+
item.get_generic_params ());
204210
}
205211

206212
} // namespace AST

gcc/rust/expand/rust-derive-eq.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ class DeriveEq : DeriveVisitor
3131
public:
3232
DeriveEq (location_t loc);
3333

34-
std::unique_ptr<AST::Item> go (Item &item);
34+
std::vector<std::unique_ptr<AST::Item>> go (Item &item);
3535

3636
private:
37-
std::unique_ptr<Item> expanded;
37+
std::vector<std::unique_ptr<Item>> expanded;
3838

3939
/**
4040
* Create the actual `assert_receiver_is_total_eq` function of the
@@ -52,9 +52,9 @@ class DeriveEq : DeriveVisitor
5252
* }
5353
*
5454
*/
55-
std::unique_ptr<Item>
56-
eq_impl (std::unique_ptr<AssociatedItem> &&fn, std::string name,
57-
const std::vector<std::unique_ptr<GenericParam>> &type_generics);
55+
std::vector<std::unique_ptr<Item>>
56+
eq_impls (std::unique_ptr<AssociatedItem> &&fn, std::string name,
57+
const std::vector<std::unique_ptr<GenericParam>> &type_generics);
5858

5959
/**
6060
* Generate the following structure definition

gcc/rust/expand/rust-derive.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ DeriveVisitor::derive (Item &item, const Attribute &attr,
5050
case BuiltinMacro::Default:
5151
return vec (DeriveDefault (attr.get_locus ()).go (item));
5252
case BuiltinMacro::Eq:
53-
return vec (DeriveEq (attr.get_locus ()).go (item));
53+
return DeriveEq (attr.get_locus ()).go (item);
5454
case BuiltinMacro::PartialEq:
5555
return DerivePartialEq (attr.get_locus ()).go (item);
5656
case BuiltinMacro::Ord:

0 commit comments

Comments
 (0)