Skip to content

Commit

Permalink
Rollup merge of rust-lang#129659 - RalfJung:const-fn-lang-feat, r=fee…
Browse files Browse the repository at this point in the history
…1-dead

const fn stability checking: also check declared language features

Fixes rust-lang#129656

`@oli-obk` I assume it is just an oversight that this didn't use `features().declared()`? Or is there a deep reason that this must only check `declared_lib_features`?
  • Loading branch information
matthiaskrgr authored Aug 31, 2024
2 parents 9649706 + c298417 commit ea5bb99
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 7 deletions.
4 changes: 1 addition & 3 deletions compiler/rustc_const_eval/src/check_consts/check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -868,9 +868,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
// Calling an unstable function *always* requires that the corresponding gate
// (or implied gate) be enabled, even if the function has
// `#[rustc_allow_const_fn_unstable(the_gate)]`.
let gate_declared = |gate| {
tcx.features().declared_lib_features.iter().any(|&(sym, _)| sym == gate)
};
let gate_declared = |gate| tcx.features().declared(gate);
let feature_gate_declared = gate_declared(gate);
let implied_gate_declared = implied_by.is_some_and(gate_declared);
if !feature_gate_declared && !implied_gate_declared {
Expand Down
5 changes: 1 addition & 4 deletions compiler/rustc_middle/src/ty/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3093,10 +3093,7 @@ impl<'tcx> TyCtxt<'tcx> {
Some(stability) if stability.is_const_unstable() => {
// has a `rustc_const_unstable` attribute, check whether the user enabled the
// corresponding feature gate.
self.features()
.declared_lib_features
.iter()
.any(|&(sym, _)| sym == stability.feature)
self.features().declared(stability.feature)
}
// functions without const stability are either stable user written
// const fn or the user is using feature gates and we thus don't
Expand Down
20 changes: 20 additions & 0 deletions tests/ui/consts/min_const_fn/const-fn-lang-feature.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//! Ensure that we can use a language feature with a `const fn`:
//! enabling the feature gate actually lets us call the function.
//@ check-pass

#![feature(staged_api, abi_unadjusted)]
#![stable(feature = "rust_test", since = "1.0.0")]

#[unstable(feature = "abi_unadjusted", issue = "42")]
#[rustc_const_unstable(feature = "abi_unadjusted", issue = "42")]
const fn my_fun() {}

#[unstable(feature = "abi_unadjusted", issue = "42")]
#[rustc_const_unstable(feature = "abi_unadjusted", issue = "42")]
const fn my_fun2() {
my_fun()
}

fn main() {
const { my_fun2() };
}

0 comments on commit ea5bb99

Please sign in to comment.