Skip to content

Commit bbf171c

Browse files
committed
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
1 parent e500a41 commit bbf171c

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed

gcc/rust/typecheck/rust-hir-trait-resolve.cc

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,14 @@ TraitReference *
7474
TraitResolver::Resolve (HIR::TypePath &path)
7575
{
7676
TraitResolver resolver;
77-
return resolver.go (path);
77+
return resolver.resolve_path (path);
78+
}
79+
80+
TraitReference *
81+
TraitResolver::Resolve (HIR::Trait &trait)
82+
{
83+
TraitResolver resolver;
84+
return resolver.resolve_trait (&trait);
7885
}
7986

8087
TraitReference *
@@ -84,10 +91,12 @@ TraitResolver::Lookup (HIR::TypePath &path)
8491
return resolver.lookup_path (path);
8592
}
8693

87-
TraitResolver::TraitResolver () : TypeCheckBase () {}
94+
TraitResolver::TraitResolver ()
95+
: TypeCheckBase (), resolved_trait_reference (nullptr)
96+
{}
8897

8998
TraitReference *
90-
TraitResolver::go (HIR::TypePath &path)
99+
TraitResolver::resolve_path (HIR::TypePath &path)
91100
{
92101
NodeId ref;
93102
if (!resolver->lookup_resolved_type (path.get_mappings ().get_nodeid (),
@@ -110,8 +119,14 @@ TraitResolver::go (HIR::TypePath &path)
110119

111120
rust_assert (resolved_item != nullptr);
112121
resolved_item->accept_vis (*this);
113-
rust_assert (trait_reference != nullptr);
122+
rust_assert (resolved_trait_reference != nullptr);
114123

124+
return resolve_trait (resolved_trait_reference);
125+
}
126+
127+
TraitReference *
128+
TraitResolver::resolve_trait (HIR::Trait *trait_reference)
129+
{
115130
TraitReference *tref = &TraitReference::error_node ();
116131
if (context->lookup_trait_reference (
117132
trait_reference->get_mappings ().get_defid (), &tref))
@@ -243,11 +258,11 @@ TraitResolver::lookup_path (HIR::TypePath &path)
243258

244259
rust_assert (resolved_item != nullptr);
245260
resolved_item->accept_vis (*this);
246-
rust_assert (trait_reference != nullptr);
261+
rust_assert (resolved_trait_reference != nullptr);
247262

248263
TraitReference *tref = &TraitReference::error_node ();
249264
if (context->lookup_trait_reference (
250-
trait_reference->get_mappings ().get_defid (), &tref))
265+
resolved_trait_reference->get_mappings ().get_defid (), &tref))
251266
{
252267
return tref;
253268
}

gcc/rust/typecheck/rust-hir-trait-resolve.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,19 +66,23 @@ class TraitResolver : public TypeCheckBase
6666
public:
6767
static TraitReference *Resolve (HIR::TypePath &path);
6868

69+
static TraitReference *Resolve (HIR::Trait &trait);
70+
6971
static TraitReference *Lookup (HIR::TypePath &path);
7072

7173
private:
7274
TraitResolver ();
7375

74-
TraitReference *go (HIR::TypePath &path);
76+
TraitReference *resolve_path (HIR::TypePath &path);
77+
78+
TraitReference *resolve_trait (HIR::Trait *trait_reference);
7579

7680
TraitReference *lookup_path (HIR::TypePath &path);
7781

78-
HIR::Trait *trait_reference;
82+
HIR::Trait *resolved_trait_reference;
7983

8084
public:
81-
void visit (HIR::Trait &trait) override { trait_reference = &trait; }
85+
void visit (HIR::Trait &trait) override { resolved_trait_reference = &trait; }
8286
};
8387

8488
} // namespace Resolver

gcc/rust/typecheck/rust-hir-type-check-item.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ class TypeCheckItem : public TypeCheckBase
224224
TypeCheckItem::Resolve (item.get ());
225225
}
226226

227+
void visit (HIR::Trait &trait) override { TraitResolver::Resolve (trait); }
228+
227229
private:
228230
TypeCheckItem () : TypeCheckBase () {}
229231
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pub trait Hasher {
2+
fn write(&mut self, bytes: &[u8]);
3+
fn write_u8(&mut self, i: u8) {
4+
self.write(&[i])
5+
}
6+
}

0 commit comments

Comments
 (0)