aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-04-21 20:14:43 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-04-21 20:20:24 +0100
commit639b3d61ab124ab14e0935893abe437ed7f6ad52 (patch)
tree47d6562a257d8e4e9299a9f5fe25a5dbbb03b101
parentfc22f12c9c707b258f35a1bab0e8154441b972b8 (diff)
downloadgcc-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.h16
-rw-r--r--gcc/testsuite/rust/compile/issue-1129-1.rs4
-rw-r--r--gcc/testsuite/rust/compile/issue-1129-2.rs22
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
+ }
+}