diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 39940dca99dc7..8a847115c9faf 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -2769,6 +2769,13 @@ pub struct BorrowCheckResult<'tcx> { pub used_mut_upvars: SmallVec<[Field; 8]>, } +/// The result of the `mir_const_qualif` query. +#[derive(Clone, Copy, Debug, Default, RustcEncodable, RustcDecodable, HashStable)] +pub struct QualifSet { + pub has_mut_interior: bool, + pub needs_drop: bool, +} + /// After we borrow check a closure, we are left with various /// requirements that we have inferred between the free regions that /// appear in the closure's signature or on its field types. These diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index 9bd2a933c1c69..421d942373a0e 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -93,7 +93,7 @@ rustc_queries! { /// Maps DefId's that have an associated `mir::Body` to the result /// of the MIR qualify_consts pass. The actual meaning of /// the value isn't known except to the pass itself. - query mir_const_qualif(key: DefId) -> u8 { + query mir_const_qualif(key: DefId) -> mir::QualifSet { desc { |tcx| "const checking `{}`", tcx.def_path_str(key) } cache_on_disk_if { key.is_local() } } diff --git a/src/librustc_metadata/rmeta/decoder.rs b/src/librustc_metadata/rmeta/decoder.rs index 7cebf2512d645..e3218eebcf05c 100644 --- a/src/librustc_metadata/rmeta/decoder.rs +++ b/src/librustc_metadata/rmeta/decoder.rs @@ -952,7 +952,7 @@ impl<'a, 'tcx> CrateMetadata { .decode((self, tcx)) } - fn mir_const_qualif(&self, id: DefIndex) -> u8 { + fn mir_const_qualif(&self, id: DefIndex) -> mir::QualifSet { match self.kind(id) { EntryKind::Const(qualif, _) | EntryKind::AssocConst(AssocContainer::ImplDefault, qualif, _) | diff --git a/src/librustc_metadata/rmeta/encoder.rs b/src/librustc_metadata/rmeta/encoder.rs index 26055d329bcbd..633b3daa8fa88 100644 --- a/src/librustc_metadata/rmeta/encoder.rs +++ b/src/librustc_metadata/rmeta/encoder.rs @@ -875,7 +875,11 @@ impl EncodeContext<'tcx> { hir::print::to_string(self.tcx.hir(), |s| s.print_trait_item(ast_item)); let rendered_const = self.lazy(RenderedConst(rendered)); - EntryKind::AssocConst(container, ConstQualif { mir: 0 }, rendered_const) + EntryKind::AssocConst( + container, + ConstQualif { mir: Default::default() }, + rendered_const, + ) } ty::AssocKind::Method => { let fn_data = if let hir::TraitItemKind::Method(m_sig, m) = &ast_item.kind { diff --git a/src/librustc_metadata/rmeta/mod.rs b/src/librustc_metadata/rmeta/mod.rs index 990a3d984b225..b2fb725a11844 100644 --- a/src/librustc_metadata/rmeta/mod.rs +++ b/src/librustc_metadata/rmeta/mod.rs @@ -295,7 +295,7 @@ enum EntryKind<'tcx> { /// Additional data for EntryKind::Const and EntryKind::AssocConst #[derive(Clone, Copy, RustcEncodable, RustcDecodable)] struct ConstQualif { - mir: u8, + mir: mir::QualifSet, } /// Contains a constant which has been rendered to a String. diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 5773d850fbc77..32ccf961e3963 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -1,7 +1,7 @@ use crate::{build, shim}; use rustc_index::vec::IndexVec; use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; -use rustc::mir::{Body, MirPhase, Promoted}; +use rustc::mir::{Body, MirPhase, Promoted, QualifSet}; use rustc::ty::{TyCtxt, InstanceDef, TypeFoldable}; use rustc::ty::query::Providers; use rustc::ty::steal::Steal; @@ -184,12 +184,12 @@ pub fn run_passes( body.phase = mir_phase; } -fn mir_const_qualif(tcx: TyCtxt<'_>, def_id: DefId) -> u8 { +fn mir_const_qualif(tcx: TyCtxt<'_>, def_id: DefId) -> QualifSet { let const_kind = check_consts::ConstKind::for_item(tcx, def_id); // No need to const-check a non-const `fn`. if const_kind.is_none() { - return 0; + return Default::default(); } // N.B., this `borrow()` is guaranteed to be valid (i.e., the value @@ -200,7 +200,7 @@ fn mir_const_qualif(tcx: TyCtxt<'_>, def_id: DefId) -> u8 { if body.return_ty().references_error() { tcx.sess.delay_span_bug(body.span, "mir_const_qualif: MIR had errors"); - return 0; + return Default::default(); } let item = check_consts::Item {