Unsized temporary is not an implementation error

This commit is contained in:
hkalbasi 2023-05-14 21:05:33 +03:30
parent 51e8b8ff14
commit 431dd32f8a
2 changed files with 22 additions and 1 deletions

View File

@ -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(_))),
);
}

View File

@ -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 @@ pub fn pretty_print(
}
}
MirLowerError::LayoutError(_)
| MirLowerError::UnsizedTemporary(_)
| MirLowerError::IncompleteExpr
| MirLowerError::UnaccessableLocal
| MirLowerError::TraitFunctionDefinition(_, _)
@ -199,7 +201,7 @@ fn new(
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 }))
}