diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/backend/rust-compile-resolve-path.cc | 6 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile.cc | 6 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-path-probe.h | 50 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-ref.h | 10 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.h | 20 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-bounds.h | 5 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-base.h | 2 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.h | 4 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-item.h | 14 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-type.h | 5 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check.h | 4 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty-bounds.cc | 20 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.cc | 6 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.h | 18 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/traits7.rs | 24 |
15 files changed, 112 insertions, 82 deletions
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc index 52bdbb0..5f07a2a 100644 --- a/gcc/rust/backend/rust-compile-resolve-path.cc +++ b/gcc/rust/backend/rust-compile-resolve-path.cc @@ -107,10 +107,10 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) = ctx->get_mappings ()->lookup_trait_item_mapping ( trait_item->get_mappings ().get_hirid ()); - Resolver::TraitReference &trait_ref - = Resolver::TraitReference::error_node (); + Resolver::TraitReference *trait_ref + = &Resolver::TraitReference::error_node (); bool ok = ctx->get_tyctx ()->lookup_trait_reference ( - trait->get_mappings ().get_defid (), trait_ref); + trait->get_mappings ().get_defid (), &trait_ref); rust_assert (ok); TyTy::BaseType *receiver = nullptr; diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc index c93f08c..3c6a188 100644 --- a/gcc/rust/backend/rust-compile.cc +++ b/gcc/rust/backend/rust-compile.cc @@ -150,10 +150,10 @@ CompileExpr::visit (HIR::MethodCallExpr &expr) HIR::Trait *trait = ctx->get_mappings ()->lookup_trait_item_mapping ( trait_item->get_mappings ().get_hirid ()); - Resolver::TraitReference &trait_ref - = Resolver::TraitReference::error_node (); + Resolver::TraitReference *trait_ref + = &Resolver::TraitReference::error_node (); bool ok = ctx->get_tyctx ()->lookup_trait_reference ( - trait->get_mappings ().get_defid (), trait_ref); + trait->get_mappings ().get_defid (), &trait_ref); rust_assert (ok); TyTy::BaseType *receiver = nullptr; diff --git a/gcc/rust/typecheck/rust-hir-path-probe.h b/gcc/rust/typecheck/rust-hir-path-probe.h index 8e3ca31..87c9662 100644 --- a/gcc/rust/typecheck/rust-hir-path-probe.h +++ b/gcc/rust/typecheck/rust-hir-path-probe.h @@ -49,8 +49,8 @@ struct PathProbeCandidate struct TraitItemCandidate { - const TraitReference &trait_ref; - const TraitItemReference &item_ref; + const TraitReference *trait_ref; + const TraitItemReference *item_ref; }; CandidateType type; @@ -128,18 +128,18 @@ public: if (!probe_bounds) return probe.candidates; - std::vector<std::reference_wrapper<TraitReference>> probed_bounds + std::vector<TraitReference *> probed_bounds = TypeBoundsProbe::Probe (receiver); - std::vector<std::reference_wrapper<const TraitReference>> specified_bounds; + std::vector<const TraitReference *> specified_bounds; for (const TyTy::TypeBoundPredicate &predicate : receiver->get_specified_bounds ()) { const TraitReference *trait_item = predicate.get (); - specified_bounds.push_back (*trait_item); + specified_bounds.push_back (trait_item); } - std::vector<std::reference_wrapper<const TraitReference>> union_type_bounds + std::vector<const TraitReference *> union_type_bounds = probe.union_bounds (probed_bounds, specified_bounds); probe.process_traits_for_candidates (union_type_bounds, ignore_mandatory_trait_items); @@ -230,22 +230,22 @@ private: } void process_traits_for_candidates ( - const std::vector<std::reference_wrapper<const TraitReference>> traits, + const std::vector<const TraitReference *> traits, bool ignore_mandatory_trait_items) { - for (const TraitReference &trait_ref : traits) + for (const TraitReference *trait_ref : traits) { - const TraitItemReference &trait_item_ref - = trait_ref.lookup_trait_item (search.as_string ()); - if (trait_item_ref.is_error ()) + const TraitItemReference *trait_item_ref = nullptr; + if (!trait_ref->lookup_trait_item (search.as_string (), + &trait_item_ref)) continue; - bool trait_item_needs_implementation = !trait_item_ref.is_optional (); + bool trait_item_needs_implementation = !trait_item_ref->is_optional (); if (ignore_mandatory_trait_items && trait_item_needs_implementation) continue; PathProbeCandidate::CandidateType candidate_type; - switch (trait_item_ref.get_trait_item_type ()) + switch (trait_item_ref->get_trait_item_type ()) { case TraitItemReference::TraitItemType::FN: candidate_type = PathProbeCandidate::CandidateType::TRAIT_FUNC; @@ -264,7 +264,7 @@ private: break; } - TyTy::BaseType *trait_item_tyty = trait_item_ref.get_tyty (); + TyTy::BaseType *trait_item_tyty = trait_item_ref->get_tyty (); // we can substitute the Self with the receiver here if (trait_item_tyty->get_kind () == TyTy::TypeKind::FNDEF) @@ -298,7 +298,7 @@ private: trait_ref, trait_item_ref}; PathProbeCandidate candidate{candidate_type, trait_item_tyty, - trait_ref.get_locus (), + trait_ref->get_locus (), {trait_item_candidate}}; candidates.push_back (std::move (candidate)); } @@ -311,21 +311,21 @@ private: current_impl (nullptr) {} - std::vector<std::reference_wrapper<const TraitReference>> union_bounds ( - const std::vector<std::reference_wrapper</*const*/ TraitReference>> a, - const std::vector<std::reference_wrapper<const TraitReference>> b) const + std::vector<const TraitReference *> + union_bounds (const std::vector</*const*/ TraitReference *> a, + const std::vector<const TraitReference *> b) const { - std::map<DefId, std::reference_wrapper<const TraitReference>> mapper; - for (const TraitReference &ref : a) + std::map<DefId, const TraitReference *> mapper; + for (const TraitReference *ref : a) { - mapper.insert ({ref.get_mappings ().get_defid (), ref}); + mapper.insert ({ref->get_mappings ().get_defid (), ref}); } - for (const TraitReference &ref : b) + for (const TraitReference *ref : b) { - mapper.insert ({ref.get_mappings ().get_defid (), ref}); + mapper.insert ({ref->get_mappings ().get_defid (), ref}); } - std::vector<std::reference_wrapper<const TraitReference>> union_set; + std::vector<const TraitReference *> union_set; for (auto it = mapper.begin (); it != mapper.end (); it++) { union_set.push_back (it->second); @@ -362,7 +362,7 @@ public: case PathProbeCandidate::CandidateType::TRAIT_ITEM_CONST: case PathProbeCandidate::CandidateType::TRAIT_TYPE_ALIAS: case PathProbeCandidate::CandidateType::TRAIT_FUNC: - r.add_range (c.item.trait.item_ref.get_locus ()); + r.add_range (c.item.trait.item_ref->get_locus ()); break; } } diff --git a/gcc/rust/typecheck/rust-hir-trait-ref.h b/gcc/rust/typecheck/rust-hir-trait-ref.h index dd77dfd..21a8beb 100644 --- a/gcc/rust/typecheck/rust-hir-trait-ref.h +++ b/gcc/rust/typecheck/rust-hir-trait-ref.h @@ -233,14 +233,18 @@ public: return hir_trait_ref->get_mappings (); } - const TraitItemReference &lookup_trait_item (const std::string &ident) const + bool lookup_trait_item (const std::string &ident, + const TraitItemReference **ref) const { for (auto &item : item_refs) { if (ident.compare (item.get_identifier ()) == 0) - return item; + { + *ref = &item; + return true; + } } - return TraitItemReference::error_node (); + return false; } const TraitItemReference & diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.h b/gcc/rust/typecheck/rust-hir-trait-resolve.h index 1e69caa..1669a37 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.h +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.h @@ -100,7 +100,7 @@ class TraitResolver : public TypeCheckBase using Rust::Resolver::TypeCheckBase::visit; public: - static TraitReference &Resolve (HIR::TypePath &path) + static TraitReference *Resolve (HIR::TypePath &path) { TraitResolver resolver; return resolver.go (path); @@ -109,14 +109,14 @@ public: private: TraitResolver () : TypeCheckBase () {} - TraitReference &go (HIR::TypePath &path) + TraitReference *go (HIR::TypePath &path) { NodeId ref; if (!resolver->lookup_resolved_type (path.get_mappings ().get_nodeid (), &ref)) { rust_error_at (path.get_locus (), "Failed to resolve path to node-id"); - return TraitReference::error_node (); + return &TraitReference::error_node (); } HirId hir_node = UNKNOWN_HIRID; @@ -124,7 +124,7 @@ private: &hir_node)) { rust_error_at (path.get_locus (), "Failed to resolve path to hir-id"); - return TraitReference::error_node (); + return &TraitReference::error_node (); } HIR::Item *resolved_item @@ -134,9 +134,9 @@ private: resolved_item->accept_vis (*this); rust_assert (trait_reference != nullptr); - TraitReference &tref = TraitReference::error_node (); + TraitReference *tref = &TraitReference::error_node (); if (context->lookup_trait_reference ( - trait_reference->get_mappings ().get_defid (), tref)) + trait_reference->get_mappings ().get_defid (), &tref)) { return tref; } @@ -179,13 +179,13 @@ private: item_refs.push_back (std::move (trait_item_ref)); } - tref = TraitReference (trait_reference, item_refs); + TraitReference trait_object (trait_reference, item_refs); context->insert_trait_reference ( - trait_reference->get_mappings ().get_defid (), std::move (tref)); + trait_reference->get_mappings ().get_defid (), std::move (trait_object)); - tref = TraitReference::error_node (); + tref = &TraitReference::error_node (); bool ok = context->lookup_trait_reference ( - trait_reference->get_mappings ().get_defid (), tref); + trait_reference->get_mappings ().get_defid (), &tref); rust_assert (ok); return tref; diff --git a/gcc/rust/typecheck/rust-hir-type-bounds.h b/gcc/rust/typecheck/rust-hir-type-bounds.h index d97c0f5..ce694da 100644 --- a/gcc/rust/typecheck/rust-hir-type-bounds.h +++ b/gcc/rust/typecheck/rust-hir-type-bounds.h @@ -31,8 +31,7 @@ class TypeBoundsProbe : public TypeCheckBase using Rust::Resolver::TypeCheckBase::visit; public: - static std::vector<std::reference_wrapper<TraitReference>> - Probe (const TyTy::BaseType *receiver) + static std::vector<TraitReference *> Probe (const TyTy::BaseType *receiver) { TypeBoundsProbe probe (receiver); probe.scan (); @@ -48,7 +47,7 @@ private: {} const TyTy::BaseType *receiver; - std::vector<std::reference_wrapper<TraitReference>> trait_references; + std::vector<TraitReference *> trait_references; }; } // namespace Resolver diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.h b/gcc/rust/typecheck/rust-hir-type-check-base.h index f05ab86..3dd0a19 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-base.h +++ b/gcc/rust/typecheck/rust-hir-type-check-base.h @@ -202,7 +202,7 @@ protected: context (TypeCheckContext::get ()) {} - TraitReference &resolve_trait_path (HIR::TypePath &); + TraitReference *resolve_trait_path (HIR::TypePath &); Analysis::Mappings *mappings; Resolver *resolver; diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h index 7f1a83d..6743c8b 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.h +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h @@ -244,7 +244,7 @@ public: = resolved_candidate.is_impl_candidate () ? resolved_candidate.item.impl.impl_item->get_impl_mappings () .get_nodeid () - : resolved_candidate.item.trait.item_ref.get_mappings () + : resolved_candidate.item.trait.item_ref->get_mappings () .get_nodeid (); if (lookup_tyty->get_kind () != TyTy::TypeKind::FNDEF) @@ -994,7 +994,7 @@ public: else { resolved_node_id - = candidate.item.trait.item_ref.get_mappings ().get_nodeid (); + = candidate.item.trait.item_ref->get_mappings ().get_nodeid (); } if (seg.has_generic_args ()) diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.h b/gcc/rust/typecheck/rust-hir-type-check-item.h index 493e91a..8775502 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-item.h +++ b/gcc/rust/typecheck/rust-hir-type-check-item.h @@ -43,12 +43,12 @@ public: void visit (HIR::ImplBlock &impl_block) override { - TraitReference &trait_reference = TraitReference::error_node (); + TraitReference *trait_reference = &TraitReference::error_node (); if (impl_block.has_trait_ref ()) { std::unique_ptr<HIR::TypePath> &ref = impl_block.get_trait_ref (); trait_reference = TraitResolver::Resolve (*ref.get ()); - rust_assert (!trait_reference.is_error ()); + rust_assert (!trait_reference->is_error ()); } TyTy::BaseType *self = nullptr; @@ -60,7 +60,7 @@ public: return; } - bool is_trait_impl_block = !trait_reference.is_error (); + bool is_trait_impl_block = !trait_reference->is_error (); std::vector<std::reference_wrapper<const TraitItemReference>> trait_item_refs; @@ -72,20 +72,20 @@ public: { auto &trait_item_ref = TypeCheckImplItemWithTrait::Resolve (impl_item.get (), self, - trait_reference); + *trait_reference); trait_item_refs.push_back (trait_item_ref); } } bool impl_block_missing_trait_items = is_trait_impl_block - && trait_reference.size () != trait_item_refs.size (); + && trait_reference->size () != trait_item_refs.size (); if (impl_block_missing_trait_items) { // filter the missing impl_items std::vector<std::reference_wrapper<const TraitItemReference>> missing_trait_items; - for (auto &trait_item_ref : trait_reference.get_trait_items ()) + for (auto &trait_item_ref : trait_reference->get_trait_items ()) { bool found = false; for (const TraitItemReference &implemented_trait_item : @@ -120,7 +120,7 @@ public: rust_error_at (r, "missing %s in implementation of trait %<%s%>", missing_items_buf.c_str (), - trait_reference.get_name ().c_str ()); + trait_reference->get_name ().c_str ()); } } } diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.h b/gcc/rust/typecheck/rust-hir-type-check-type.h index 91d9c53..ef1510e 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-type.h +++ b/gcc/rust/typecheck/rust-hir-type-check-type.h @@ -280,8 +280,11 @@ public: case HIR::TypeParamBound::BoundType::TRAITBOUND: { HIR::TraitBound *b = static_cast<HIR::TraitBound *> (bound.get ()); + + TraitReference *trait = resolve_trait_path (b->get_path ()); TyTy::TypeBoundPredicate predicate ( - &resolve_trait_path (b->get_path ())); + trait->get_mappings ().get_defid ()); + specified_bounds.push_back (std::move (predicate)); } break; diff --git a/gcc/rust/typecheck/rust-hir-type-check.h b/gcc/rust/typecheck/rust-hir-type-check.h index b171123..d834ad8 100644 --- a/gcc/rust/typecheck/rust-hir-type-check.h +++ b/gcc/rust/typecheck/rust-hir-type-check.h @@ -92,13 +92,13 @@ public: trait_context.emplace (id, std::move (ref)); } - bool lookup_trait_reference (DefId id, TraitReference &ref) + bool lookup_trait_reference (DefId id, TraitReference **ref) { auto it = trait_context.find (id); if (it == trait_context.end ()) return false; - ref = it->second; + *ref = &it->second; return true; } diff --git a/gcc/rust/typecheck/rust-tyty-bounds.cc b/gcc/rust/typecheck/rust-tyty-bounds.cc index a480155..3562e85 100644 --- a/gcc/rust/typecheck/rust-tyty-bounds.cc +++ b/gcc/rust/typecheck/rust-tyty-bounds.cc @@ -48,14 +48,14 @@ TypeBoundsProbe::scan () for (auto &trait_path : possible_trait_paths) { - TraitReference &trait_ref = TraitResolver::Resolve (*trait_path); + TraitReference *trait_ref = TraitResolver::Resolve (*trait_path); - if (!trait_ref.is_error ()) + if (!trait_ref->is_error ()) trait_references.push_back (trait_ref); } } -TraitReference & +TraitReference * TypeCheckBase::resolve_trait_path (HIR::TypePath &path) { return TraitResolver::Resolve (path); @@ -68,7 +68,19 @@ namespace TyTy { std::string TypeBoundPredicate::as_string () const { - return reference->as_string (); + return get ()->as_string (); +} + +const Resolver::TraitReference * +TypeBoundPredicate::get () const +{ + auto context = Resolver::TypeCheckContext::get (); + + Resolver::TraitReference *ref = nullptr; + bool ok = context->lookup_trait_reference (reference, &ref); + rust_assert (ok); + + return ref; } } // namespace TyTy diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc index 3238631..88b6c35 100644 --- a/gcc/rust/typecheck/rust-tyty.cc +++ b/gcc/rust/typecheck/rust-tyty.cc @@ -49,11 +49,11 @@ BaseType::satisfies_bound (const TypeBoundPredicate &predicate) const return true; } - std::vector<std::reference_wrapper<Resolver::TraitReference>> probed + std::vector<Resolver::TraitReference *> probed = Resolver::TypeBoundsProbe::Probe (this); - for (const Resolver::TraitReference &bound : probed) + for (const Resolver::TraitReference *bound : probed) { - bool found = bound.get_mappings ().get_defid () + bool found = bound->get_mappings ().get_defid () == query->get_mappings ().get_defid (); if (found) return true; diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h index 6fe67c7..f6f9579 100644 --- a/gcc/rust/typecheck/rust-tyty.h +++ b/gcc/rust/typecheck/rust-tyty.h @@ -132,26 +132,14 @@ public: class TypeBoundPredicate { public: - TypeBoundPredicate (Resolver::TraitReference *reference) - : reference (reference) - {} - - TypeBoundPredicate (const TypeBoundPredicate &other) - : reference (other.reference) - {} - - TypeBoundPredicate &operator= (const TypeBoundPredicate &other) - { - reference = other.reference; - return *this; - } + TypeBoundPredicate (DefId reference) : reference (reference) {} std::string as_string () const; - const Resolver::TraitReference *get () const { return reference; } + const Resolver::TraitReference *get () const; private: - Resolver::TraitReference *reference; + DefId reference; }; class TypeBoundsMappings diff --git a/gcc/testsuite/rust/compile/traits7.rs b/gcc/testsuite/rust/compile/traits7.rs new file mode 100644 index 0000000..825553c --- /dev/null +++ b/gcc/testsuite/rust/compile/traits7.rs @@ -0,0 +1,24 @@ +trait Foo { + fn default() -> i32; +} + +trait Bar { + fn not_default() -> i32; +} + +struct Test(i32); + +impl Foo for Test { + fn default() -> i32 { + 1234 + } +} + +fn type_bound_test<T: Foo + Bar>() -> i32 { + T::default() +} + +fn main() { + let a = type_bound_test::<Test>(); + // { dg-error "bounds not satisfied for Test" "" { target *-*-* } .-1 } +} |