@@ -2368,32 +2368,6 @@ extern "rust-intrinsic" {
2368
2368
#[ rustc_nounwind]
2369
2369
pub fn ptr_guaranteed_cmp < T > ( ptr : * const T , other : * const T ) -> u8 ;
2370
2370
2371
- /// Allocates a block of memory at compile time.
2372
- /// At runtime, just returns a null pointer.
2373
- ///
2374
- /// # Safety
2375
- ///
2376
- /// - The `align` argument must be a power of two.
2377
- /// - At compile time, a compile error occurs if this constraint is violated.
2378
- /// - At runtime, it is not checked.
2379
- #[ rustc_const_unstable( feature = "const_heap" , issue = "79597" ) ]
2380
- #[ rustc_nounwind]
2381
- pub fn const_allocate ( size : usize , align : usize ) -> * mut u8 ;
2382
-
2383
- /// Deallocates a memory which allocated by `intrinsics::const_allocate` at compile time.
2384
- /// At runtime, does nothing.
2385
- ///
2386
- /// # Safety
2387
- ///
2388
- /// - The `align` argument must be a power of two.
2389
- /// - At compile time, a compile error occurs if this constraint is violated.
2390
- /// - At runtime, it is not checked.
2391
- /// - If the `ptr` is created in an another const, this intrinsic doesn't deallocate it.
2392
- /// - If the `ptr` is pointing to a local variable, this intrinsic doesn't deallocate it.
2393
- #[ rustc_const_unstable( feature = "const_heap" , issue = "79597" ) ]
2394
- #[ rustc_nounwind]
2395
- pub fn const_deallocate ( ptr : * mut u8 , size : usize , align : usize ) ;
2396
-
2397
2371
/// Determines whether the raw bytes of the two values are equal.
2398
2372
///
2399
2373
/// This is particularly handy for arrays, since it allows things like just
@@ -2517,83 +2491,112 @@ extern "rust-intrinsic" {
2517
2491
where
2518
2492
G : FnOnce < ARG , Output = RET > ,
2519
2493
F : FnOnce < ARG , Output = RET > ;
2494
+ }
2520
2495
2521
- /// Returns whether the argument's value is statically known at
2522
- /// compile-time.
2523
- ///
2524
- /// This is useful when there is a way of writing the code that will
2525
- /// be *faster* when some variables have known values, but *slower*
2526
- /// in the general case: an `if is_val_statically_known(var)` can be used
2527
- /// to select between these two variants. The `if` will be optimized away
2528
- /// and only the desired branch remains.
2529
- ///
2530
- /// Formally speaking, this function non-deterministically returns `true`
2531
- /// or `false`, and the caller has to ensure sound behavior for both cases.
2532
- /// In other words, the following code has *Undefined Behavior*:
2533
- ///
2534
- /// ```no_run
2535
- /// #![feature(is_val_statically_known)]
2536
- /// #![feature(core_intrinsics)]
2537
- /// # #![allow(internal_features)]
2538
- /// use std::hint::unreachable_unchecked;
2539
- /// use std::intrinsics::is_val_statically_known;
2540
- ///
2541
- /// unsafe {
2542
- /// if !is_val_statically_known(0) { unreachable_unchecked(); }
2543
- /// }
2544
- /// ```
2545
- ///
2546
- /// This also means that the following code's behavior is unspecified; it
2547
- /// may panic, or it may not:
2548
- ///
2549
- /// ```no_run
2550
- /// #![feature(is_val_statically_known)]
2551
- /// #![feature(core_intrinsics)]
2552
- /// # #![allow(internal_features)]
2553
- /// use std::intrinsics::is_val_statically_known;
2554
- ///
2555
- /// unsafe {
2556
- /// assert_eq!(is_val_statically_known(0), is_val_statically_known(0));
2557
- /// }
2558
- /// ```
2559
- ///
2560
- /// Unsafe code may not rely on `is_val_statically_known` returning any
2561
- /// particular value, ever. However, the compiler will generally make it
2562
- /// return `true` only if the value of the argument is actually known.
2563
- ///
2564
- /// When calling this in a `const fn`, both paths must be semantically
2565
- /// equivalent, that is, the result of the `true` branch and the `false`
2566
- /// branch must return the same value and have the same side-effects *no
2567
- /// matter what*.
2568
- #[ rustc_const_unstable( feature = "is_val_statically_known" , issue = "none" ) ]
2569
- #[ rustc_nounwind]
2570
- pub fn is_val_statically_known < T : Copy > ( arg : T ) -> bool ;
2571
-
2572
- /// Returns the value of `cfg!(debug_assertions)`, but after monomorphization instead of in
2573
- /// macro expansion.
2574
- ///
2575
- /// This always returns `false` in const eval and Miri. The interpreter provides better
2576
- /// diagnostics than the checks that this is used to implement. However, this means
2577
- /// you should only be using this intrinsic to guard requirements that, if violated,
2578
- /// immediately lead to UB. Otherwise, const-eval and Miri will miss out on those
2579
- /// checks entirely.
2580
- ///
2581
- /// Since this is evaluated after monomorphization, branching on this value can be used to
2582
- /// implement debug assertions that are included in the precompiled standard library, but can
2583
- /// be optimized out by builds that monomorphize the standard library code with debug
2584
- /// assertions disabled. This intrinsic is primarily used by [`assert_unsafe_precondition`].
2585
- #[ rustc_const_unstable( feature = "delayed_debug_assertions" , issue = "none" ) ]
2586
- #[ rustc_safe_intrinsic]
2587
- #[ cfg( not( bootstrap) ) ]
2588
- pub ( crate ) fn debug_assertions ( ) -> bool ;
2496
+ /// Returns whether the argument's value is statically known at
2497
+ /// compile-time.
2498
+ ///
2499
+ /// This is useful when there is a way of writing the code that will
2500
+ /// be *faster* when some variables have known values, but *slower*
2501
+ /// in the general case: an `if is_val_statically_known(var)` can be used
2502
+ /// to select between these two variants. The `if` will be optimized away
2503
+ /// and only the desired branch remains.
2504
+ ///
2505
+ /// Formally speaking, this function non-deterministically returns `true`
2506
+ /// or `false`, and the caller has to ensure sound behavior for both cases.
2507
+ /// In other words, the following code has *Undefined Behavior*:
2508
+ ///
2509
+ /// ```no_run
2510
+ /// #![feature(is_val_statically_known)]
2511
+ /// #![feature(core_intrinsics)]
2512
+ /// # #![allow(internal_features)]
2513
+ /// use std::hint::unreachable_unchecked;
2514
+ /// use std::intrinsics::is_val_statically_known;
2515
+ ///
2516
+ /// if !is_val_statically_known(0) { unsafe { unreachable_unchecked(); } }
2517
+ /// ```
2518
+ ///
2519
+ /// This also means that the following code's behavior is unspecified; it
2520
+ /// may panic, or it may not:
2521
+ ///
2522
+ /// ```no_run
2523
+ /// #![feature(is_val_statically_known)]
2524
+ /// #![feature(core_intrinsics)]
2525
+ /// # #![allow(internal_features)]
2526
+ /// use std::intrinsics::is_val_statically_known;
2527
+ ///
2528
+ /// assert_eq!(is_val_statically_known(0), is_val_statically_known(0));
2529
+ /// ```
2530
+ ///
2531
+ /// Unsafe code may not rely on `is_val_statically_known` returning any
2532
+ /// particular value, ever. However, the compiler will generally make it
2533
+ /// return `true` only if the value of the argument is actually known.
2534
+ ///
2535
+ /// When calling this in a `const fn`, both paths must be semantically
2536
+ /// equivalent, that is, the result of the `true` branch and the `false`
2537
+ /// branch must return the same value and have the same side-effects *no
2538
+ /// matter what*.
2539
+ #[ rustc_const_unstable( feature = "is_val_statically_known" , issue = "none" ) ]
2540
+ #[ rustc_nounwind]
2541
+ #[ unstable( feature = "core_intrinsics" , issue = "none" ) ]
2542
+ #[ cfg_attr( not( bootstrap) , rustc_intrinsic) ]
2543
+ pub const fn is_val_statically_known < T : Copy > ( _arg : T ) -> bool {
2544
+ false
2589
2545
}
2590
2546
2591
- #[ cfg( bootstrap) ]
2547
+ /// Returns the value of `cfg!(debug_assertions)`, but after monomorphization instead of in
2548
+ /// macro expansion.
2549
+ ///
2550
+ /// This always returns `false` in const eval and Miri. The interpreter provides better
2551
+ /// diagnostics than the checks that this is used to implement. However, this means
2552
+ /// you should only be using this intrinsic to guard requirements that, if violated,
2553
+ /// immediately lead to UB. Otherwise, const-eval and Miri will miss out on those
2554
+ /// checks entirely.
2555
+ ///
2556
+ /// Since this is evaluated after monomorphization, branching on this value can be used to
2557
+ /// implement debug assertions that are included in the precompiled standard library, but can
2558
+ /// be optimized out by builds that monomorphize the standard library code with debug
2559
+ /// assertions disabled. This intrinsic is primarily used by [`assert_unsafe_precondition`].
2592
2560
#[ rustc_const_unstable( feature = "delayed_debug_assertions" , issue = "none" ) ]
2561
+ #[ unstable( feature = "core_intrinsics" , issue = "none" ) ]
2562
+ #[ cfg_attr( not( bootstrap) , rustc_intrinsic) ]
2593
2563
pub ( crate ) const fn debug_assertions ( ) -> bool {
2594
2564
cfg ! ( debug_assertions)
2595
2565
}
2596
2566
2567
+ /// Allocates a block of memory at compile time.
2568
+ /// At runtime, just returns a null pointer.
2569
+ ///
2570
+ /// # Safety
2571
+ ///
2572
+ /// - The `align` argument must be a power of two.
2573
+ /// - At compile time, a compile error occurs if this constraint is violated.
2574
+ /// - At runtime, it is not checked.
2575
+ #[ rustc_const_unstable( feature = "const_heap" , issue = "79597" ) ]
2576
+ #[ unstable( feature = "core_intrinsics" , issue = "none" ) ]
2577
+ #[ rustc_nounwind]
2578
+ #[ cfg_attr( not( bootstrap) , rustc_intrinsic) ]
2579
+ pub const unsafe fn const_allocate ( _size : usize , _align : usize ) -> * mut u8 {
2580
+ // const eval overrides this function, but runtime code should always just return null pointers.
2581
+ crate :: ptr:: null_mut ( )
2582
+ }
2583
+
2584
+ /// Deallocates a memory which allocated by `intrinsics::const_allocate` at compile time.
2585
+ /// At runtime, does nothing.
2586
+ ///
2587
+ /// # Safety
2588
+ ///
2589
+ /// - The `align` argument must be a power of two.
2590
+ /// - At compile time, a compile error occurs if this constraint is violated.
2591
+ /// - At runtime, it is not checked.
2592
+ /// - If the `ptr` is created in an another const, this intrinsic doesn't deallocate it.
2593
+ /// - If the `ptr` is pointing to a local variable, this intrinsic doesn't deallocate it.
2594
+ #[ rustc_const_unstable( feature = "const_heap" , issue = "79597" ) ]
2595
+ #[ unstable( feature = "core_intrinsics" , issue = "none" ) ]
2596
+ #[ rustc_nounwind]
2597
+ #[ cfg_attr( not( bootstrap) , rustc_intrinsic) ]
2598
+ pub const unsafe fn const_deallocate ( _ptr : * mut u8 , _size : usize , _align : usize ) { }
2599
+
2597
2600
// Some functions are defined here because they accidentally got made
2598
2601
// available in this module on stable. See <https://github.com/rust-lang/rust/issues/15702>.
2599
2602
// (`transmute` also falls into this category, but it cannot be wrapped due to the
0 commit comments