diff options
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.cc | 27 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.h | 10 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-item.h | 2 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-1128.rs | 6 |
4 files changed, 36 insertions, 9 deletions
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc index 823cb76..13edd8d 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc @@ -74,7 +74,14 @@ TraitReference * TraitResolver::Resolve (HIR::TypePath &path) { TraitResolver resolver; - return resolver.go (path); + return resolver.resolve_path (path); +} + +TraitReference * +TraitResolver::Resolve (HIR::Trait &trait) +{ + TraitResolver resolver; + return resolver.resolve_trait (&trait); } TraitReference * @@ -84,10 +91,12 @@ TraitResolver::Lookup (HIR::TypePath &path) return resolver.lookup_path (path); } -TraitResolver::TraitResolver () : TypeCheckBase () {} +TraitResolver::TraitResolver () + : TypeCheckBase (), resolved_trait_reference (nullptr) +{} TraitReference * -TraitResolver::go (HIR::TypePath &path) +TraitResolver::resolve_path (HIR::TypePath &path) { NodeId ref; if (!resolver->lookup_resolved_type (path.get_mappings ().get_nodeid (), @@ -110,8 +119,14 @@ TraitResolver::go (HIR::TypePath &path) rust_assert (resolved_item != nullptr); resolved_item->accept_vis (*this); - rust_assert (trait_reference != nullptr); + rust_assert (resolved_trait_reference != nullptr); + return resolve_trait (resolved_trait_reference); +} + +TraitReference * +TraitResolver::resolve_trait (HIR::Trait *trait_reference) +{ TraitReference *tref = &TraitReference::error_node (); if (context->lookup_trait_reference ( trait_reference->get_mappings ().get_defid (), &tref)) @@ -243,11 +258,11 @@ TraitResolver::lookup_path (HIR::TypePath &path) rust_assert (resolved_item != nullptr); resolved_item->accept_vis (*this); - rust_assert (trait_reference != nullptr); + rust_assert (resolved_trait_reference != nullptr); TraitReference *tref = &TraitReference::error_node (); if (context->lookup_trait_reference ( - trait_reference->get_mappings ().get_defid (), &tref)) + resolved_trait_reference->get_mappings ().get_defid (), &tref)) { return tref; } diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.h b/gcc/rust/typecheck/rust-hir-trait-resolve.h index 91e94cc..a73b67f 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.h +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.h @@ -66,19 +66,23 @@ class TraitResolver : public TypeCheckBase public: static TraitReference *Resolve (HIR::TypePath &path); + static TraitReference *Resolve (HIR::Trait &trait); + static TraitReference *Lookup (HIR::TypePath &path); private: TraitResolver (); - TraitReference *go (HIR::TypePath &path); + TraitReference *resolve_path (HIR::TypePath &path); + + TraitReference *resolve_trait (HIR::Trait *trait_reference); TraitReference *lookup_path (HIR::TypePath &path); - HIR::Trait *trait_reference; + HIR::Trait *resolved_trait_reference; public: - void visit (HIR::Trait &trait) override { trait_reference = &trait; } + void visit (HIR::Trait &trait) override { resolved_trait_reference = &trait; } }; } // namespace Resolver diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.h b/gcc/rust/typecheck/rust-hir-type-check-item.h index 9d3beae..71b6b81 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-item.h +++ b/gcc/rust/typecheck/rust-hir-type-check-item.h @@ -224,6 +224,8 @@ public: TypeCheckItem::Resolve (item.get ()); } + void visit (HIR::Trait &trait) override { TraitResolver::Resolve (trait); } + private: TypeCheckItem () : TypeCheckBase () {} }; diff --git a/gcc/testsuite/rust/compile/issue-1128.rs b/gcc/testsuite/rust/compile/issue-1128.rs new file mode 100644 index 0000000..462426b --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1128.rs @@ -0,0 +1,6 @@ +pub trait Hasher { + fn write(&mut self, bytes: &[u8]); + fn write_u8(&mut self, i: u8) { + self.write(&[i]) + } +} |