From d594fc2562106a75b55c66a7d0eda0d99b333756 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Wed, 10 Apr 2019 23:27:39 +0300 Subject: [PATCH] rustc_metadata: don't encode an empty slice for inferred_outlives. --- src/librustc_metadata/decoder.rs | 4 +++- src/librustc_metadata/encoder.rs | 6 ++++-- src/librustc_metadata/schema.rs | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index 4880937774485..771d01a4b6a1d 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -671,7 +671,9 @@ impl<'a, 'tcx> CrateMetadata { item_id: DefIndex, tcx: TyCtxt<'tcx>, ) -> &'tcx [(ty::Predicate<'tcx>, Span)] { - self.root.per_def.inferred_outlives.get(self, item_id).unwrap().decode((self, tcx)) + self.root.per_def.inferred_outlives.get(self, item_id).map(|predicates| { + predicates.decode((self, tcx)) + }).unwrap_or_default() } crate fn get_super_predicates( diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs index db00095b929ec..05cc63a01f306 100644 --- a/src/librustc_metadata/encoder.rs +++ b/src/librustc_metadata/encoder.rs @@ -842,8 +842,10 @@ impl EncodeContext<'tcx> { fn encode_inferred_outlives(&mut self, def_id: DefId) { debug!("EncodeContext::encode_inferred_outlives({:?})", def_id); - record!(self.per_def.inferred_outlives[def_id] <- - self.tcx.inferred_outlives_of(def_id)); + let inferred_outlives = self.tcx.inferred_outlives_of(def_id); + if !inferred_outlives.is_empty() { + record!(self.per_def.inferred_outlives[def_id] <- inferred_outlives); + } } fn encode_super_predicates(&mut self, def_id: DefId) { diff --git a/src/librustc_metadata/schema.rs b/src/librustc_metadata/schema.rs index b459d53eb51c7..f644b7264320b 100644 --- a/src/librustc_metadata/schema.rs +++ b/src/librustc_metadata/schema.rs @@ -249,6 +249,7 @@ crate struct LazyPerDefTables<'tcx> { // doesn't handle shorthands in its own (de)serialization impls, // as it's an `enum` for which we want to derive (de)serialization, // so the `ty::codec` APIs handle the whole `&'tcx [...]` at once. + // Also, as an optimization, a missing entry indicates an empty `&[]`. pub inferred_outlives: Lazy!(PerDefTable, Span)])>), pub super_predicates: Lazy!(PerDefTable)>),