From baefd42861b948510e2a2ede067f8fcaf475249b Mon Sep 17 00:00:00 2001 From: lcnr Date: Tue, 12 Jul 2022 15:21:58 +0200 Subject: [PATCH 1/2] arena > Rc for query results --- compiler/rustc_borrowck/src/type_check/canonical.rs | 2 +- .../src/type_check/free_region_relations.rs | 2 +- compiler/rustc_borrowck/src/type_check/input_output.rs | 2 +- .../rustc_borrowck/src/type_check/liveness/trace.rs | 2 +- compiler/rustc_middle/src/arena.rs | 1 + .../src/traits/query/type_op/custom.rs | 3 +-- .../src/traits/query/type_op/mod.rs | 10 ++++++---- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_borrowck/src/type_check/canonical.rs b/compiler/rustc_borrowck/src/type_check/canonical.rs index 55c0bf05b48..6cfe5efb688 100644 --- a/compiler/rustc_borrowck/src/type_check/canonical.rs +++ b/compiler/rustc_borrowck/src/type_check/canonical.rs @@ -39,7 +39,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { let TypeOpOutput { output, constraints, error_info } = op.fully_perform(self.infcx)?; - if let Some(data) = &constraints { + if let Some(data) = constraints { self.push_region_constraints(locations, category, data); } diff --git a/compiler/rustc_borrowck/src/type_check/free_region_relations.rs b/compiler/rustc_borrowck/src/type_check/free_region_relations.rs index 421ef5be812..fe66821ad75 100644 --- a/compiler/rustc_borrowck/src/type_check/free_region_relations.rs +++ b/compiler/rustc_borrowck/src/type_check/free_region_relations.rs @@ -335,7 +335,7 @@ impl<'tcx> UniversalRegionRelationsBuilder<'_, 'tcx> { /// the same time, compute and add any implied bounds that come /// from this local. #[instrument(level = "debug", skip(self))] - fn add_implied_bounds(&mut self, ty: Ty<'tcx>) -> Option>> { + fn add_implied_bounds(&mut self, ty: Ty<'tcx>) -> Option<&'tcx QueryRegionConstraints<'tcx>> { let TypeOpOutput { output: bounds, constraints, .. } = self .param_env .and(type_op::implied_outlives_bounds::ImpliedOutlivesBounds { ty }) diff --git a/compiler/rustc_borrowck/src/type_check/input_output.rs b/compiler/rustc_borrowck/src/type_check/input_output.rs index 2a6ca5246da..4431a2e8ec6 100644 --- a/compiler/rustc_borrowck/src/type_check/input_output.rs +++ b/compiler/rustc_borrowck/src/type_check/input_output.rs @@ -225,7 +225,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { debug!("{:?} normalized to {:?}", t, norm_ty); - for data in constraints.into_iter().collect::>() { + for data in constraints { ConstraintConversion::new( self.infcx, &self.borrowck_context.universal_regions, diff --git a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs index 3795378b568..42b577175e4 100644 --- a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs +++ b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs @@ -98,7 +98,7 @@ struct LivenessContext<'me, 'typeck, 'flow, 'tcx> { struct DropData<'tcx> { dropck_result: DropckOutlivesResult<'tcx>, - region_constraint_data: Option>>, + region_constraint_data: Option<&'tcx QueryRegionConstraints<'tcx>>, } struct LivenessResults<'me, 'typeck, 'flow, 'tcx> { diff --git a/compiler/rustc_middle/src/arena.rs b/compiler/rustc_middle/src/arena.rs index 661a9b1944c..b94de537dc8 100644 --- a/compiler/rustc_middle/src/arena.rs +++ b/compiler/rustc_middle/src/arena.rs @@ -55,6 +55,7 @@ macro_rules! arena_types { [] dtorck_constraint: rustc_middle::traits::query::DropckConstraint<'tcx>, [] candidate_step: rustc_middle::traits::query::CandidateStep<'tcx>, [] autoderef_bad_ty: rustc_middle::traits::query::MethodAutoderefBadTy<'tcx>, + [] query_region_constraints: rustc_middle::infer::canonical::QueryRegionConstraints<'tcx>, [] type_op_subtype: rustc_middle::infer::canonical::Canonical<'tcx, rustc_middle::infer::canonical::QueryResponse<'tcx, ()> diff --git a/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs b/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs index c9d46b2810d..c99564936aa 100644 --- a/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs +++ b/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs @@ -9,7 +9,6 @@ use rustc_infer::traits::TraitEngineExt as _; use rustc_span::source_map::DUMMY_SP; use std::fmt; -use std::rc::Rc; pub struct CustomTypeOp { closure: F, @@ -109,7 +108,7 @@ pub fn scrape_region_constraints<'tcx, Op: super::TypeOp<'tcx, Output = R>, R>( Ok(( TypeOpOutput { output: value, - constraints: Some(Rc::new(region_constraints)), + constraints: Some(infcx.tcx.arena.alloc(region_constraints)), error_info: None, }, region_constraint_data, diff --git a/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs b/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs index 1e72dd69339..f4733c9bab2 100644 --- a/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs @@ -10,7 +10,6 @@ use rustc_infer::traits::PredicateObligations; use rustc_middle::ty::fold::TypeFoldable; use rustc_middle::ty::{ParamEnvAnd, TyCtxt}; use std::fmt; -use std::rc::Rc; pub mod ascribe_user_type; pub mod custom; @@ -41,7 +40,7 @@ pub struct TypeOpOutput<'tcx, Op: TypeOp<'tcx>> { /// The output from the type op. pub output: Op::Output, /// Any region constraints from performing the type op. - pub constraints: Option>>, + pub constraints: Option<&'tcx QueryRegionConstraints<'tcx>>, /// Used for error reporting to be able to rerun the query pub error_info: Option, } @@ -158,8 +157,11 @@ where // Promote the final query-region-constraints into a // (optional) ref-counted vector: - let region_constraints = - if region_constraints.is_empty() { None } else { Some(Rc::new(region_constraints)) }; + let region_constraints = if region_constraints.is_empty() { + None + } else { + Some(&*infcx.tcx.arena.alloc(region_constraints)) + }; Ok(TypeOpOutput { output, constraints: region_constraints, error_info }) } From 0fc5296876e898d13e32311e305ba71c7f0086d8 Mon Sep 17 00:00:00 2001 From: lcnr Date: Tue, 12 Jul 2022 15:29:32 +0200 Subject: [PATCH 2/2] remove outdated comment --- .../src/traits/query/type_op/mod.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs b/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs index f4733c9bab2..578e1d00cf9 100644 --- a/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/query/type_op/mod.rs @@ -155,14 +155,14 @@ where } } - // Promote the final query-region-constraints into a - // (optional) ref-counted vector: - let region_constraints = if region_constraints.is_empty() { - None - } else { - Some(&*infcx.tcx.arena.alloc(region_constraints)) - }; - - Ok(TypeOpOutput { output, constraints: region_constraints, error_info }) + Ok(TypeOpOutput { + output, + constraints: if region_constraints.is_empty() { + None + } else { + Some(infcx.tcx.arena.alloc(region_constraints)) + }, + error_info, + }) } }