Rollup merge of #87427 - RalfJung:no-mir-for, r=oli-obk
get rid of NoMirFor error variant The only place where we throw that error, it is very quickly caught again and turned into a different error. So raise that other error immediately.
This commit is contained in:
commit
d25439481c
2 changed files with 4 additions and 18 deletions
|
@ -402,8 +402,6 @@ impl fmt::Display for UndefinedBehaviorInfo<'_> {
|
||||||
pub enum UnsupportedOpInfo {
|
pub enum UnsupportedOpInfo {
|
||||||
/// Free-form case. Only for errors that are never caught!
|
/// Free-form case. Only for errors that are never caught!
|
||||||
Unsupported(String),
|
Unsupported(String),
|
||||||
/// Could not find MIR for a function.
|
|
||||||
NoMirFor(DefId),
|
|
||||||
/// Encountered a pointer where we needed raw bytes.
|
/// Encountered a pointer where we needed raw bytes.
|
||||||
ReadPointerAsBytes,
|
ReadPointerAsBytes,
|
||||||
//
|
//
|
||||||
|
@ -421,7 +419,6 @@ impl fmt::Display for UnsupportedOpInfo {
|
||||||
match self {
|
match self {
|
||||||
Unsupported(ref msg) => write!(f, "{}", msg),
|
Unsupported(ref msg) => write!(f, "{}", msg),
|
||||||
ReadExternStatic(did) => write!(f, "cannot read from extern static ({:?})", did),
|
ReadExternStatic(did) => write!(f, "cannot read from extern static ({:?})", did),
|
||||||
NoMirFor(did) => write!(f, "no MIR body is available for {:?}", did),
|
|
||||||
ReadPointerAsBytes => write!(f, "unable to turn pointer into raw bytes",),
|
ReadPointerAsBytes => write!(f, "unable to turn pointer into raw bytes",),
|
||||||
ThreadLocalStatic(did) => write!(f, "cannot access thread local static ({:?})", did),
|
ThreadLocalStatic(did) => write!(f, "cannot access thread local static ({:?})", did),
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,7 +212,9 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
|
||||||
if ecx.tcx.is_ctfe_mir_available(def.did) {
|
if ecx.tcx.is_ctfe_mir_available(def.did) {
|
||||||
Ok(ecx.tcx.mir_for_ctfe_opt_const_arg(def))
|
Ok(ecx.tcx.mir_for_ctfe_opt_const_arg(def))
|
||||||
} else {
|
} else {
|
||||||
throw_unsup!(NoMirFor(def.did))
|
let path = ecx.tcx.def_path_str(def.did);
|
||||||
|
Err(ConstEvalErrKind::NeedsRfc(format!("calling extern function `{}`", path))
|
||||||
|
.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => Ok(ecx.tcx.instance_mir(instance)),
|
_ => Ok(ecx.tcx.instance_mir(instance)),
|
||||||
|
@ -247,20 +249,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// This is a const fn. Call it.
|
// This is a const fn. Call it.
|
||||||
Ok(Some(match ecx.load_mir(instance.def, None) {
|
Ok(Some(ecx.load_mir(instance.def, None)?))
|
||||||
Ok(body) => body,
|
|
||||||
Err(err) => {
|
|
||||||
if let err_unsup!(NoMirFor(did)) = err.kind() {
|
|
||||||
let path = ecx.tcx.def_path_str(*did);
|
|
||||||
return Err(ConstEvalErrKind::NeedsRfc(format!(
|
|
||||||
"calling extern function `{}`",
|
|
||||||
path
|
|
||||||
))
|
|
||||||
.into());
|
|
||||||
}
|
|
||||||
return Err(err);
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn call_intrinsic(
|
fn call_intrinsic(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue