From: Philip Herron <herron.phi...@googlemail.com> gcc/rust/ChangeLog:
* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): track DefId of origin * typecheck/rust-tyty.cc (BaseType::monomorphized_clone): likewise (ADTType::ADTType): likewise (ADTType::get_id): likewise (ADTType::clone): likewise * typecheck/rust-tyty.h: likewise Signed-off-by: Philip Herron <herron.phi...@googlemail.com> --- .../typecheck/rust-hir-type-check-item.cc | 8 +++- gcc/rust/typecheck/rust-tyty.cc | 47 ++++++++++++++++++- gcc/rust/typecheck/rust-tyty.h | 39 ++++++--------- 3 files changed, 65 insertions(+), 29 deletions(-) diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc b/gcc/rust/typecheck/rust-hir-type-check-item.cc index 16c664fb595..a003848cce0 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-item.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc @@ -232,6 +232,7 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl) = parse_repr_options (attrs, struct_decl.get_locus ()); auto *type = new TyTy::ADTType ( + struct_decl.get_mappings ().get_defid (), struct_decl.get_mappings ().get_hirid (), struct_decl.get_mappings ().get_hirid (), struct_decl.get_identifier ().as_string (), ident, @@ -314,6 +315,7 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl) = parse_repr_options (attrs, struct_decl.get_locus ()); auto *type = new TyTy::ADTType ( + struct_decl.get_mappings ().get_defid (), struct_decl.get_mappings ().get_hirid (), struct_decl.get_mappings ().get_hirid (), struct_decl.get_identifier ().as_string (), ident, @@ -376,7 +378,8 @@ TypeCheckItem::visit (HIR::Enum &enum_decl) // multi variant ADT auto *type - = new TyTy::ADTType (enum_decl.get_mappings ().get_hirid (), + = new TyTy::ADTType (enum_decl.get_mappings ().get_defid (), + enum_decl.get_mappings ().get_hirid (), enum_decl.get_mappings ().get_hirid (), enum_decl.get_identifier ().as_string (), ident, TyTy::ADTType::ADTKind::ENUM, std::move (variants), @@ -447,7 +450,8 @@ TypeCheckItem::visit (HIR::Union &union_decl) std::move (fields))); auto *type - = new TyTy::ADTType (union_decl.get_mappings ().get_hirid (), + = new TyTy::ADTType (union_decl.get_mappings ().get_defid (), + union_decl.get_mappings ().get_hirid (), union_decl.get_mappings ().get_hirid (), union_decl.get_identifier ().as_string (), ident, TyTy::ADTType::ADTKind::UNION, std::move (variants), diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc index 5d5da4d258c..3951fa88da8 100644 --- a/gcc/rust/typecheck/rust-tyty.cc +++ b/gcc/rust/typecheck/rust-tyty.cc @@ -638,7 +638,7 @@ BaseType::monomorphized_clone () const for (auto &variant : adt->get_variants ()) cloned_variants.push_back (variant->monomorphized_clone ()); - return new ADTType (adt->get_ref (), adt->get_ty_ref (), + return new ADTType (adt->get_id (), adt->get_ref (), adt->get_ty_ref (), adt->get_identifier (), adt->ident, adt->get_adt_kind (), cloned_variants, adt->clone_substs (), adt->get_repr_options (), @@ -1621,6 +1621,43 @@ VariantDef::get_ident () const // ADTType +ADTType::ADTType (DefId id, HirId ref, std::string identifier, RustIdent ident, + ADTKind adt_kind, std::vector<VariantDef *> variants, + std::vector<SubstitutionParamMapping> subst_refs, + SubstitutionArgumentMappings generic_arguments, + RegionConstraints region_constraints, std::set<HirId> refs) + : BaseType (ref, ref, TypeKind::ADT, ident, refs), + SubstitutionRef (std::move (subst_refs), std::move (generic_arguments), + region_constraints), + id (id), identifier (identifier), variants (variants), adt_kind (adt_kind) +{} + +ADTType::ADTType (DefId id, HirId ref, HirId ty_ref, std::string identifier, + RustIdent ident, ADTKind adt_kind, + std::vector<VariantDef *> variants, + std::vector<SubstitutionParamMapping> subst_refs, + SubstitutionArgumentMappings generic_arguments, + RegionConstraints region_constraints, std::set<HirId> refs) + : BaseType (ref, ty_ref, TypeKind::ADT, ident, refs), + SubstitutionRef (std::move (subst_refs), std::move (generic_arguments), + region_constraints), + id (id), identifier (identifier), variants (variants), adt_kind (adt_kind) +{} + +ADTType::ADTType (DefId id, HirId ref, HirId ty_ref, std::string identifier, + RustIdent ident, ADTKind adt_kind, + std::vector<VariantDef *> variants, + std::vector<SubstitutionParamMapping> subst_refs, + ReprOptions repr, + SubstitutionArgumentMappings generic_arguments, + RegionConstraints region_constraints, std::set<HirId> refs) + : BaseType (ref, ty_ref, TypeKind::ADT, ident, refs), + SubstitutionRef (std::move (subst_refs), std::move (generic_arguments), + region_constraints), + id (id), identifier (identifier), variants (variants), adt_kind (adt_kind), + repr (repr) +{} + void ADTType::accept_vis (TyVisitor &vis) { @@ -1702,6 +1739,12 @@ ADTType::is_equal (const BaseType &other) const return true; } +DefId +ADTType::get_id () const +{ + return id; +} + BaseType * ADTType::clone () const { @@ -1709,7 +1752,7 @@ ADTType::clone () const for (auto &variant : variants) cloned_variants.push_back (variant->clone ()); - return new ADTType (get_ref (), get_ty_ref (), identifier, ident, + return new ADTType (get_id (), get_ref (), get_ty_ref (), identifier, ident, get_adt_kind (), cloned_variants, clone_substs (), get_repr_options (), used_arguments, get_region_constraints (), get_combined_refs ()); diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h index f83caec3bd0..def7cb2169c 100644 --- a/gcc/rust/typecheck/rust-tyty.h +++ b/gcc/rust/typecheck/rust-tyty.h @@ -686,45 +686,31 @@ public: BaseType *repr = nullptr; }; - ADTType (HirId ref, std::string identifier, RustIdent ident, ADTKind adt_kind, - std::vector<VariantDef *> variants, + ADTType (DefId id, HirId ref, std::string identifier, RustIdent ident, + ADTKind adt_kind, std::vector<VariantDef *> variants, std::vector<SubstitutionParamMapping> subst_refs, SubstitutionArgumentMappings generic_arguments = SubstitutionArgumentMappings::error (), RegionConstraints region_constraints = RegionConstraints{}, - std::set<HirId> refs = std::set<HirId> ()) - : BaseType (ref, ref, TypeKind::ADT, ident, refs), - SubstitutionRef (std::move (subst_refs), std::move (generic_arguments), - region_constraints), - identifier (identifier), variants (variants), adt_kind (adt_kind) - {} + std::set<HirId> refs = std::set<HirId> ()); - ADTType (HirId ref, HirId ty_ref, std::string identifier, RustIdent ident, - ADTKind adt_kind, std::vector<VariantDef *> variants, + ADTType (DefId id, HirId ref, HirId ty_ref, std::string identifier, + RustIdent ident, ADTKind adt_kind, + std::vector<VariantDef *> variants, std::vector<SubstitutionParamMapping> subst_refs, SubstitutionArgumentMappings generic_arguments = SubstitutionArgumentMappings::error (), RegionConstraints region_constraints = RegionConstraints{}, - std::set<HirId> refs = std::set<HirId> ()) - : BaseType (ref, ty_ref, TypeKind::ADT, ident, refs), - SubstitutionRef (std::move (subst_refs), std::move (generic_arguments), - region_constraints), - identifier (identifier), variants (variants), adt_kind (adt_kind) - {} + std::set<HirId> refs = std::set<HirId> ()); - ADTType (HirId ref, HirId ty_ref, std::string identifier, RustIdent ident, - ADTKind adt_kind, std::vector<VariantDef *> variants, + ADTType (DefId id, HirId ref, HirId ty_ref, std::string identifier, + RustIdent ident, ADTKind adt_kind, + std::vector<VariantDef *> variants, std::vector<SubstitutionParamMapping> subst_refs, ReprOptions repr, SubstitutionArgumentMappings generic_arguments = SubstitutionArgumentMappings::error (), RegionConstraints region_constraints = RegionConstraints{}, - std::set<HirId> refs = std::set<HirId> ()) - : BaseType (ref, ty_ref, TypeKind::ADT, ident, refs), - SubstitutionRef (std::move (subst_refs), std::move (generic_arguments), - region_constraints), - identifier (identifier), variants (variants), adt_kind (adt_kind), - repr (repr) - {} + std::set<HirId> refs = std::set<HirId> ()); ADTKind get_adt_kind () const { return adt_kind; } @@ -755,6 +741,8 @@ public: return identifier + subst_as_string (); } + DefId get_id () const; + BaseType *clone () const final override; size_t number_of_variants () const { return variants.size (); } @@ -800,6 +788,7 @@ public: handle_substitions (SubstitutionArgumentMappings &mappings) override final; private: + DefId id; std::string identifier; std::vector<VariantDef *> variants; ADTType::ADTKind adt_kind; -- 2.45.2