@@ -2508,62 +2508,7 @@ extern "rust-intrinsic" {
2508
2508
#[ rustc_nounwind]
2509
2509
pub fn vtable_align ( ptr : * const ( ) ) -> usize ;
2510
2510
2511
- /// Selects which function to call depending on the context.
2512
- ///
2513
- /// If this function is evaluated at compile-time, then a call to this
2514
- /// intrinsic will be replaced with a call to `called_in_const`. It gets
2515
- /// replaced with a call to `called_at_rt` otherwise.
2516
- ///
2517
- /// This function is safe to call, but note the stability concerns below.
2518
- ///
2519
- /// # Type Requirements
2520
- ///
2521
- /// The two functions must be both function items. They cannot be function
2522
- /// pointers or closures. The first function must be a `const fn`.
2523
- ///
2524
- /// `arg` will be the tupled arguments that will be passed to either one of
2525
- /// the two functions, therefore, both functions must accept the same type of
2526
- /// arguments. Both functions must return RET.
2527
- ///
2528
- /// # Stability concerns
2529
- ///
2530
- /// Rust has not yet decided that `const fn` are allowed to tell whether
2531
- /// they run at compile-time or at runtime. Therefore, when using this
2532
- /// intrinsic anywhere that can be reached from stable, it is crucial that
2533
- /// the end-to-end behavior of the stable `const fn` is the same for both
2534
- /// modes of execution. (Here, Undefined Behavior is considered "the same"
2535
- /// as any other behavior, so if the function exhibits UB at runtime then
2536
- /// it may do whatever it wants at compile-time.)
2537
- ///
2538
- /// Here is an example of how this could cause a problem:
2539
- /// ```no_run
2540
- /// #![feature(const_eval_select)]
2541
- /// #![feature(core_intrinsics)]
2542
- /// # #![allow(internal_features)]
2543
- /// # #![cfg_attr(bootstrap, allow(unused))]
2544
- /// use std::intrinsics::const_eval_select;
2545
- ///
2546
- /// // Standard library
2547
- /// # #[cfg(not(bootstrap))]
2548
- /// pub const fn inconsistent() -> i32 {
2549
- /// fn runtime() -> i32 { 1 }
2550
- /// const fn compiletime() -> i32 { 2 }
2551
- ///
2552
- // // ⚠ This code violates the required equivalence of `compiletime`
2553
- /// // and `runtime`.
2554
- /// const_eval_select((), compiletime, runtime)
2555
- /// }
2556
- /// # #[cfg(bootstrap)]
2557
- /// # pub const fn inconsistent() -> i32 { 0 }
2558
- ///
2559
- /// // User Crate
2560
- /// const X: i32 = inconsistent();
2561
- /// let x = inconsistent();
2562
- /// assert_eq!(x, X);
2563
- /// ```
2564
- ///
2565
- /// Currently such an assertion would always succeed; until Rust decides
2566
- /// otherwise, that principle should not be violated.
2511
+ #[ cfg( bootstrap) ]
2567
2512
#[ rustc_const_unstable( feature = "const_eval_select" , issue = "none" ) ]
2568
2513
#[ cfg_attr( not( bootstrap) , rustc_safe_intrinsic) ]
2569
2514
pub fn const_eval_select < ARG : Tuple , F , G , RET > (
@@ -2576,6 +2521,79 @@ extern "rust-intrinsic" {
2576
2521
F : FnOnce < ARG , Output = RET > ;
2577
2522
}
2578
2523
2524
+ /// Selects which function to call depending on the context.
2525
+ ///
2526
+ /// If this function is evaluated at compile-time, then a call to this
2527
+ /// intrinsic will be replaced with a call to `called_in_const`. It gets
2528
+ /// replaced with a call to `called_at_rt` otherwise.
2529
+ ///
2530
+ /// This function is safe to call, but note the stability concerns below.
2531
+ ///
2532
+ /// # Type Requirements
2533
+ ///
2534
+ /// The two functions must be both function items. They cannot be function
2535
+ /// pointers or closures. The first function must be a `const fn`.
2536
+ ///
2537
+ /// `arg` will be the tupled arguments that will be passed to either one of
2538
+ /// the two functions, therefore, both functions must accept the same type of
2539
+ /// arguments. Both functions must return RET.
2540
+ ///
2541
+ /// # Stability concerns
2542
+ ///
2543
+ /// Rust has not yet decided that `const fn` are allowed to tell whether
2544
+ /// they run at compile-time or at runtime. Therefore, when using this
2545
+ /// intrinsic anywhere that can be reached from stable, it is crucial that
2546
+ /// the end-to-end behavior of the stable `const fn` is the same for both
2547
+ /// modes of execution. (Here, Undefined Behavior is considered "the same"
2548
+ /// as any other behavior, so if the function exhibits UB at runtime then
2549
+ /// it may do whatever it wants at compile-time.)
2550
+ ///
2551
+ /// Here is an example of how this could cause a problem:
2552
+ /// ```no_run
2553
+ /// #![feature(const_eval_select)]
2554
+ /// #![feature(core_intrinsics)]
2555
+ /// # #![allow(internal_features)]
2556
+ /// # #![cfg_attr(bootstrap, allow(unused))]
2557
+ /// use std::intrinsics::const_eval_select;
2558
+ ///
2559
+ /// // Standard library
2560
+ /// # #[cfg(not(bootstrap))]
2561
+ /// pub const fn inconsistent() -> i32 {
2562
+ /// fn runtime() -> i32 { 1 }
2563
+ /// const fn compiletime() -> i32 { 2 }
2564
+ ///
2565
+ // // ⚠ This code violates the required equivalence of `compiletime`
2566
+ /// // and `runtime`.
2567
+ /// const_eval_select((), compiletime, runtime)
2568
+ /// }
2569
+ /// # #[cfg(bootstrap)]
2570
+ /// # pub const fn inconsistent() -> i32 { 0 }
2571
+ ///
2572
+ /// // User Crate
2573
+ /// const X: i32 = inconsistent();
2574
+ /// let x = inconsistent();
2575
+ /// assert_eq!(x, X);
2576
+ /// ```
2577
+ ///
2578
+ /// Currently such an assertion would always succeed; until Rust decides
2579
+ /// otherwise, that principle should not be violated.
2580
+ #[ rustc_const_unstable( feature = "const_eval_select" , issue = "none" ) ]
2581
+ #[ unstable( feature = "core_intrinsics" , issue = "none" ) ]
2582
+ #[ cfg( not( bootstrap) ) ]
2583
+ #[ rustc_intrinsic]
2584
+ #[ rustc_intrinsic_must_be_overridden]
2585
+ pub const fn const_eval_select < ARG : Tuple , F , G , RET > (
2586
+ _arg : ARG ,
2587
+ _called_in_const : F ,
2588
+ _called_at_rt : G ,
2589
+ ) -> RET
2590
+ where
2591
+ G : FnOnce < ARG , Output = RET > ,
2592
+ F : FnOnce < ARG , Output = RET > ,
2593
+ {
2594
+ unreachable ! ( )
2595
+ }
2596
+
2579
2597
/// Returns whether the argument's value is statically known at
2580
2598
/// compile-time.
2581
2599
///
0 commit comments