Move is_const_fn to under TyCtxt
This commit is contained in:
parent
cdeba02ff7
commit
d3f981b144
6 changed files with 26 additions and 26 deletions
|
@ -6,23 +6,6 @@ use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
|
||||||
/// Whether the `def_id` counts as const fn in your current crate, considering all active
|
|
||||||
/// feature gates
|
|
||||||
pub fn is_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
|
||||||
tcx.is_const_fn_raw(def_id)
|
|
||||||
&& match is_unstable_const_fn(tcx, def_id) {
|
|
||||||
Some(feature_name) => {
|
|
||||||
// has a `rustc_const_unstable` attribute, check whether the user enabled the
|
|
||||||
// corresponding feature gate.
|
|
||||||
tcx.features().declared_lib_features.iter().any(|&(sym, _)| sym == feature_name)
|
|
||||||
}
|
|
||||||
// functions without const stability are either stable user written
|
|
||||||
// const fn or the user is using feature gates and we thus don't
|
|
||||||
// care what they do
|
|
||||||
None => true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Whether the `def_id` is an unstable const fn and what feature gate is necessary to enable it
|
/// Whether the `def_id` is an unstable const fn and what feature gate is necessary to enable it
|
||||||
pub fn is_unstable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> Option<Symbol> {
|
pub fn is_unstable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> Option<Symbol> {
|
||||||
if tcx.is_const_fn_raw(def_id) {
|
if tcx.is_const_fn_raw(def_id) {
|
||||||
|
@ -77,7 +60,7 @@ fn is_const_fn_raw(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_promotable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
fn is_promotable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
||||||
is_const_fn(tcx, def_id)
|
tcx.is_const_fn(def_id)
|
||||||
&& match tcx.lookup_const_stability(def_id) {
|
&& match tcx.lookup_const_stability(def_id) {
|
||||||
Some(stab) => {
|
Some(stab) => {
|
||||||
if cfg!(debug_assertions) && stab.promotable {
|
if cfg!(debug_assertions) && stab.promotable {
|
||||||
|
|
|
@ -26,7 +26,6 @@ use rustc_index::vec::{Idx, IndexVec};
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::{cmp, iter, mem};
|
use std::{cmp, iter, mem};
|
||||||
|
|
||||||
use crate::const_eval::{is_const_fn, is_unstable_const_fn};
|
|
||||||
use crate::transform::check_consts::{is_lang_panic_fn, qualifs, ConstCx};
|
use crate::transform::check_consts::{is_lang_panic_fn, qualifs, ConstCx};
|
||||||
use crate::transform::MirPass;
|
use crate::transform::MirPass;
|
||||||
|
|
||||||
|
@ -656,8 +655,7 @@ impl<'tcx> Validator<'_, 'tcx> {
|
||||||
|
|
||||||
let is_const_fn = match *fn_ty.kind() {
|
let is_const_fn = match *fn_ty.kind() {
|
||||||
ty::FnDef(def_id, _) => {
|
ty::FnDef(def_id, _) => {
|
||||||
is_const_fn(self.tcx, def_id)
|
self.tcx.is_const_fn_raw(def_id)
|
||||||
|| is_unstable_const_fn(self.tcx, def_id).is_some()
|
|
||||||
|| is_lang_panic_fn(self.tcx, def_id)
|
|| is_lang_panic_fn(self.tcx, def_id)
|
||||||
}
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
|
@ -1079,7 +1077,7 @@ pub fn is_const_fn_in_array_repeat_expression<'tcx>(
|
||||||
if let ty::FnDef(def_id, _) = *literal.ty().kind() {
|
if let ty::FnDef(def_id, _) = *literal.ty().kind() {
|
||||||
if let Some((destination_place, _)) = destination {
|
if let Some((destination_place, _)) = destination {
|
||||||
if destination_place == place {
|
if destination_place == place {
|
||||||
if is_const_fn(ccx.tcx, def_id) {
|
if ccx.tcx.is_const_fn(def_id) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2741,6 +2741,26 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
pub fn lifetime_scope(self, id: HirId) -> Option<LifetimeScopeForPath> {
|
pub fn lifetime_scope(self, id: HirId) -> Option<LifetimeScopeForPath> {
|
||||||
self.lifetime_scope_map(id.owner).and_then(|mut map| map.remove(&id.local_id))
|
self.lifetime_scope_map(id.owner).and_then(|mut map| map.remove(&id.local_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether the `def_id` counts as const fn in the current crate, considering all active
|
||||||
|
/// feature gates
|
||||||
|
pub fn is_const_fn(self, def_id: DefId) -> bool {
|
||||||
|
if self.is_const_fn_raw(def_id) {
|
||||||
|
match self.lookup_const_stability(def_id) {
|
||||||
|
Some(stability) if stability.level.is_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)
|
||||||
|
}
|
||||||
|
// functions without const stability are either stable user written
|
||||||
|
// const fn or the user is using feature gates and we thus don't
|
||||||
|
// care what they do
|
||||||
|
_ => true,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TyCtxtAt<'tcx> {
|
impl TyCtxtAt<'tcx> {
|
||||||
|
|
|
@ -11,7 +11,7 @@ crate mod utils;
|
||||||
|
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_attr as attr;
|
use rustc_attr as attr;
|
||||||
use rustc_const_eval::const_eval::{is_const_fn, is_unstable_const_fn};
|
use rustc_const_eval::const_eval::is_unstable_const_fn;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorKind, DefKind, Res};
|
use rustc_hir::def::{CtorKind, DefKind, Res};
|
||||||
|
@ -787,7 +787,7 @@ fn clean_fn_or_proc_macro(
|
||||||
let mut func = (sig, generics, body_id).clean(cx);
|
let mut func = (sig, generics, body_id).clean(cx);
|
||||||
let def_id = item.def_id.to_def_id();
|
let def_id = item.def_id.to_def_id();
|
||||||
func.header.constness =
|
func.header.constness =
|
||||||
if is_const_fn(cx.tcx, def_id) && is_unstable_const_fn(cx.tcx, def_id).is_none() {
|
if cx.tcx.is_const_fn(def_id) && is_unstable_const_fn(cx.tcx, def_id).is_none() {
|
||||||
hir::Constness::Const
|
hir::Constness::Const
|
||||||
} else {
|
} else {
|
||||||
hir::Constness::NotConst
|
hir::Constness::NotConst
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
extern crate rustc_ast;
|
extern crate rustc_ast;
|
||||||
extern crate rustc_ast_pretty;
|
extern crate rustc_ast_pretty;
|
||||||
extern crate rustc_attr;
|
extern crate rustc_attr;
|
||||||
extern crate rustc_const_eval;
|
|
||||||
extern crate rustc_data_structures;
|
extern crate rustc_data_structures;
|
||||||
extern crate rustc_errors;
|
extern crate rustc_errors;
|
||||||
extern crate rustc_hir;
|
extern crate rustc_hir;
|
||||||
|
|
|
@ -364,7 +364,7 @@ fn check_terminator(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_const_fn(tcx: TyCtxt<'_>, def_id: DefId, msrv: Option<&RustcVersion>) -> bool {
|
fn is_const_fn(tcx: TyCtxt<'_>, def_id: DefId, msrv: Option<&RustcVersion>) -> bool {
|
||||||
rustc_const_eval::const_eval::is_const_fn(tcx, def_id)
|
tcx.is_const_fn(def_id)
|
||||||
&& tcx.lookup_const_stability(def_id).map_or(true, |const_stab| {
|
&& tcx.lookup_const_stability(def_id).map_or(true, |const_stab| {
|
||||||
if let rustc_attr::StabilityLevel::Stable { since } = const_stab.level {
|
if let rustc_attr::StabilityLevel::Stable { since } = const_stab.level {
|
||||||
// Checking MSRV is manually necessary because `rustc` has no such concept. This entire
|
// Checking MSRV is manually necessary because `rustc` has no such concept. This entire
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue