Add missing coercion rule from array to slice

Arrays are coercible into slices, this adds the missing type-resolution
the rule which works for now. The other part of this fix is described in
so that we reuse as much code as possible and handle complex coercion
sites.

Fixes #1129
This commit is contained in:
Philip Herron 2022-04-21 20:14:43 +01:00
parent fc22f12c9c
commit 639b3d61ab
3 changed files with 42 additions and 0 deletions

View File

@ -886,6 +886,22 @@ public:
TyVar (base_resolved->get_ref ()));
}
void visit (ArrayType &type) override
{
// check base type
auto base_resolved
= base->get_element_type ()->unify (type.get_element_type ());
if (base_resolved == nullptr)
{
BaseCoercionRules::visit (type);
return;
}
resolved = new SliceType (type.get_ref (), type.get_ty_ref (),
type.get_ident ().locus,
TyVar (base_resolved->get_ref ()));
}
private:
BaseType *get_base () override { return base; }

View File

@ -0,0 +1,4 @@
// { dg-additional-options "-w" }
fn write_u8(i: u8) {
let x: &[u8] = &[i];
}

View File

@ -0,0 +1,22 @@
// { dg-additional-options "-w" }
pub trait Hasher {
fn finish(&self) -> u64;
fn write(&mut self, bytes: &[u8]);
fn write_u8(&mut self, i: u8) {
self.write(&[i])
}
}
struct SipHasher;
impl Hasher for SipHasher {
#[inline]
fn write(&mut self, msg: &[u8]) {
loop {}
}
#[inline]
fn finish(&self) -> u64 {
0
}
}