CTFE: exposing pointers and calling extern fn doesn't need an RFC, it is just impossible
This commit is contained in:
parent
ee285eab69
commit
a9f9145b09
@ -269,9 +269,10 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
|
|||||||
);
|
);
|
||||||
throw_inval!(AlreadyReported(guar));
|
throw_inval!(AlreadyReported(guar));
|
||||||
} else {
|
} else {
|
||||||
|
// `find_mir_or_eval_fn` checks that this is a const fn before even calling us,
|
||||||
|
// so this should be unreachable.
|
||||||
let path = ecx.tcx.def_path_str(def.did);
|
let path = ecx.tcx.def_path_str(def.did);
|
||||||
Err(ConstEvalErrKind::NeedsRfc(format!("calling extern function `{}`", path))
|
bug!("trying to call extern function `{path}` at compile-time");
|
||||||
.into())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => Ok(ecx.tcx.instance_mir(instance)),
|
_ => Ok(ecx.tcx.instance_mir(instance)),
|
||||||
@ -469,7 +470,8 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
|
|||||||
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
|
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
|
||||||
_ptr: Pointer<AllocId>,
|
_ptr: Pointer<AllocId>,
|
||||||
) -> InterpResult<'tcx> {
|
) -> InterpResult<'tcx> {
|
||||||
Err(ConstEvalErrKind::NeedsRfc("exposing pointers".to_string()).into())
|
// This is only reachable with -Zunleash-the-miri-inside-of-you.
|
||||||
|
throw_unsup_format!("exposing pointers is not possible at compile-time")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
@ -490,6 +490,7 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) {
|
|||||||
) -> InterpResult<$tcx, Pointer<Option<AllocId>>> {
|
) -> InterpResult<$tcx, Pointer<Option<AllocId>>> {
|
||||||
// Allow these casts, but make the pointer not dereferenceable.
|
// Allow these casts, but make the pointer not dereferenceable.
|
||||||
// (I.e., they behave like transmutation.)
|
// (I.e., they behave like transmutation.)
|
||||||
|
// This is correct because no pointers can ever be exposed in compile-time evaluation.
|
||||||
Ok(Pointer::from_addr(addr))
|
Ok(Pointer::from_addr(addr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
static PTR_INT_CAST: () = {
|
static PTR_INT_CAST: () = {
|
||||||
let x = &0 as *const _ as usize;
|
let x = &0 as *const _ as usize;
|
||||||
//~^ ERROR could not evaluate static initializer
|
//~^ ERROR could not evaluate static initializer
|
||||||
//~| "exposing pointers" needs an rfc before being allowed inside constants
|
//~| exposing pointers
|
||||||
let _v = x == x;
|
let _v = x == x;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ error[E0080]: could not evaluate static initializer
|
|||||||
--> $DIR/ptr_arith.rs:9:13
|
--> $DIR/ptr_arith.rs:9:13
|
||||||
|
|
|
|
||||||
LL | let x = &0 as *const _ as usize;
|
LL | let x = &0 as *const _ as usize;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ "exposing pointers" needs an rfc before being allowed inside constants
|
| ^^^^^^^^^^^^^^^^^^^^^^^ exposing pointers is not possible at compile-time
|
||||||
|
|
||||||
error[E0080]: could not evaluate static initializer
|
error[E0080]: could not evaluate static initializer
|
||||||
--> $DIR/ptr_arith.rs:17:14
|
--> $DIR/ptr_arith.rs:17:14
|
||||||
|
Loading…
x
Reference in New Issue
Block a user