diff options
author | Philip Herron <philip.herron@embecosm.com> | 2022-04-21 20:14:43 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2022-04-21 20:20:24 +0100 |
commit | 639b3d61ab124ab14e0935893abe437ed7f6ad52 (patch) | |
tree | 47d6562a257d8e4e9299a9f5fe25a5dbbb03b101 | |
parent | fc22f12c9c707b258f35a1bab0e8154441b972b8 (diff) | |
download | gcc-639b3d61ab124ab14e0935893abe437ed7f6ad52.zip gcc-639b3d61ab124ab14e0935893abe437ed7f6ad52.tar.gz gcc-639b3d61ab124ab14e0935893abe437ed7f6ad52.tar.bz2 |
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
-rw-r--r-- | gcc/rust/typecheck/rust-tyty-coercion.h | 16 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-1129-1.rs | 4 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-1129-2.rs | 22 |
3 files changed, 42 insertions, 0 deletions
diff --git a/gcc/rust/typecheck/rust-tyty-coercion.h b/gcc/rust/typecheck/rust-tyty-coercion.h index c24f17e..e13c7f8 100644 --- a/gcc/rust/typecheck/rust-tyty-coercion.h +++ b/gcc/rust/typecheck/rust-tyty-coercion.h @@ -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; } diff --git a/gcc/testsuite/rust/compile/issue-1129-1.rs b/gcc/testsuite/rust/compile/issue-1129-1.rs new file mode 100644 index 0000000..a159039 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1129-1.rs @@ -0,0 +1,4 @@ +// { dg-additional-options "-w" } +fn write_u8(i: u8) { + let x: &[u8] = &[i]; +} diff --git a/gcc/testsuite/rust/compile/issue-1129-2.rs b/gcc/testsuite/rust/compile/issue-1129-2.rs new file mode 100644 index 0000000..25d30fa --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1129-2.rs @@ -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 + } +} |