diff options
| author | Ralf Jung <post@ralfj.de> | 2024-11-01 22:53:59 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2024-11-04 23:27:46 +0100 |
| commit | 1f0ed2b0f54aff2dbc63ff72261b8acb2c186404 (patch) | |
| tree | a8ba721db6b2a6cde839173c4e58a08f6bfd9fbe /compiler/rustc_const_eval/src/check_consts/check.rs | |
| parent | 10723c28964d582814ea8e07dbd8fa7367e0eaee (diff) | |
| download | rust-1f0ed2b0f54aff2dbc63ff72261b8acb2c186404.tar.gz rust-1f0ed2b0f54aff2dbc63ff72261b8acb2c186404.zip | |
add new rustc_const_stable_intrinsic attribute for const-stable intrinsics
Diffstat (limited to 'compiler/rustc_const_eval/src/check_consts/check.rs')
| -rw-r--r-- | compiler/rustc_const_eval/src/check_consts/check.rs | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/compiler/rustc_const_eval/src/check_consts/check.rs b/compiler/rustc_const_eval/src/check_consts/check.rs index 8cb7e02036f..1c17421e782 100644 --- a/compiler/rustc_const_eval/src/check_consts/check.rs +++ b/compiler/rustc_const_eval/src/check_consts/check.rs @@ -736,16 +736,19 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> { // Intrinsics are language primitives, not regular calls, so treat them separately. if let Some(intrinsic) = tcx.intrinsic(callee) { + // We use `intrinsic.const_stable` to determine if this can be safely exposed to + // stable code, rather than `const_stable_indirect`. This is to make + // `#[rustc_const_stable_indirect]` an attribute that is always safe to add. match tcx.lookup_const_stability(callee) { None => { // Non-const intrinsic. self.check_op(ops::IntrinsicNonConst { name: intrinsic.name }); } - Some(ConstStability { feature: None, const_stable_indirect, .. }) => { + Some(ConstStability { feature: None, .. }) => { // Intrinsic does not need a separate feature gate (we rely on the // regular stability checker). However, we have to worry about recursive // const stability. - if !const_stable_indirect && self.enforce_recursive_const_stability() { + if !intrinsic.const_stable && self.enforce_recursive_const_stability() { self.dcx().emit_err(errors::UnmarkedIntrinsicExposed { span: self.span, def_path: self.tcx.def_path_str(callee), @@ -755,17 +758,17 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> { Some(ConstStability { feature: Some(feature), level: StabilityLevel::Unstable { .. }, - const_stable_indirect, .. }) => { self.check_op(ops::IntrinsicUnstable { name: intrinsic.name, feature, - const_stable_indirect, + const_stable: intrinsic.const_stable, }); } Some(ConstStability { level: StabilityLevel::Stable { .. }, .. }) => { - // All good. + // All good. But ensure this is indeed a const-stable intrinsic. + assert!(intrinsic.const_stable); } } // This completes the checks for intrinsics. |
