aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-trait-resolve.cc27
-rw-r--r--gcc/rust/typecheck/rust-hir-trait-resolve.h10
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-item.h2
-rw-r--r--gcc/testsuite/rust/compile/issue-1128.rs6
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])
+ }
+}