From d50fc0c7623c3562022637427eb145164d293437 Mon Sep 17 00:00:00 2001 From: Arthur Cohen Date: Tue, 4 Feb 2025 16:12:25 +0100 Subject: [PATCH] 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. --- gcc/rust/expand/rust-derive-eq.cc | 64 +++++++++++++++++-------------- gcc/rust/expand/rust-derive-eq.h | 10 ++--- gcc/rust/expand/rust-derive.cc | 2 +- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/gcc/rust/expand/rust-derive-eq.cc b/gcc/rust/expand/rust-derive-eq.cc index a2a7a769065..153e35693ea 100644 --- a/gcc/rust/expand/rust-derive-eq.cc +++ b/gcc/rust/expand/rust-derive-eq.cc @@ -27,6 +27,16 @@ namespace Rust { namespace AST { +DeriveEq::DeriveEq (location_t loc) : DeriveVisitor (loc) {} + +std::vector> +DeriveEq::go (Item &item) +{ + item.accept_vis (*this); + + return std::move (expanded); +} + std::unique_ptr DeriveEq::assert_receiver_is_total_eq_fn ( std::vector> &&types) @@ -98,33 +108,29 @@ DeriveEq::assert_type_is_eq (std::unique_ptr &&type) return builder.let (builder.wildcard (), std::move (full_path)); } -std::unique_ptr -DeriveEq::eq_impl ( +std::vector> +DeriveEq::eq_impls ( std::unique_ptr &&fn, std::string name, const std::vector> &type_generics) { auto eq = builder.type_path ({"core", "cmp", "Eq"}, true); + auto steq = builder.type_path (LangItem::Kind::STRUCTURAL_TEQ); auto trait_items = vec (std::move (fn)); - auto generics + auto eq_generics = setup_impl_generics (name, type_generics, builder.trait_bound (eq)); + auto steq_generics = setup_impl_generics (name, type_generics); - return builder.trait_impl (eq, std::move (generics.self_type), - std::move (trait_items), - std::move (generics.impl)); -} - -DeriveEq::DeriveEq (location_t loc) : DeriveVisitor (loc), expanded (nullptr) {} - -std::unique_ptr -DeriveEq::go (Item &item) -{ - item.accept_vis (*this); + auto eq_impl = builder.trait_impl (eq, std::move (eq_generics.self_type), + std::move (trait_items), + std::move (eq_generics.impl)); + auto steq_impl + = builder.trait_impl (steq, std::move (steq_generics.self_type), + std::move (trait_items), + std::move (steq_generics.impl)); - rust_assert (expanded); - - return std::move (expanded); + return vec (std::move (eq_impl), std::move (steq_impl)); } void @@ -135,9 +141,9 @@ DeriveEq::visit_tuple (TupleStruct &item) for (auto &field : item.get_fields ()) types.emplace_back (field.get_field_type ().clone_type ()); - expanded - = eq_impl (assert_receiver_is_total_eq_fn (std::move (types)), - item.get_identifier ().as_string (), item.get_generic_params ()); + expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)), + item.get_identifier ().as_string (), + item.get_generic_params ()); } void @@ -148,9 +154,9 @@ DeriveEq::visit_struct (StructStruct &item) for (auto &field : item.get_fields ()) types.emplace_back (field.get_field_type ().clone_type ()); - expanded - = eq_impl (assert_receiver_is_total_eq_fn (std::move (types)), - item.get_identifier ().as_string (), item.get_generic_params ()); + expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)), + item.get_identifier ().as_string (), + item.get_generic_params ()); } void @@ -185,9 +191,9 @@ DeriveEq::visit_enum (Enum &item) } } - expanded - = eq_impl (assert_receiver_is_total_eq_fn (std::move (types)), - item.get_identifier ().as_string (), item.get_generic_params ()); + expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)), + item.get_identifier ().as_string (), + item.get_generic_params ()); } void @@ -198,9 +204,9 @@ DeriveEq::visit_union (Union &item) for (auto &field : item.get_variants ()) types.emplace_back (field.get_field_type ().clone_type ()); - expanded - = eq_impl (assert_receiver_is_total_eq_fn (std::move (types)), - item.get_identifier ().as_string (), item.get_generic_params ()); + expanded = eq_impls (assert_receiver_is_total_eq_fn (std::move (types)), + item.get_identifier ().as_string (), + item.get_generic_params ()); } } // namespace AST diff --git a/gcc/rust/expand/rust-derive-eq.h b/gcc/rust/expand/rust-derive-eq.h index 655f1e82e02..17af52653de 100644 --- a/gcc/rust/expand/rust-derive-eq.h +++ b/gcc/rust/expand/rust-derive-eq.h @@ -31,10 +31,10 @@ class DeriveEq : DeriveVisitor public: DeriveEq (location_t loc); - std::unique_ptr go (Item &item); + std::vector> go (Item &item); private: - std::unique_ptr expanded; + std::vector> expanded; /** * Create the actual `assert_receiver_is_total_eq` function of the @@ -52,9 +52,9 @@ class DeriveEq : DeriveVisitor * } * */ - std::unique_ptr - eq_impl (std::unique_ptr &&fn, std::string name, - const std::vector> &type_generics); + std::vector> + eq_impls (std::unique_ptr &&fn, std::string name, + const std::vector> &type_generics); /** * Generate the following structure definition diff --git a/gcc/rust/expand/rust-derive.cc b/gcc/rust/expand/rust-derive.cc index 56e0e9410fb..8223281ed18 100644 --- a/gcc/rust/expand/rust-derive.cc +++ b/gcc/rust/expand/rust-derive.cc @@ -50,7 +50,7 @@ DeriveVisitor::derive (Item &item, const Attribute &attr, case BuiltinMacro::Default: return vec (DeriveDefault (attr.get_locus ()).go (item)); case BuiltinMacro::Eq: - return vec (DeriveEq (attr.get_locus ()).go (item)); + return DeriveEq (attr.get_locus ()).go (item); case BuiltinMacro::PartialEq: return DerivePartialEq (attr.get_locus ()).go (item); case BuiltinMacro::Ord: