@@ -947,7 +947,6 @@ extern "rust-intrinsic" {
947
947
#[rustc_const_stable(feature = "const_unreachable_unchecked", since = "1.57.0")]
948
948
#[rustc_nounwind]
949
949
pub fn unreachable() -> !;
950
-
951
950
}
952
951
953
952
/// Informs the optimizer that a condition is always true.
@@ -1018,78 +1017,40 @@ extern "rust-intrinsic" {
1018
1017
#[rustc_nounwind]
1019
1018
pub fn breakpoint();
1020
1019
1021
- /// The size of a type in bytes.
1022
- ///
1023
- /// Note that, unlike most intrinsics, this is safe to call;
1024
- /// it does not require an `unsafe` block.
1025
- /// Therefore, implementations must not require the user to uphold
1026
- /// any safety invariants.
1027
- ///
1028
- /// More specifically, this is the offset in bytes between successive
1029
- /// items of the same type, including alignment padding.
1030
- ///
1031
- /// The stabilized version of this intrinsic is [`core::mem::size_of`].
1020
+ #[cfg(bootstrap)]
1032
1021
#[rustc_const_stable(feature = "const_size_of", since = "1.40.0")]
1033
1022
#[rustc_safe_intrinsic]
1034
1023
#[rustc_nounwind]
1035
1024
pub fn size_of<T>() -> usize;
1036
1025
1037
- /// The minimum alignment of a type.
1038
- ///
1039
- /// Note that, unlike most intrinsics, this is safe to call;
1040
- /// it does not require an `unsafe` block.
1041
- /// Therefore, implementations must not require the user to uphold
1042
- /// any safety invariants.
1043
- ///
1044
- /// The stabilized version of this intrinsic is [`core::mem::align_of`].
1026
+ #[cfg(bootstrap)]
1045
1027
#[rustc_const_stable(feature = "const_min_align_of", since = "1.40.0")]
1046
1028
#[rustc_safe_intrinsic]
1047
1029
#[rustc_nounwind]
1048
1030
pub fn min_align_of<T>() -> usize;
1049
- /// The preferred alignment of a type.
1050
- ///
1051
- /// This intrinsic does not have a stable counterpart.
1052
- /// It's "tracking issue" is [#91971](https://github.com/rust-lang/rust/issues/91971).
1031
+
1032
+ #[cfg(bootstrap)]
1053
1033
#[rustc_const_unstable(feature = "const_pref_align_of", issue = "91971")]
1054
1034
#[rustc_nounwind]
1055
1035
pub fn pref_align_of<T>() -> usize;
1056
1036
1057
- /// The size of the referenced value in bytes.
1058
- ///
1059
- /// The stabilized version of this intrinsic is [`crate::mem::size_of_val`].
1037
+ #[cfg(bootstrap)]
1060
1038
#[rustc_const_unstable(feature = "const_size_of_val", issue = "46571")]
1061
1039
#[rustc_nounwind]
1062
1040
pub fn size_of_val<T: ?Sized>(_: *const T) -> usize;
1063
- /// The required alignment of the referenced value.
1064
- ///
1065
- /// The stabilized version of this intrinsic is [`core::mem::align_of_val`].
1041
+
1042
+ #[cfg(bootstrap)]
1066
1043
#[rustc_const_unstable(feature = "const_align_of_val", issue = "46571")]
1067
1044
#[rustc_nounwind]
1068
1045
pub fn min_align_of_val<T: ?Sized>(_: *const T) -> usize;
1069
1046
1070
- /// Gets a static string slice containing the name of a type.
1071
- ///
1072
- /// Note that, unlike most intrinsics, this is safe to call;
1073
- /// it does not require an `unsafe` block.
1074
- /// Therefore, implementations must not require the user to uphold
1075
- /// any safety invariants.
1076
- ///
1077
- /// The stabilized version of this intrinsic is [`core::any::type_name`].
1047
+ #[cfg(bootstrap)]
1078
1048
#[rustc_const_unstable(feature = "const_type_name", issue = "63084")]
1079
1049
#[rustc_safe_intrinsic]
1080
1050
#[rustc_nounwind]
1081
1051
pub fn type_name<T: ?Sized>() -> &'static str;
1082
1052
1083
- /// Gets an identifier which is globally unique to the specified type. This
1084
- /// function will return the same value for a type regardless of whichever
1085
- /// crate it is invoked in.
1086
- ///
1087
- /// Note that, unlike most intrinsics, this is safe to call;
1088
- /// it does not require an `unsafe` block.
1089
- /// Therefore, implementations must not require the user to uphold
1090
- /// any safety invariants.
1091
- ///
1092
- /// The stabilized version of this intrinsic is [`core::any::TypeId::of`].
1053
+ #[cfg(bootstrap)]
1093
1054
#[rustc_const_unstable(feature = "const_type_id", issue = "77125")]
1094
1055
#[rustc_safe_intrinsic]
1095
1056
#[rustc_nounwind]
@@ -2424,15 +2385,7 @@ extern "rust-intrinsic" {
2424
2385
#[rustc_nounwind]
2425
2386
pub fn discriminant_value<T>(v: &T) -> <T as DiscriminantKind>::Discriminant;
2426
2387
2427
- /// Returns the number of variants of the type `T` cast to a `usize`;
2428
- /// if `T` has no variants, returns `0`. Uninhabited variants will be counted.
2429
- ///
2430
- /// Note that, unlike most intrinsics, this is safe to call;
2431
- /// it does not require an `unsafe` block.
2432
- /// Therefore, implementations must not require the user to uphold
2433
- /// any safety invariants.
2434
- ///
2435
- /// The to-be-stabilized version of this intrinsic is [`crate::mem::variant_count`].
2388
+ #[cfg(bootstrap)]
2436
2389
#[rustc_const_unstable(feature = "variant_count", issue = "73662")]
2437
2390
#[rustc_safe_intrinsic]
2438
2391
#[rustc_nounwind]
@@ -2773,8 +2726,11 @@ pub const unsafe fn const_deallocate(_ptr: *mut u8, _size: usize, _align: usize)
2773
2726
// Runtime NOP
2774
2727
}
2775
2728
2776
- /// `ptr` must point to a vtable.
2777
2729
/// The intrinsic will return the size stored in that vtable.
2730
+ ///
2731
+ /// # Safety
2732
+ ///
2733
+ /// `ptr` must point to a vtable.
2778
2734
#[rustc_nounwind]
2779
2735
#[unstable(feature = "core_intrinsics", issue = "none")]
2780
2736
#[rustc_intrinsic]
@@ -2783,8 +2739,11 @@ pub unsafe fn vtable_size(_ptr: *const ()) -> usize {
2783
2739
unreachable!()
2784
2740
}
2785
2741
2786
- /// `ptr` must point to a vtable.
2787
2742
/// The intrinsic will return the alignment stored in that vtable.
2743
+ ///
2744
+ /// # Safety
2745
+ ///
2746
+ /// `ptr` must point to a vtable.
2788
2747
#[rustc_nounwind]
2789
2748
#[unstable(feature = "core_intrinsics", issue = "none")]
2790
2749
#[rustc_intrinsic]
@@ -2793,6 +2752,150 @@ pub unsafe fn vtable_align(_ptr: *const ()) -> usize {
2793
2752
unreachable!()
2794
2753
}
2795
2754
2755
+ /// The size of a type in bytes.
2756
+ ///
2757
+ /// Note that, unlike most intrinsics, this is safe to call;
2758
+ /// it does not require an `unsafe` block.
2759
+ /// Therefore, implementations must not require the user to uphold
2760
+ /// any safety invariants.
2761
+ ///
2762
+ /// More specifically, this is the offset in bytes between successive
2763
+ /// items of the same type, including alignment padding.
2764
+ ///
2765
+ /// The stabilized version of this intrinsic is [`core::mem::size_of`].
2766
+ #[rustc_nounwind]
2767
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2768
+ #[rustc_const_stable(feature = "const_size_of", since = "1.40.0")]
2769
+ #[rustc_intrinsic]
2770
+ #[rustc_intrinsic_must_be_overridden]
2771
+ #[cfg(not(bootstrap))]
2772
+ pub const fn size_of<T>() -> usize {
2773
+ unreachable!()
2774
+ }
2775
+
2776
+ /// The minimum alignment of a type.
2777
+ ///
2778
+ /// Note that, unlike most intrinsics, this is safe to call;
2779
+ /// it does not require an `unsafe` block.
2780
+ /// Therefore, implementations must not require the user to uphold
2781
+ /// any safety invariants.
2782
+ ///
2783
+ /// The stabilized version of this intrinsic is [`core::mem::align_of`].
2784
+ #[rustc_nounwind]
2785
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2786
+ #[rustc_const_stable(feature = "const_min_align_of", since = "1.40.0")]
2787
+ #[rustc_intrinsic]
2788
+ #[rustc_intrinsic_must_be_overridden]
2789
+ #[cfg(not(bootstrap))]
2790
+ pub const fn min_align_of<T>() -> usize {
2791
+ unreachable!()
2792
+ }
2793
+
2794
+ /// The preferred alignment of a type.
2795
+ ///
2796
+ /// This intrinsic does not have a stable counterpart.
2797
+ /// It's "tracking issue" is [#91971](https://github.com/rust-lang/rust/issues/91971).
2798
+ #[rustc_nounwind]
2799
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2800
+ #[rustc_const_unstable(feature = "const_pref_align_of", issue = "91971")]
2801
+ #[rustc_intrinsic]
2802
+ #[rustc_intrinsic_must_be_overridden]
2803
+ #[cfg(not(bootstrap))]
2804
+ pub const unsafe fn pref_align_of<T>() -> usize {
2805
+ unreachable!()
2806
+ }
2807
+
2808
+ /// Returns the number of variants of the type `T` cast to a `usize`;
2809
+ /// if `T` has no variants, returns `0`. Uninhabited variants will be counted.
2810
+ ///
2811
+ /// Note that, unlike most intrinsics, this is safe to call;
2812
+ /// it does not require an `unsafe` block.
2813
+ /// Therefore, implementations must not require the user to uphold
2814
+ /// any safety invariants.
2815
+ ///
2816
+ /// The to-be-stabilized version of this intrinsic is [`crate::mem::variant_count`].
2817
+ #[rustc_nounwind]
2818
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2819
+ #[rustc_const_unstable(feature = "variant_count", issue = "73662")]
2820
+ #[rustc_intrinsic]
2821
+ #[rustc_intrinsic_must_be_overridden]
2822
+ #[cfg(not(bootstrap))]
2823
+ pub const fn variant_count<T>() -> usize {
2824
+ unreachable!()
2825
+ }
2826
+
2827
+ /// The size of the referenced value in bytes.
2828
+ ///
2829
+ /// The stabilized version of this intrinsic is [`crate::mem::size_of_val`].
2830
+ ///
2831
+ /// # Safety
2832
+ ///
2833
+ /// See [`crate::mem::size_of_val_raw`] for safety conditions.
2834
+ #[rustc_nounwind]
2835
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2836
+ #[rustc_const_unstable(feature = "const_size_of_val", issue = "46571")]
2837
+ #[rustc_intrinsic]
2838
+ #[rustc_intrinsic_must_be_overridden]
2839
+ #[cfg(not(bootstrap))]
2840
+ pub const unsafe fn size_of_val<T: ?Sized>(_ptr: *const T) -> usize {
2841
+ unreachable!()
2842
+ }
2843
+
2844
+ /// The required alignment of the referenced value.
2845
+ ///
2846
+ /// The stabilized version of this intrinsic is [`core::mem::align_of_val`].
2847
+ ///
2848
+ /// # Safety
2849
+ ///
2850
+ /// See [`crate::mem::align_of_val_raw`] for safety conditions.
2851
+ #[rustc_nounwind]
2852
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2853
+ #[rustc_const_unstable(feature = "const_align_of_val", issue = "46571")]
2854
+ #[rustc_intrinsic]
2855
+ #[rustc_intrinsic_must_be_overridden]
2856
+ #[cfg(not(bootstrap))]
2857
+ pub const unsafe fn min_align_of_val<T: ?Sized>(_ptr: *const T) -> usize {
2858
+ unreachable!()
2859
+ }
2860
+
2861
+ /// Gets a static string slice containing the name of a type.
2862
+ ///
2863
+ /// Note that, unlike most intrinsics, this is safe to call;
2864
+ /// it does not require an `unsafe` block.
2865
+ /// Therefore, implementations must not require the user to uphold
2866
+ /// any safety invariants.
2867
+ ///
2868
+ /// The stabilized version of this intrinsic is [`core::any::type_name`].
2869
+ #[rustc_nounwind]
2870
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2871
+ #[rustc_const_unstable(feature = "const_type_name", issue = "63084")]
2872
+ #[rustc_intrinsic]
2873
+ #[rustc_intrinsic_must_be_overridden]
2874
+ #[cfg(not(bootstrap))]
2875
+ pub const fn type_name<T: ?Sized>() -> &'static str {
2876
+ unreachable!()
2877
+ }
2878
+
2879
+ /// Gets an identifier which is globally unique to the specified type. This
2880
+ /// function will return the same value for a type regardless of whichever
2881
+ /// crate it is invoked in.
2882
+ ///
2883
+ /// Note that, unlike most intrinsics, this is safe to call;
2884
+ /// it does not require an `unsafe` block.
2885
+ /// Therefore, implementations must not require the user to uphold
2886
+ /// any safety invariants.
2887
+ ///
2888
+ /// The stabilized version of this intrinsic is [`core::any::TypeId::of`].
2889
+ #[rustc_nounwind]
2890
+ #[unstable(feature = "core_intrinsics", issue = "none")]
2891
+ #[rustc_const_unstable(feature = "const_type_id", issue = "77125")]
2892
+ #[rustc_intrinsic]
2893
+ #[rustc_intrinsic_must_be_overridden]
2894
+ #[cfg(not(bootstrap))]
2895
+ pub const fn type_id<T: ?Sized + 'static>() -> u128 {
2896
+ unreachable!()
2897
+ }
2898
+
2796
2899
/// Lowers in MIR to `Rvalue::Aggregate` with `AggregateKind::RawPtr`.
2797
2900
///
2798
2901
/// This is used to implement functions like `slice::from_raw_parts_mut` and
0 commit comments