aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-04-28 13:44:39 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-04-28 13:44:39 +0100
commitbbf171c9d25becdf77087a9e7d2b9e4bde030e80 (patch)
treef7459b4e772f45da4340b71edf8fc3504ca09299 /gcc
parente500a4164f988c23f3b1dcf87605388cf8f5d721 (diff)
downloadgcc-bbf171c9d25becdf77087a9e7d2b9e4bde030e80.zip
gcc-bbf171c9d25becdf77087a9e7d2b9e4bde030e80.tar.gz
gcc-bbf171c9d25becdf77087a9e7d2b9e4bde030e80.tar.bz2
Fix ICE on missing TypeParam within type context
During type-resolution we resolve/type-check traits in a query based way. So when we reference a trait we look it up as required but this left a case for the privacy pass where the type-context information on the trait when the trait was not used meant there was no type-checking performed on the trait. This patch adds an interface to directly resolve the trait when as we iterate the crate so we do it as required. There is already code in the trait resolver to check if we have already type-resolved this trait. Fixes #1128
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])
+ }
+}