Auto merge of #139845 - Zalathar:rollup-u5u5y1v, r=Zalathar
Rollup of 17 pull requests Successful merges: - #138374 (Enable contracts for const functions) - #138380 (ci: add runners for vanilla LLVM 20) - #138393 (Allow const patterns of matches to contain pattern types) - #139517 (std: sys: process: uefi: Use NULL stdin by default) - #139554 (std: add Output::exit_ok) - #139660 (compiletest: Add an experimental new executor to replace libtest) - #139669 (Overhaul `AssocItem`) - #139671 (Proc macro span API redesign: Replace proc_macro::SourceFile by Span::{file, local_file}) - #139750 (std/thread: Use default stack size from menuconfig for NuttX) - #139772 (Remove `hir::Map`) - #139785 (Let CStrings be either 1 or 2 byte aligned.) - #139789 (do not unnecessarily leak auto traits in item bounds) - #139791 (drop global where-bounds before merging candidates) - #139798 (normalize: prefer `ParamEnv` over `AliasBound` candidates) - #139822 (Fix: Map EOPNOTSUPP to ErrorKind::Unsupported on Unix) - #139833 (Fix some HIR pretty-printing problems) - #139836 (Basic tests of MPMC receiver cloning) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
f433fa46b0
173 changed files with 2499 additions and 994 deletions
|
@ -2,19 +2,23 @@
|
|||
|
||||
pub use crate::macros::builtin::{contracts_ensures as ensures, contracts_requires as requires};
|
||||
|
||||
/// Emitted by rustc as a desugaring of `#[ensures(PRED)] fn foo() -> R { ... [return R;] ... }`
|
||||
/// into: `fn foo() { let _check = build_check_ensures(|ret| PRED) ... [return _check(R);] ... }`
|
||||
/// (including the implicit return of the tail expression, if any).
|
||||
/// This is an identity function used as part of the desugaring of the `#[ensures]` attribute.
|
||||
///
|
||||
/// This is an existing hack to allow users to omit the type of the return value in their ensures
|
||||
/// attribute.
|
||||
///
|
||||
/// Ideally, rustc should be able to generate the type annotation.
|
||||
/// The existing lowering logic makes it rather hard to add the explicit type annotation,
|
||||
/// while the function call is fairly straight forward.
|
||||
#[unstable(feature = "contracts_internals", issue = "128044" /* compiler-team#759 */)]
|
||||
// Similar to `contract_check_requires`, we need to use the user-facing
|
||||
// `contracts` feature rather than the perma-unstable `contracts_internals`.
|
||||
// Const-checking doesn't honor allow_internal_unstable logic used by contract expansion.
|
||||
#[rustc_const_unstable(feature = "contracts", issue = "128044")]
|
||||
#[lang = "contract_build_check_ensures"]
|
||||
#[track_caller]
|
||||
pub fn build_check_ensures<Ret, C>(cond: C) -> impl (Fn(Ret) -> Ret) + Copy
|
||||
pub const fn build_check_ensures<Ret, C>(cond: C) -> C
|
||||
where
|
||||
C: for<'a> Fn(&'a Ret) -> bool + Copy + 'static,
|
||||
C: Fn(&Ret) -> bool + Copy + 'static,
|
||||
{
|
||||
#[track_caller]
|
||||
move |ret| {
|
||||
crate::intrinsics::contract_check_ensures(&ret, cond);
|
||||
ret
|
||||
}
|
||||
cond
|
||||
}
|
||||
|
|
|
@ -3402,20 +3402,62 @@ pub const fn contract_checks() -> bool {
|
|||
///
|
||||
/// By default, if `contract_checks` is enabled, this will panic with no unwind if the condition
|
||||
/// returns false.
|
||||
#[unstable(feature = "contracts_internals", issue = "128044" /* compiler-team#759 */)]
|
||||
///
|
||||
/// Note that this function is a no-op during constant evaluation.
|
||||
#[unstable(feature = "contracts_internals", issue = "128044")]
|
||||
// Calls to this function get inserted by an AST expansion pass, which uses the equivalent of
|
||||
// `#[allow_internal_unstable]` to allow using `contracts_internals` functions. Const-checking
|
||||
// doesn't honor `#[allow_internal_unstable]`, so for the const feature gate we use the user-facing
|
||||
// `contracts` feature rather than the perma-unstable `contracts_internals`
|
||||
#[rustc_const_unstable(feature = "contracts", issue = "128044")]
|
||||
#[lang = "contract_check_requires"]
|
||||
#[rustc_intrinsic]
|
||||
pub fn contract_check_requires<C: Fn() -> bool>(cond: C) {
|
||||
if contract_checks() && !cond() {
|
||||
// Emit no unwind panic in case this was a safety requirement.
|
||||
crate::panicking::panic_nounwind("failed requires check");
|
||||
}
|
||||
pub const fn contract_check_requires<C: Fn() -> bool + Copy>(cond: C) {
|
||||
const_eval_select!(
|
||||
@capture[C: Fn() -> bool + Copy] { cond: C } :
|
||||
if const {
|
||||
// Do nothing
|
||||
} else {
|
||||
if contract_checks() && !cond() {
|
||||
// Emit no unwind panic in case this was a safety requirement.
|
||||
crate::panicking::panic_nounwind("failed requires check");
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
/// Check if the post-condition `cond` has been met.
|
||||
///
|
||||
/// By default, if `contract_checks` is enabled, this will panic with no unwind if the condition
|
||||
/// returns false.
|
||||
///
|
||||
/// Note that this function is a no-op during constant evaluation.
|
||||
#[cfg(not(bootstrap))]
|
||||
#[unstable(feature = "contracts_internals", issue = "128044")]
|
||||
// Similar to `contract_check_requires`, we need to use the user-facing
|
||||
// `contracts` feature rather than the perma-unstable `contracts_internals`.
|
||||
// Const-checking doesn't honor allow_internal_unstable logic used by contract expansion.
|
||||
#[rustc_const_unstable(feature = "contracts", issue = "128044")]
|
||||
#[lang = "contract_check_ensures"]
|
||||
#[rustc_intrinsic]
|
||||
pub const fn contract_check_ensures<C: Fn(&Ret) -> bool + Copy, Ret>(cond: C, ret: Ret) -> Ret {
|
||||
const_eval_select!(
|
||||
@capture[C: Fn(&Ret) -> bool + Copy, Ret] { cond: C, ret: Ret } -> Ret :
|
||||
if const {
|
||||
// Do nothing
|
||||
ret
|
||||
} else {
|
||||
if contract_checks() && !cond(&ret) {
|
||||
// Emit no unwind panic in case this was a safety requirement.
|
||||
crate::panicking::panic_nounwind("failed ensures check");
|
||||
}
|
||||
ret
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
/// This is the old version of contract_check_ensures kept here for bootstrap only.
|
||||
#[cfg(bootstrap)]
|
||||
#[unstable(feature = "contracts_internals", issue = "128044" /* compiler-team#759 */)]
|
||||
#[rustc_intrinsic]
|
||||
pub fn contract_check_ensures<'a, Ret, C: Fn(&'a Ret) -> bool>(ret: &'a Ret, cond: C) {
|
||||
|
|
|
@ -101,7 +101,6 @@
|
|||
#![feature(bstr)]
|
||||
#![feature(bstr_internals)]
|
||||
#![feature(cfg_match)]
|
||||
#![feature(closure_track_caller)]
|
||||
#![feature(const_carrying_mul_add)]
|
||||
#![feature(const_eval_select)]
|
||||
#![feature(core_intrinsics)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue