about summary refs log tree commit diff
path: root/compiler/rustc_attr/src/builtin.rs
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2024-11-02 20:15:18 +0100
committerRalf Jung <post@ralfj.de>2024-11-10 10:01:27 +0100
commit686eeb83e9c6d7f70848cdf84f490f5c1aa3edd3 (patch)
tree74d0db972f0f0b0a1c75da8ff4361b8051d20124 /compiler/rustc_attr/src/builtin.rs
parent668959740f97e7a22ae340742886d330ab63950f (diff)
downloadrust-686eeb83e9c6d7f70848cdf84f490f5c1aa3edd3.tar.gz
rust-686eeb83e9c6d7f70848cdf84f490f5c1aa3edd3.zip
honor rustc_const_stable_indirect in non-staged_api crate with -Zforce-unstable-if-unmarked
Diffstat (limited to 'compiler/rustc_attr/src/builtin.rs')
-rw-r--r--compiler/rustc_attr/src/builtin.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/compiler/rustc_attr/src/builtin.rs b/compiler/rustc_attr/src/builtin.rs
index 2753ac529d1..3a7ea36f601 100644
--- a/compiler/rustc_attr/src/builtin.rs
+++ b/compiler/rustc_attr/src/builtin.rs
@@ -381,6 +381,26 @@ pub fn find_const_stability(
     const_stab
 }
 
+/// Calculates the const stability for a const function in a `-Zforce-unstable-if-unmarked` crate
+/// without the `staged_api` feature.
+pub fn unmarked_crate_const_stab(
+    _sess: &Session,
+    attrs: &[Attribute],
+    regular_stab: Stability,
+) -> ConstStability {
+    assert!(regular_stab.level.is_unstable());
+    // The only attribute that matters here is `rustc_const_stable_indirect`.
+    // We enforce recursive const stability rules for those functions.
+    let const_stable_indirect =
+        attrs.iter().any(|a| a.name_or_empty() == sym::rustc_const_stable_indirect);
+    ConstStability {
+        feature: Some(regular_stab.feature),
+        const_stable_indirect,
+        promotable: false,
+        level: regular_stab.level,
+    }
+}
+
 /// Collects stability info from `rustc_default_body_unstable` attributes in `attrs`.
 /// Returns `None` if no stability attributes are found.
 pub fn find_body_stability(