From 8ac65af81f5f9cf6c5e2c2306705b50eed77cfb5 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Wed, 20 Dec 2017 16:37:29 +0100 Subject: [PATCH 1/3] Implement Encodable and Decodable for Result. --- src/libserialize/serialize.rs | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs index 6d67bbc06cc..854ca4eb3b0 100644 --- a/src/libserialize/serialize.rs +++ b/src/libserialize/serialize.rs @@ -618,6 +618,54 @@ impl Decodable for Option { } } +impl Encodable for Result { + fn encode(&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 Decodable for Result { + fn decode(d: &mut D) -> Result, 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,)* }) } From dba52ced4ca8f1ea8f8ee10390797c60e67c22c5 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Wed, 20 Dec 2017 16:38:27 +0100 Subject: [PATCH 2/3] incr.comp.: Cache check_match query. --- src/librustc/ty/maps/config.rs | 1 + src/librustc/ty/maps/on_disk_cache.rs | 1 + src/librustc/ty/maps/plumbing.rs | 1 + src/librustc/util/common.rs | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/librustc/ty/maps/config.rs b/src/librustc/ty/maps/config.rs index a556861147e..5ca951d0fb3 100644 --- a/src/librustc/ty/maps/config.rs +++ b/src/librustc/ty/maps/config.rs @@ -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); diff --git a/src/librustc/ty/maps/on_disk_cache.rs b/src/librustc/ty/maps/on_disk_cache.rs index 079b518efd8..dd8a7223289 100644 --- a/src/librustc/ty/maps/on_disk_cache.rs +++ b/src/librustc/ty/maps/on_disk_cache.rs @@ -217,6 +217,7 @@ impl<'sess> OnDiskCache<'sess> { encode_query_results::(tcx, enc, qri)?; encode_query_results::(tcx, enc, qri)?; encode_query_results::(tcx, enc, qri)?; + encode_query_results::(tcx, enc, qri)?; } // Encode diagnostics diff --git a/src/librustc/ty/maps/plumbing.rs b/src/librustc/ty/maps/plumbing.rs index 8875439be6b..49440deb6de 100644 --- a/src/librustc/ty/maps/plumbing.rs +++ b/src/librustc/ty/maps/plumbing.rs @@ -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, ); diff --git a/src/librustc/util/common.rs b/src/librustc/util/common.rs index 76d3494dbf0..29af9bb668e 100644 --- a/src/librustc/util/common.rs +++ b/src/librustc/util/common.rs @@ -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 = Cell::new(0)); From 44a0522b180805e9ff0d6b5009c031f6d131b4a6 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Wed, 20 Dec 2017 16:45:23 +0100 Subject: [PATCH 3/3] incr.comp.: Use ensure() for some coherence-related queries. --- src/librustc/ty/maps/config.rs | 2 +- src/librustc/ty/maps/mod.rs | 6 +----- src/librustc/ty/util.rs | 4 ++-- src/librustc_typeck/coherence/mod.rs | 13 ++++++------- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/librustc/ty/maps/config.rs b/src/librustc/ty/maps/config.rs index 5ca951d0fb3..f2fe12dedc2 100644 --- a/src/librustc/ty/maps/config.rs +++ b/src/librustc/ty/maps/config.rs @@ -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)) } diff --git a/src/librustc/ty/maps/mod.rs b/src/librustc/ty/maps/mod.rs index 23531b7b942..7c9d274e1fe 100644 --- a/src/librustc/ty/maps/mod.rs +++ b/src/librustc/ty/maps/mod.rs @@ -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, @@ -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 } diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs index 9b930233fad..85052052b32 100644 --- a/src/librustc/ty/util.rs +++ b/src/librustc/ty/util.rs @@ -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); diff --git a/src/librustc_typeck/coherence/mod.rs b/src/librustc_typeck/coherence/mod.rs index 90a0952af04..adf154968c2 100644 --- a/src/librustc_typeck/coherence/mod.rs +++ b/src/librustc_typeck/coherence/mod.rs @@ -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); }