Auto merge of #46881 - michaelwoerister:ensure-coherence, r=nikomatsakis
incr.comp.: Cache check_match and use ensure() for coherence-related queries. Some minor optimizations. r? @nikomatsakis
This commit is contained in:
commit
8d4da4f4c4
|
@ -102,7 +102,7 @@ impl<'tcx> QueryDescription<'tcx> for queries::type_param_predicates<'tcx> {
|
|||
}
|
||||
|
||||
impl<'tcx> QueryDescription<'tcx> for queries::coherent_trait<'tcx> {
|
||||
fn describe(tcx: TyCtxt, (_, def_id): (CrateNum, DefId)) -> String {
|
||||
fn describe(tcx: TyCtxt, def_id: DefId) -> String {
|
||||
format!("coherence checking all impls of trait `{}`",
|
||||
tcx.item_path_str(def_id))
|
||||
}
|
||||
|
@ -647,5 +647,6 @@ impl_disk_cacheable_query!(unsafety_check_result, |def_id| def_id.is_local());
|
|||
impl_disk_cacheable_query!(borrowck, |def_id| def_id.is_local());
|
||||
impl_disk_cacheable_query!(mir_borrowck, |def_id| def_id.is_local());
|
||||
impl_disk_cacheable_query!(mir_const_qualif, |def_id| def_id.is_local());
|
||||
impl_disk_cacheable_query!(check_match, |def_id| def_id.is_local());
|
||||
impl_disk_cacheable_query!(contains_extern_indicator, |_| true);
|
||||
impl_disk_cacheable_query!(def_symbol_name, |_| true);
|
||||
|
|
|
@ -187,7 +187,7 @@ define_maps! { <'tcx>
|
|||
|
||||
[] fn has_typeck_tables: HasTypeckTables(DefId) -> bool,
|
||||
|
||||
[] fn coherent_trait: coherent_trait_dep_node((CrateNum, DefId)) -> (),
|
||||
[] fn coherent_trait: CoherenceCheckTrait(DefId) -> (),
|
||||
|
||||
[] fn borrowck: BorrowCheck(DefId) -> Rc<BorrowCheckResult>,
|
||||
|
||||
|
@ -385,10 +385,6 @@ fn fulfill_obligation_dep_node<'tcx>((param_env, trait_ref):
|
|||
}
|
||||
}
|
||||
|
||||
fn coherent_trait_dep_node<'tcx>((_, def_id): (CrateNum, DefId)) -> DepConstructor<'tcx> {
|
||||
DepConstructor::CoherenceCheckTrait(def_id)
|
||||
}
|
||||
|
||||
fn crate_inherent_impls_dep_node<'tcx>(_: CrateNum) -> DepConstructor<'tcx> {
|
||||
DepConstructor::Coherence
|
||||
}
|
||||
|
|
|
@ -217,6 +217,7 @@ impl<'sess> OnDiskCache<'sess> {
|
|||
encode_query_results::<contains_extern_indicator, _>(tcx, enc, qri)?;
|
||||
encode_query_results::<symbol_name, _>(tcx, enc, qri)?;
|
||||
encode_query_results::<trans_fulfill_obligation, _>(tcx, enc, qri)?;
|
||||
encode_query_results::<check_match, _>(tcx, enc, qri)?;
|
||||
}
|
||||
|
||||
// Encode diagnostics
|
||||
|
|
|
@ -978,4 +978,5 @@ impl_load_from_cache!(
|
|||
SymbolName => def_symbol_name,
|
||||
ConstIsRvaluePromotableToStatic => const_is_rvalue_promotable_to_static,
|
||||
ContainsExternIndicator => contains_extern_indicator,
|
||||
CheckMatch => check_match,
|
||||
);
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
//! misc. type-system utilities too small to deserve their own file
|
||||
|
||||
use hir::def::Def;
|
||||
use hir::def_id::{DefId, LOCAL_CRATE};
|
||||
use hir::def_id::DefId;
|
||||
use hir::map::{DefPathData, Node};
|
||||
use hir;
|
||||
use ich::NodeIdHashingMode;
|
||||
|
@ -427,7 +427,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
|||
return None;
|
||||
};
|
||||
|
||||
self.coherent_trait((LOCAL_CRATE, drop_trait));
|
||||
ty::maps::queries::coherent_trait::ensure(self, drop_trait);
|
||||
|
||||
let mut dtor_did = None;
|
||||
let ty = self.type_of(adt_did);
|
||||
|
|
|
@ -29,7 +29,7 @@ pub const FN_OUTPUT_NAME: &'static str = "Output";
|
|||
|
||||
// Useful type to use with `Result<>` indicate that an error has already
|
||||
// been reported to the user, so no need to continue checking.
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
#[derive(Clone, Copy, Debug, RustcEncodable, RustcDecodable)]
|
||||
pub struct ErrorReported;
|
||||
|
||||
thread_local!(static TIME_DEPTH: Cell<usize> = Cell::new(0));
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
// done by the orphan and overlap modules. Then we build up various
|
||||
// mappings. That mapping code resides here.
|
||||
|
||||
use hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
||||
use rustc::ty::{TyCtxt, TypeFoldable};
|
||||
use hir::def_id::{DefId, LOCAL_CRATE};
|
||||
use rustc::ty::{self, TyCtxt, TypeFoldable};
|
||||
use rustc::ty::maps::Providers;
|
||||
|
||||
use syntax::ast;
|
||||
|
@ -113,8 +113,7 @@ pub fn provide(providers: &mut Providers) {
|
|||
};
|
||||
}
|
||||
|
||||
fn coherent_trait<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
(_, def_id): (CrateNum, DefId)) {
|
||||
fn coherent_trait<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId) {
|
||||
let impls = tcx.hir.trait_impls(def_id);
|
||||
for &impl_id in impls {
|
||||
check_impl(tcx, impl_id);
|
||||
|
@ -127,7 +126,7 @@ fn coherent_trait<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||
|
||||
pub fn check_coherence<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
|
||||
for &trait_def_id in tcx.hir.krate().trait_impls.keys() {
|
||||
tcx.coherent_trait((LOCAL_CRATE, trait_def_id));
|
||||
ty::maps::queries::coherent_trait::ensure(tcx, trait_def_id);
|
||||
}
|
||||
|
||||
unsafety::check(tcx);
|
||||
|
@ -135,6 +134,6 @@ pub fn check_coherence<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
|
|||
overlap::check_auto_impls(tcx);
|
||||
|
||||
// these queries are executed for side-effects (error reporting):
|
||||
tcx.crate_inherent_impls(LOCAL_CRATE);
|
||||
tcx.crate_inherent_impls_overlap_check(LOCAL_CRATE);
|
||||
ty::maps::queries::crate_inherent_impls::ensure(tcx, LOCAL_CRATE);
|
||||
ty::maps::queries::crate_inherent_impls_overlap_check::ensure(tcx, LOCAL_CRATE);
|
||||
}
|
||||
|
|
|
@ -618,6 +618,54 @@ impl<T:Decodable> Decodable for Option<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<T1: Encodable, T2: Encodable> Encodable for Result<T1, T2> {
|
||||
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
|
||||
s.emit_enum("Result", |s| {
|
||||
match *self {
|
||||
Ok(ref v) => {
|
||||
s.emit_enum_variant("Ok", 0, 1, |s| {
|
||||
s.emit_enum_variant_arg(0, |s| {
|
||||
v.encode(s)
|
||||
})
|
||||
})
|
||||
}
|
||||
Err(ref v) => {
|
||||
s.emit_enum_variant("Err", 1, 1, |s| {
|
||||
s.emit_enum_variant_arg(0, |s| {
|
||||
v.encode(s)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<T1:Decodable, T2:Decodable> Decodable for Result<T1, T2> {
|
||||
fn decode<D: Decoder>(d: &mut D) -> Result<Result<T1, T2>, D::Error> {
|
||||
d.read_enum("Result", |d| {
|
||||
d.read_enum_variant(&["Ok", "Err"], |d, disr| {
|
||||
match disr {
|
||||
0 => {
|
||||
Ok(Ok(d.read_enum_variant_arg(0, |d| {
|
||||
T1::decode(d)
|
||||
})?))
|
||||
}
|
||||
1 => {
|
||||
Ok(Err(d.read_enum_variant_arg(0, |d| {
|
||||
T2::decode(d)
|
||||
})?))
|
||||
}
|
||||
_ => {
|
||||
panic!("Encountered invalid discriminant while \
|
||||
decoding `Result`.");
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! peel {
|
||||
($name:ident, $($other:ident,)*) => (tuple! { $($other,)* })
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue