Skip to content

Commit abf212c

Browse files
committed
Remove OutlivesEnvironmentBuilder.
`OutlivesEnvironment::new` can call `OutlivesEnvironment::with_bounds` with an empty `extra_bounds`. And once that's done, `OutlivesEnvironmentBuilder` has a single use and can be inlined and removed into `OutlivesEnvironment::with_bounds`.
1 parent b8495e5 commit abf212c

File tree

1 file changed

+26
-61
lines changed
  • compiler/rustc_infer/src/infer/outlives

1 file changed

+26
-61
lines changed
Lines changed: 26 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use rustc_data_structures::fx::FxIndexSet;
22
use rustc_data_structures::transitive_relation::TransitiveRelationBuilder;
3-
use rustc_middle::bug;
4-
use rustc_middle::ty::{self, Region};
5-
use tracing::{debug, instrument};
3+
use rustc_middle::{bug, ty};
4+
use tracing::debug;
65

76
use super::explicit_outlives_bounds;
87
use crate::infer::GenericKind;
@@ -54,94 +53,44 @@ pub struct OutlivesEnvironment<'tcx> {
5453
region_bound_pairs: RegionBoundPairs<'tcx>,
5554
}
5655

57-
/// Builder of OutlivesEnvironment.
58-
#[derive(Debug)]
59-
struct OutlivesEnvironmentBuilder<'tcx> {
60-
param_env: ty::ParamEnv<'tcx>,
61-
region_relation: TransitiveRelationBuilder<Region<'tcx>>,
62-
region_bound_pairs: RegionBoundPairs<'tcx>,
63-
}
64-
6556
/// "Region-bound pairs" tracks outlives relations that are known to
6657
/// be true, either because of explicit where-clauses like `T: 'a` or
6758
/// because of implied bounds.
6859
pub type RegionBoundPairs<'tcx> = FxIndexSet<ty::OutlivesPredicate<'tcx, GenericKind<'tcx>>>;
6960

7061
impl<'tcx> OutlivesEnvironment<'tcx> {
71-
/// Create a builder using `ParamEnv` and add explicit outlives bounds into it.
72-
fn builder(param_env: ty::ParamEnv<'tcx>) -> OutlivesEnvironmentBuilder<'tcx> {
73-
let mut builder = OutlivesEnvironmentBuilder {
74-
param_env,
75-
region_relation: Default::default(),
76-
region_bound_pairs: Default::default(),
77-
};
78-
79-
builder.add_outlives_bounds(explicit_outlives_bounds(param_env));
80-
81-
builder
82-
}
83-
84-
#[inline]
8562
/// Create a new `OutlivesEnvironment` without extra outlives bounds.
63+
#[inline]
8664
pub fn new(param_env: ty::ParamEnv<'tcx>) -> Self {
87-
Self::builder(param_env).build()
65+
Self::with_bounds(param_env, vec![])
8866
}
8967

9068
/// Create a new `OutlivesEnvironment` with extra outlives bounds.
9169
pub fn with_bounds(
9270
param_env: ty::ParamEnv<'tcx>,
9371
extra_bounds: impl IntoIterator<Item = OutlivesBound<'tcx>>,
9472
) -> Self {
95-
let mut builder = Self::builder(param_env);
96-
builder.add_outlives_bounds(extra_bounds);
97-
builder.build()
98-
}
73+
let mut region_relation = TransitiveRelationBuilder::default();
74+
let mut region_bound_pairs = RegionBoundPairs::default();
9975

100-
/// Borrows current value of the `free_region_map`.
101-
pub fn free_region_map(&self) -> &FreeRegionMap<'tcx> {
102-
&self.free_region_map
103-
}
104-
105-
/// Borrows current `region_bound_pairs`.
106-
pub fn region_bound_pairs(&self) -> &RegionBoundPairs<'tcx> {
107-
&self.region_bound_pairs
108-
}
109-
}
110-
111-
impl<'tcx> OutlivesEnvironmentBuilder<'tcx> {
112-
#[inline]
113-
#[instrument(level = "debug")]
114-
fn build(self) -> OutlivesEnvironment<'tcx> {
115-
OutlivesEnvironment {
116-
param_env: self.param_env,
117-
free_region_map: FreeRegionMap { relation: self.region_relation.freeze() },
118-
region_bound_pairs: self.region_bound_pairs,
119-
}
120-
}
121-
122-
/// Processes outlives bounds that are known to hold, whether from implied or other sources.
123-
fn add_outlives_bounds<I>(&mut self, outlives_bounds: I)
124-
where
125-
I: IntoIterator<Item = OutlivesBound<'tcx>>,
126-
{
12776
// Record relationships such as `T:'x` that don't go into the
12877
// free-region-map but which we use here.
129-
for outlives_bound in outlives_bounds {
78+
for outlives_bound in explicit_outlives_bounds(param_env).chain(extra_bounds) {
13079
debug!("add_outlives_bounds: outlives_bound={:?}", outlives_bound);
13180
match outlives_bound {
13281
OutlivesBound::RegionSubParam(r_a, param_b) => {
133-
self.region_bound_pairs
82+
region_bound_pairs
13483
.insert(ty::OutlivesPredicate(GenericKind::Param(param_b), r_a));
13584
}
13685
OutlivesBound::RegionSubAlias(r_a, alias_b) => {
137-
self.region_bound_pairs
86+
region_bound_pairs
13887
.insert(ty::OutlivesPredicate(GenericKind::Alias(alias_b), r_a));
13988
}
14089
OutlivesBound::RegionSubRegion(r_a, r_b) => match (*r_a, *r_b) {
14190
(
14291
ty::ReStatic | ty::ReEarlyParam(_) | ty::ReLateParam(_),
14392
ty::ReStatic | ty::ReEarlyParam(_) | ty::ReLateParam(_),
144-
) => self.region_relation.add(r_a, r_b),
93+
) => region_relation.add(r_a, r_b),
14594
(ty::ReError(_), _) | (_, ty::ReError(_)) => {}
14695
// FIXME(#109628): We shouldn't have existential variables in implied bounds.
14796
// Panic here once the linked issue is resolved!
@@ -150,5 +99,21 @@ impl<'tcx> OutlivesEnvironmentBuilder<'tcx> {
15099
},
151100
}
152101
}
102+
103+
OutlivesEnvironment {
104+
param_env,
105+
free_region_map: FreeRegionMap { relation: region_relation.freeze() },
106+
region_bound_pairs,
107+
}
108+
}
109+
110+
/// Borrows current value of the `free_region_map`.
111+
pub fn free_region_map(&self) -> &FreeRegionMap<'tcx> {
112+
&self.free_region_map
113+
}
114+
115+
/// Borrows current `region_bound_pairs`.
116+
pub fn region_bound_pairs(&self) -> &RegionBoundPairs<'tcx> {
117+
&self.region_bound_pairs
153118
}
154119
}

0 commit comments

Comments
 (0)