aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-04-22 10:04:28 +0000
committerGitHub <noreply@github.com>2022-04-22 10:04:28 +0000
commit75ac2f6fc0a12a7f75abfd5bcd79e508f5ae8fc7 (patch)
treef8ca158263c81e7e0db67b066ffee1ca2608938e
parentf0b6dca3fcd6f435a0c0fc5c60c4bfba088930dd (diff)
parent639b3d61ab124ab14e0935893abe437ed7f6ad52 (diff)
downloadgcc-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.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
+ }
+}