Skip to content

Commit 7f8cad2

Browse files
committed
Make OpaqueTypeKey the key of opaque types map
1 parent 3405725 commit 7f8cad2

File tree

10 files changed

+134
-98
lines changed

10 files changed

+134
-98
lines changed

compiler/rustc_middle/src/mir/query.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use rustc_hir as hir;
99
use rustc_hir::def_id::{DefId, LocalDefId};
1010
use rustc_index::bit_set::BitMatrix;
1111
use rustc_index::vec::IndexVec;
12+
use rustc_middle::ty::OpaqueTypeKey;
1213
use rustc_span::Span;
1314
use rustc_target::abi::VariantIdx;
1415
use smallvec::SmallVec;
@@ -210,7 +211,7 @@ pub struct BorrowCheckResult<'tcx> {
210211
/// All the opaque types that are restricted to concrete types
211212
/// by this function. Unlike the value in `TypeckResults`, this has
212213
/// unerased regions.
213-
pub concrete_opaque_types: VecMap<DefId, ty::ResolvedOpaqueTy<'tcx>>,
214+
pub concrete_opaque_types: VecMap<OpaqueTypeKey<'tcx>, ty::ResolvedOpaqueTy<'tcx>>,
214215
pub closure_requirements: Option<ClosureRegionRequirements<'tcx>>,
215216
pub used_mut_upvars: SmallVec<[Field; 8]>,
216217
}

compiler/rustc_middle/src/ty/context.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ use rustc_hir::{
4848
use rustc_index::vec::{Idx, IndexVec};
4949
use rustc_macros::HashStable;
5050
use rustc_middle::mir::FakeReadCause;
51+
use rustc_middle::ty::OpaqueTypeKey;
5152
use rustc_serialize::opaque::{FileEncodeResult, FileEncoder};
5253
use rustc_session::config::{BorrowckMode, CrateType, OutputFilenames};
5354
use rustc_session::lint::{Level, Lint};
@@ -425,7 +426,7 @@ pub struct TypeckResults<'tcx> {
425426

426427
/// All the opaque types that are restricted to concrete types
427428
/// by this function.
428-
pub concrete_opaque_types: VecMap<DefId, ResolvedOpaqueTy<'tcx>>,
429+
pub concrete_opaque_types: VecMap<OpaqueTypeKey<'tcx>, ResolvedOpaqueTy<'tcx>>,
429430

430431
/// Tracks the minimum captures required for a closure;
431432
/// see `MinCaptureInformationMap` for more details.

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,12 @@ impl<'tcx> InstantiatedPredicates<'tcx> {
835835
}
836836
}
837837

838+
#[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable, TyEncodable, TyDecodable)]
839+
pub struct OpaqueTypeKey<'tcx> {
840+
pub def_id: DefId,
841+
pub substs: SubstsRef<'tcx>,
842+
}
843+
838844
rustc_index::newtype_index! {
839845
/// "Universes" are used during type- and trait-checking in the
840846
/// presence of `for<..>` binders to control what sets of names are

compiler/rustc_mir/src/borrow_check/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
33
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
44
use rustc_data_structures::graph::dominators::Dominators;
5-
use rustc_data_structures::vec_map::VecMap;
65
use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, ErrorReported};
76
use rustc_hir as hir;
87
use rustc_hir::def_id::LocalDefId;
@@ -26,7 +25,7 @@ use either::Either;
2625
use smallvec::SmallVec;
2726
use std::cell::RefCell;
2827
use std::collections::BTreeMap;
29-
use std::iter::{self, FromIterator};
28+
use std::iter;
3029
use std::mem;
3130
use std::rc::Rc;
3231

@@ -442,7 +441,7 @@ fn do_mir_borrowck<'a, 'tcx>(
442441
}
443442

444443
let result = BorrowCheckResult {
445-
concrete_opaque_types: VecMap::from_iter(opaque_type_values.into_iter()),
444+
concrete_opaque_types: opaque_type_values,
446445
closure_requirements: opt_closure_req,
447446
used_mut_upvars: mbcx.used_mut_upvars,
448447
};

compiler/rustc_mir/src/borrow_check/nll.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
//! The entry point of the NLL borrow checker.
22
3-
use rustc_data_structures::fx::FxHashMap;
3+
use rustc_data_structures::vec_map::VecMap;
44
use rustc_errors::Diagnostic;
5-
use rustc_hir::def_id::DefId;
65
use rustc_index::vec::IndexVec;
76
use rustc_infer::infer::InferCtxt;
87
use rustc_middle::mir::{
98
BasicBlock, Body, ClosureOutlivesSubject, ClosureRegionRequirements, LocalKind, Location,
109
Promoted,
1110
};
12-
use rustc_middle::ty::{self, RegionKind, RegionVid};
11+
use rustc_middle::ty::{self, OpaqueTypeKey, RegionKind, RegionVid};
1312
use rustc_span::symbol::sym;
1413
use std::env;
1514
use std::fmt::Debug;
@@ -47,7 +46,7 @@ crate type PoloniusOutput = Output<RustcFacts>;
4746
/// closure requirements to propagate, and any generated errors.
4847
crate struct NllOutput<'tcx> {
4948
pub regioncx: RegionInferenceContext<'tcx>,
50-
pub opaque_type_values: FxHashMap<DefId, ty::ResolvedOpaqueTy<'tcx>>,
49+
pub opaque_type_values: VecMap<OpaqueTypeKey<'tcx>, ty::ResolvedOpaqueTy<'tcx>>,
5150
pub polonius_output: Option<Rc<PoloniusOutput>>,
5251
pub opt_closure_req: Option<ClosureRegionRequirements<'tcx>>,
5352
pub nll_errors: RegionErrors<'tcx>,
@@ -367,7 +366,7 @@ pub(super) fn dump_annotation<'a, 'tcx>(
367366
body: &Body<'tcx>,
368367
regioncx: &RegionInferenceContext<'tcx>,
369368
closure_region_requirements: &Option<ClosureRegionRequirements<'_>>,
370-
opaque_type_values: &FxHashMap<DefId, ty::ResolvedOpaqueTy<'tcx>>,
369+
opaque_type_values: &VecMap<OpaqueTypeKey<'tcx>, ty::ResolvedOpaqueTy<'tcx>>,
371370
errors_buffer: &mut Vec<Diagnostic>,
372371
) {
373372
let tcx = infcx.tcx;

compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
use rustc_data_structures::fx::FxHashMap;
2-
use rustc_hir::def_id::DefId;
1+
use rustc_data_structures::vec_map::VecMap;
32
use rustc_infer::infer::InferCtxt;
4-
use rustc_middle::ty::{self, TyCtxt, TypeFoldable};
3+
use rustc_middle::ty::{self, OpaqueTypeKey, TyCtxt, TypeFoldable};
54
use rustc_span::Span;
65
use rustc_trait_selection::opaque_types::InferCtxtExt;
76

@@ -51,12 +50,12 @@ impl<'tcx> RegionInferenceContext<'tcx> {
5150
pub(in crate::borrow_check) fn infer_opaque_types(
5251
&self,
5352
infcx: &InferCtxt<'_, 'tcx>,
54-
opaque_ty_decls: FxHashMap<DefId, ty::ResolvedOpaqueTy<'tcx>>,
53+
opaque_ty_decls: VecMap<OpaqueTypeKey<'tcx>, ty::ResolvedOpaqueTy<'tcx>>,
5554
span: Span,
56-
) -> FxHashMap<DefId, ty::ResolvedOpaqueTy<'tcx>> {
55+
) -> VecMap<OpaqueTypeKey<'tcx>, ty::ResolvedOpaqueTy<'tcx>> {
5756
opaque_ty_decls
5857
.into_iter()
59-
.map(|(opaque_def_id, ty::ResolvedOpaqueTy { concrete_type, substs })| {
58+
.map(|(opaque_type_key, ty::ResolvedOpaqueTy { concrete_type, substs })| {
6059
debug!(?concrete_type, ?substs);
6160

6261
let mut subst_regions = vec![self.universal_regions.fr_static];
@@ -110,14 +109,15 @@ impl<'tcx> RegionInferenceContext<'tcx> {
110109

111110
debug!(?universal_concrete_type, ?universal_substs);
112111

112+
let opaque_type_key =
113+
OpaqueTypeKey { def_id: opaque_type_key.def_id, substs: universal_substs };
113114
let remapped_type = infcx.infer_opaque_definition_from_instantiation(
114-
opaque_def_id,
115-
universal_substs,
115+
opaque_type_key,
116116
universal_concrete_type,
117117
span,
118118
);
119119
(
120-
opaque_def_id,
120+
opaque_type_key,
121121
ty::ResolvedOpaqueTy { concrete_type: remapped_type, substs: universal_substs },
122122
)
123123
})

compiler/rustc_mir/src/borrow_check/type_check/mod.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ use either::Either;
77

88
use rustc_data_structures::frozen::Frozen;
99
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
10+
use rustc_data_structures::vec_map::VecMap;
1011
use rustc_errors::struct_span_err;
1112
use rustc_hir as hir;
12-
use rustc_hir::def_id::{DefId, LocalDefId};
13+
use rustc_hir::def_id::LocalDefId;
1314
use rustc_hir::lang_items::LangItem;
1415
use rustc_index::vec::{Idx, IndexVec};
1516
use rustc_infer::infer::canonical::QueryRegionConstraints;
@@ -27,8 +28,8 @@ use rustc_middle::ty::cast::CastTy;
2728
use rustc_middle::ty::fold::TypeFoldable;
2829
use rustc_middle::ty::subst::{GenericArgKind, Subst, SubstsRef, UserSubsts};
2930
use rustc_middle::ty::{
30-
self, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, RegionVid, ToPredicate, Ty,
31-
TyCtxt, UserType, UserTypeAnnotationIndex, WithConstness,
31+
self, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, OpaqueTypeKey, RegionVid,
32+
ToPredicate, Ty, TyCtxt, UserType, UserTypeAnnotationIndex, WithConstness,
3233
};
3334
use rustc_span::{Span, DUMMY_SP};
3435
use rustc_target::abi::VariantIdx;
@@ -818,7 +819,7 @@ struct TypeChecker<'a, 'tcx> {
818819
reported_errors: FxHashSet<(Ty<'tcx>, Span)>,
819820
borrowck_context: &'a mut BorrowCheckContext<'a, 'tcx>,
820821
universal_region_relations: &'a UniversalRegionRelations<'tcx>,
821-
opaque_type_values: FxHashMap<DefId, ty::ResolvedOpaqueTy<'tcx>>,
822+
opaque_type_values: VecMap<OpaqueTypeKey<'tcx>, ty::ResolvedOpaqueTy<'tcx>>,
822823
}
823824

824825
struct BorrowCheckContext<'a, 'tcx> {
@@ -833,7 +834,7 @@ struct BorrowCheckContext<'a, 'tcx> {
833834
crate struct MirTypeckResults<'tcx> {
834835
crate constraints: MirTypeckRegionConstraints<'tcx>,
835836
pub(in crate::borrow_check) universal_region_relations: Frozen<UniversalRegionRelations<'tcx>>,
836-
crate opaque_type_values: FxHashMap<DefId, ty::ResolvedOpaqueTy<'tcx>>,
837+
crate opaque_type_values: VecMap<OpaqueTypeKey<'tcx>, ty::ResolvedOpaqueTy<'tcx>>,
837838
}
838839

839840
/// A collection of region constraints that must be satisfied for the
@@ -978,7 +979,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
978979
borrowck_context,
979980
reported_errors: Default::default(),
980981
universal_region_relations,
981-
opaque_type_values: FxHashMap::default(),
982+
opaque_type_values: VecMap::default(),
982983
};
983984
checker.check_user_type_annotations();
984985
checker
@@ -1240,7 +1241,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
12401241
let param_env = self.param_env;
12411242
let body = self.body;
12421243
let concrete_opaque_types = &tcx.typeck(anon_owner_def_id).concrete_opaque_types;
1243-
let mut opaque_type_values = Vec::new();
1244+
let mut opaque_type_values = VecMap::new();
12441245

12451246
debug!("eq_opaque_type_and_type: mir_def_id={:?}", body.source.def_id());
12461247
let opaque_type_map = self.fully_perform_op(
@@ -1288,7 +1289,14 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
12881289
} else {
12891290
false
12901291
};
1291-
let opaque_defn_ty = match concrete_opaque_types.get(&opaque_def_id) {
1292+
1293+
let opaque_type_key =
1294+
OpaqueTypeKey { def_id: opaque_def_id, substs: opaque_decl.substs };
1295+
let opaque_defn_ty = match concrete_opaque_types
1296+
.iter()
1297+
.find(|(opaque_type_key, _)| opaque_type_key.def_id == opaque_def_id)
1298+
.map(|(_, resolved_opaque_ty)| resolved_opaque_ty)
1299+
{
12921300
None => {
12931301
if !concrete_is_opaque {
12941302
tcx.sess.delay_span_bug(
@@ -1322,13 +1330,13 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
13221330
.at(&ObligationCause::dummy(), param_env)
13231331
.eq(opaque_decl.concrete_ty, renumbered_opaque_defn_ty)?,
13241332
);
1325-
opaque_type_values.push((
1326-
opaque_def_id,
1333+
opaque_type_values.insert(
1334+
opaque_type_key,
13271335
ty::ResolvedOpaqueTy {
13281336
concrete_type: renumbered_opaque_defn_ty,
13291337
substs: opaque_decl.substs,
13301338
},
1331-
));
1339+
);
13321340
} else {
13331341
// We're using an opaque `impl Trait` type without
13341342
// 'revealing' it. For example, code like this:

compiler/rustc_trait_selection/src/opaque_types.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKi
1212
use rustc_infer::infer::{self, InferCtxt, InferOk};
1313
use rustc_middle::ty::fold::{BottomUpFolder, TypeFoldable, TypeFolder, TypeVisitor};
1414
use rustc_middle::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef};
15-
use rustc_middle::ty::{self, Ty, TyCtxt};
15+
use rustc_middle::ty::{self, OpaqueTypeKey, Ty, TyCtxt};
1616
use rustc_span::Span;
1717

1818
use std::ops::ControlFlow;
@@ -143,8 +143,7 @@ pub trait InferCtxtExt<'tcx> {
143143

144144
fn infer_opaque_definition_from_instantiation(
145145
&self,
146-
def_id: DefId,
147-
substs: SubstsRef<'tcx>,
146+
opaque_type_key: OpaqueTypeKey<'tcx>,
148147
instantiated_ty: Ty<'tcx>,
149148
span: Span,
150149
) -> Ty<'tcx>;
@@ -573,11 +572,12 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
573572
/// `opaque_defn.concrete_ty`
574573
fn infer_opaque_definition_from_instantiation(
575574
&self,
576-
def_id: DefId,
577-
substs: SubstsRef<'tcx>,
575+
opaque_type_key: OpaqueTypeKey<'tcx>,
578576
instantiated_ty: Ty<'tcx>,
579577
span: Span,
580578
) -> Ty<'tcx> {
579+
let OpaqueTypeKey { def_id, substs } = opaque_type_key;
580+
581581
debug!(
582582
"infer_opaque_definition_from_instantiation(def_id={:?}, instantiated_ty={:?})",
583583
def_id, instantiated_ty

compiler/rustc_typeck/src/check/writeback.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use rustc_middle::hir::place::Place as HirPlace;
1515
use rustc_middle::mir::FakeReadCause;
1616
use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCast};
1717
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
18-
use rustc_middle::ty::{self, Ty, TyCtxt};
18+
use rustc_middle::ty::{self, OpaqueTypeKey, Ty, TyCtxt};
1919
use rustc_span::symbol::sym;
2020
use rustc_span::Span;
2121
use rustc_trait_selection::opaque_types::InferCtxtExt;
@@ -493,9 +493,9 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
493493
// fn foo<U>() -> Foo<U> { .. }
494494
// ```
495495
// figures out the concrete type with `U`, but the stored type is with `T`.
496+
let opaque_type_key = OpaqueTypeKey { def_id, substs: opaque_defn.substs };
496497
let definition_ty = self.fcx.infer_opaque_definition_from_instantiation(
497-
def_id,
498-
opaque_defn.substs,
498+
opaque_type_key,
499499
instantiated_ty,
500500
span,
501501
);
@@ -527,7 +527,9 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
527527
substs: opaque_defn.substs,
528528
};
529529

530-
let old = self.typeck_results.concrete_opaque_types.insert(def_id, new);
530+
let opaque_type_key = OpaqueTypeKey { def_id, substs: opaque_defn.substs };
531+
let old =
532+
self.typeck_results.concrete_opaque_types.insert(opaque_type_key, new);
531533
if let Some(old) = old {
532534
if old.concrete_type != definition_ty || old.substs != opaque_defn.substs {
533535
span_bug!(

0 commit comments

Comments
 (0)