diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-04-22 10:04:28 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-22 10:04:28 +0000 |
commit | 75ac2f6fc0a12a7f75abfd5bcd79e508f5ae8fc7 (patch) | |
tree | f8ca158263c81e7e0db67b066ffee1ca2608938e | |
parent | f0b6dca3fcd6f435a0c0fc5c60c4bfba088930dd (diff) | |
parent | 639b3d61ab124ab14e0935893abe437ed7f6ad52 (diff) | |
download | gcc-75ac2f6fc0a12a7f75abfd5bcd79e508f5ae8fc7.zip gcc-75ac2f6fc0a12a7f75abfd5bcd79e508f5ae8fc7.tar.gz gcc-75ac2f6fc0a12a7f75abfd5bcd79e508f5ae8fc7.tar.bz2 |
Merge #1147
1147: Add missing coercion rule from array to slice r=philberty a=philberty
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 #1146
for coercion_site to be recursive and reuse the adjustment classes so that
we reuse as much code as possible and handle complex coercion sites.
Fixes #1129
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
-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 + } +} |