Unnamed repository; edit this file 'description' to name the repository.
Unsized temporary is not an implementation error
hkalbasi 2023-05-15
parent 51e8b8f · commit 431dd32
-rw-r--r--crates/hir-ty/src/consteval/tests.rs19
-rw-r--r--crates/hir-ty/src/mir/lower.rs4
2 files changed, 22 insertions, 1 deletions
diff --git a/crates/hir-ty/src/consteval/tests.rs b/crates/hir-ty/src/consteval/tests.rs
index 12b15065dd..2aac1cc057 100644
--- a/crates/hir-ty/src/consteval/tests.rs
+++ b/crates/hir-ty/src/consteval/tests.rs
@@ -2066,3 +2066,22 @@ fn type_error() {
|e| matches!(e, ConstEvalError::MirLowerError(MirLowerError::TypeMismatch(_))),
);
}
+
+#[test]
+fn unsized_local() {
+ check_fail(
+ r#"
+ //- minicore: coerce_unsized, index, slice
+ const fn x() -> SomeUnknownTypeThatDereferenceToSlice {
+ SomeUnknownTypeThatDereferenceToSlice
+ }
+
+ const GOAL: u16 = {
+ let y = x();
+ let z: &[u16] = &y;
+ z[1]
+ };
+ "#,
+ |e| matches!(e, ConstEvalError::MirLowerError(MirLowerError::UnsizedTemporary(_))),
+ );
+}
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index 66b1d840bd..627c36dca9 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -75,6 +75,7 @@ pub enum MirLowerError {
RecordLiteralWithoutPath,
UnresolvedMethod(String),
UnresolvedField,
+ UnsizedTemporary(Ty),
MissingFunctionDefinition,
TypeMismatch(TypeMismatch),
/// This should be never happen. Type mismatch should catch everything.
@@ -108,6 +109,7 @@ impl MirLowerError {
}
}
MirLowerError::LayoutError(_)
+ | MirLowerError::UnsizedTemporary(_)
| MirLowerError::IncompleteExpr
| MirLowerError::UnaccessableLocal
| MirLowerError::TraitFunctionDefinition(_, _)
@@ -199,7 +201,7 @@ impl<'ctx> MirLowerCtx<'ctx> {
fn temp(&mut self, ty: Ty) -> Result<LocalId> {
if matches!(ty.kind(Interner), TyKind::Slice(_) | TyKind::Dyn(_)) {
- implementation_error!("unsized temporaries");
+ return Err(MirLowerError::UnsizedTemporary(ty));
}
Ok(self.result.locals.alloc(Local { ty }))
}