1
Fork 0
rust/compiler/rustc_mir/src/transform/check_consts/mod.rs

58 lines
2 KiB
Rust
Raw Normal View History

//! Check the bodies of `const`s, `static`s and `const fn`s for illegal operations.
//!
//! This module will eventually replace the parts of `qualify_consts.rs` that check whether a local
//! has interior mutability or needs to be dropped, as well as the visitor that emits errors when
//! it finds operations that are invalid in a certain context.
use rustc_hir as hir;
use rustc_hir::def_id::{DefId, LocalDefId};
2020-03-29 17:19:48 +02:00
use rustc_middle::mir;
use rustc_middle::ty::{self, TyCtxt};
2019-09-17 16:25:40 -07:00
pub use self::qualifs::Qualif;
2020-04-18 11:15:23 +02:00
mod ops;
2020-05-03 11:18:26 -07:00
pub mod post_drop_elaboration;
pub mod qualifs;
mod resolver;
2019-09-17 16:25:40 -07:00
pub mod validation;
/// Information about the item currently being const-checked, as well as a reference to the global
2019-09-17 16:25:40 -07:00
/// context.
pub struct ConstCx<'mir, 'tcx> {
2020-04-12 10:31:00 -07:00
pub body: &'mir mir::Body<'tcx>,
2019-10-22 14:54:10 -07:00
pub tcx: TyCtxt<'tcx>,
2020-07-04 14:02:41 +02:00
pub def_id: LocalDefId,
2019-10-22 14:54:10 -07:00
pub param_env: ty::ParamEnv<'tcx>,
pub const_kind: Option<hir::ConstContext>,
2019-09-17 16:25:40 -07:00
}
impl ConstCx<'mir, 'tcx> {
pub fn new(tcx: TyCtxt<'tcx>, def_id: LocalDefId, body: &'mir mir::Body<'tcx>) -> Self {
2019-09-17 16:25:40 -07:00
let param_env = tcx.param_env(def_id);
2020-04-02 16:14:11 +02:00
Self::new_with_param_env(tcx, def_id, body, param_env)
}
pub fn new_with_param_env(
tcx: TyCtxt<'tcx>,
def_id: LocalDefId,
2020-04-02 16:14:11 +02:00
body: &'mir mir::Body<'tcx>,
param_env: ty::ParamEnv<'tcx>,
) -> Self {
let const_kind = tcx.hir().body_const_context(def_id);
2020-07-04 14:02:41 +02:00
ConstCx { body, tcx, def_id: def_id, param_env, const_kind }
}
/// Returns the kind of const context this `Item` represents (`const`, `static`, etc.).
///
/// Panics if this `Item` is not const.
pub fn const_kind(&self) -> hir::ConstContext {
self.const_kind.expect("`const_kind` must not be called on a non-const fn")
}
}
/// Returns `true` if this `DefId` points to one of the official `panic` lang items.
pub fn is_lang_panic_fn(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool {
2019-12-22 17:42:04 -05:00
Some(def_id) == tcx.lang_items().panic_fn() || Some(def_id) == tcx.lang_items().begin_panic_fn()
2019-09-17 16:25:40 -07:00
}