diff options
author | Philip Herron <philip.herron@embecosm.com> | 2022-04-28 13:44:39 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2022-04-28 13:44:39 +0100 |
commit | bbf171c9d25becdf77087a9e7d2b9e4bde030e80 (patch) | |
tree | f7459b4e772f45da4340b71edf8fc3504ca09299 /gcc | |
parent | e500a4164f988c23f3b1dcf87605388cf8f5d721 (diff) | |
download | gcc-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.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]) + } +} |