Skip to content

Commit 7c47c5b

Browse files
authored
Rollup merge of rust-lang#121192 - oli-obk:intrinsics2.0, r=WaffleLapkin
Give some intrinsics fallback bodies cc rust-lang#93145
2 parents 842f628 + 8db6fc4 commit 7c47c5b

File tree

1 file changed

+59
-43
lines changed

1 file changed

+59
-43
lines changed

core/src/intrinsics.rs

Lines changed: 59 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -937,52 +937,68 @@ extern "rust-intrinsic" {
937937
#[rustc_nounwind]
938938
pub fn unreachable() -> !;
939939

940-
/// Informs the optimizer that a condition is always true.
941-
/// If the condition is false, the behavior is undefined.
942-
///
943-
/// No code is generated for this intrinsic, but the optimizer will try
944-
/// to preserve it (and its condition) between passes, which may interfere
945-
/// with optimization of surrounding code and reduce performance. It should
946-
/// not be used if the invariant can be discovered by the optimizer on its
947-
/// own, or if it does not enable any significant optimizations.
948-
///
949-
/// This intrinsic does not have a stable counterpart.
950-
#[rustc_const_stable(feature = "const_assume", since = "1.77.0")]
951-
#[rustc_nounwind]
952-
pub fn assume(b: bool);
940+
}
953941

954-
/// Hints to the compiler that branch condition is likely to be true.
955-
/// Returns the value passed to it.
956-
///
957-
/// Any use other than with `if` statements will probably not have an effect.
958-
///
959-
/// Note that, unlike most intrinsics, this is safe to call;
960-
/// it does not require an `unsafe` block.
961-
/// Therefore, implementations must not require the user to uphold
962-
/// any safety invariants.
963-
///
964-
/// This intrinsic does not have a stable counterpart.
965-
#[rustc_const_unstable(feature = "const_likely", issue = "none")]
966-
#[rustc_safe_intrinsic]
967-
#[rustc_nounwind]
968-
pub fn likely(b: bool) -> bool;
942+
/// Informs the optimizer that a condition is always true.
943+
/// If the condition is false, the behavior is undefined.
944+
///
945+
/// No code is generated for this intrinsic, but the optimizer will try
946+
/// to preserve it (and its condition) between passes, which may interfere
947+
/// with optimization of surrounding code and reduce performance. It should
948+
/// not be used if the invariant can be discovered by the optimizer on its
949+
/// own, or if it does not enable any significant optimizations.
950+
///
951+
/// This intrinsic does not have a stable counterpart.
952+
#[rustc_const_stable(feature = "const_assume", since = "1.77.0")]
953+
#[rustc_nounwind]
954+
#[unstable(feature = "core_intrinsics", issue = "none")]
955+
#[cfg_attr(not(bootstrap), rustc_intrinsic)]
956+
pub const unsafe fn assume(b: bool) {
957+
if !b {
958+
// SAFETY: the caller must guarantee the argument is never `false`
959+
unsafe { unreachable() }
960+
}
961+
}
969962

970-
/// Hints to the compiler that branch condition is likely to be false.
971-
/// Returns the value passed to it.
972-
///
973-
/// Any use other than with `if` statements will probably not have an effect.
974-
///
975-
/// Note that, unlike most intrinsics, this is safe to call;
976-
/// it does not require an `unsafe` block.
977-
/// Therefore, implementations must not require the user to uphold
978-
/// any safety invariants.
979-
///
980-
/// This intrinsic does not have a stable counterpart.
981-
#[rustc_const_unstable(feature = "const_likely", issue = "none")]
982-
#[rustc_safe_intrinsic]
983-
#[rustc_nounwind]
984-
pub fn unlikely(b: bool) -> bool;
963+
/// Hints to the compiler that branch condition is likely to be true.
964+
/// Returns the value passed to it.
965+
///
966+
/// Any use other than with `if` statements will probably not have an effect.
967+
///
968+
/// Note that, unlike most intrinsics, this is safe to call;
969+
/// it does not require an `unsafe` block.
970+
/// Therefore, implementations must not require the user to uphold
971+
/// any safety invariants.
972+
///
973+
/// This intrinsic does not have a stable counterpart.
974+
#[rustc_const_unstable(feature = "const_likely", issue = "none")]
975+
#[unstable(feature = "core_intrinsics", issue = "none")]
976+
#[cfg_attr(not(bootstrap), rustc_intrinsic)]
977+
#[rustc_nounwind]
978+
pub const fn likely(b: bool) -> bool {
979+
b
980+
}
981+
982+
/// Hints to the compiler that branch condition is likely to be false.
983+
/// Returns the value passed to it.
984+
///
985+
/// Any use other than with `if` statements will probably not have an effect.
986+
///
987+
/// Note that, unlike most intrinsics, this is safe to call;
988+
/// it does not require an `unsafe` block.
989+
/// Therefore, implementations must not require the user to uphold
990+
/// any safety invariants.
991+
///
992+
/// This intrinsic does not have a stable counterpart.
993+
#[rustc_const_unstable(feature = "const_likely", issue = "none")]
994+
#[unstable(feature = "core_intrinsics", issue = "none")]
995+
#[cfg_attr(not(bootstrap), rustc_intrinsic)]
996+
#[rustc_nounwind]
997+
pub const fn unlikely(b: bool) -> bool {
998+
b
999+
}
9851000

1001+
extern "rust-intrinsic" {
9861002
/// Executes a breakpoint trap, for inspection by a debugger.
9871003
///
9881004
/// This intrinsic does not have a stable counterpart.

0 commit comments

Comments
 (0)