fn get_item_mir<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId) -> Mir<'tcx>;
fn is_item_mir_available(&self, def: DefId) -> bool;
- /// Take a look if we need to inline or monomorphize this. If so, we
- /// will emit code for this item in the local crate, and thus
- /// create a translation item for it.
- fn can_have_local_instance<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId) -> bool;
-
// This is basically a 1-based range of ints, which is a little
// silly - I may fix that.
fn crates(&self) -> Vec<CrateNum>;
fn is_item_mir_available(&self, def: DefId) -> bool {
bug!("is_item_mir_available")
}
- fn can_have_local_instance<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>, def: DefId) -> bool {
- bug!("can_have_local_instance")
- }
// This is basically a 1-based range of ints, which is a little
// silly - I may fix that.
EntryKind::Closure(_) => return None,
})
}
- fn is_const_fn(&self, meta: &CrateMetadata) -> bool {
- let constness = match *self {
- EntryKind::Method(data) => data.decode(meta).fn_data.constness,
- EntryKind::Fn(data) => data.decode(meta).constness,
- _ => hir::Constness::NotConst,
- };
- constness == hir::Constness::Const
- }
}
impl<'a, 'tcx> CrateMetadata {
self.maybe_entry(id).and_then(|item| item.decode(self).mir).is_some()
}
- pub fn can_have_local_instance(&self,
- tcx: TyCtxt<'a, 'tcx, 'tcx>,
- id: DefIndex) -> bool {
- self.maybe_entry(id).map_or(false, |item| {
- let item = item.decode(self);
- // if we don't have a MIR, then this item was never meant to be locally instantiated
- // or we have a bug in the metadata serialization
- item.mir.is_some() && (
- // items with generics always can have local instances if monomorphized
- item.generics.map_or(false, |generics| {
- let generics = generics.decode((self, tcx));
- generics.parent_types != 0 || !generics.types.is_empty()
- }) ||
- match item.kind {
- EntryKind::Closure(_) => true,
- _ => false,
- } ||
- item.kind.is_const_fn(self) ||
- attr::requests_inline(&self.get_attributes(&item))
- )
- })
- }
-
pub fn maybe_get_item_mir(&self,
tcx: TyCtxt<'a, 'tcx, 'tcx>,
id: DefIndex)
}
pub fn is_const_fn(&self, id: DefIndex) -> bool {
- self.entry(id).kind.is_const_fn(self)
+ let constness = match self.entry(id).kind {
+ EntryKind::Method(data) => data.decode(self).fn_data.constness,
+ EntryKind::Fn(data) => data.decode(self).constness,
+ _ => hir::Constness::NotConst,
+ };
+ constness == hir::Constness::Const
}
pub fn is_foreign_item(&self, id: DefIndex) -> bool {