Skip to content

Commit 22438fc

Browse files
authored
Rollup merge of rust-lang#72055 - lcnr:predicate-kind, r=nikomatsakis
Intern predicates Implements the first step of rust-lang/compiler-team#285 Renames `ty::Predicate` to `ty::PredicateKind`, which is now interned. To ease the transition, `ty::Predicate` is now a struct containing a reference to `ty::PredicateKind`. r? @ghost
2 parents 148c125 + 3dd830b commit 22438fc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+796
-634
lines changed

src/librustc_infer/infer/canonical/query_response.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use rustc_middle::arena::ArenaAllocatable;
2525
use rustc_middle::ty::fold::TypeFoldable;
2626
use rustc_middle::ty::relate::TypeRelation;
2727
use rustc_middle::ty::subst::{GenericArg, GenericArgKind};
28-
use rustc_middle::ty::{self, BoundVar, Const, Ty, TyCtxt};
28+
use rustc_middle::ty::{self, BoundVar, Const, ToPredicate, Ty, TyCtxt};
2929
use std::fmt::Debug;
3030

3131
impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
@@ -532,12 +532,14 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
532532
cause.clone(),
533533
param_env,
534534
match k1.unpack() {
535-
GenericArgKind::Lifetime(r1) => ty::Predicate::RegionOutlives(
535+
GenericArgKind::Lifetime(r1) => ty::PredicateKind::RegionOutlives(
536536
ty::Binder::bind(ty::OutlivesPredicate(r1, r2)),
537-
),
538-
GenericArgKind::Type(t1) => {
539-
ty::Predicate::TypeOutlives(ty::Binder::bind(ty::OutlivesPredicate(t1, r2)))
540-
}
537+
)
538+
.to_predicate(self.tcx),
539+
GenericArgKind::Type(t1) => ty::PredicateKind::TypeOutlives(ty::Binder::bind(
540+
ty::OutlivesPredicate(t1, r2),
541+
))
542+
.to_predicate(self.tcx),
541543
GenericArgKind::Const(..) => {
542544
// Consts cannot outlive one another, so we don't expect to
543545
// ecounter this branch.
@@ -664,9 +666,10 @@ impl<'tcx> TypeRelatingDelegate<'tcx> for QueryTypeRelatingDelegate<'_, 'tcx> {
664666
self.obligations.push(Obligation {
665667
cause: self.cause.clone(),
666668
param_env: self.param_env,
667-
predicate: ty::Predicate::RegionOutlives(ty::Binder::dummy(ty::OutlivesPredicate(
669+
predicate: ty::PredicateKind::RegionOutlives(ty::Binder::dummy(ty::OutlivesPredicate(
668670
sup, sub,
669-
))),
671+
)))
672+
.to_predicate(self.infcx.tcx),
670673
recursion_depth: 0,
671674
});
672675
}

src/librustc_infer/infer/combine.rs

+9-5
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use rustc_hir::def_id::DefId;
3939
use rustc_middle::ty::error::TypeError;
4040
use rustc_middle::ty::relate::{self, Relate, RelateResult, TypeRelation};
4141
use rustc_middle::ty::subst::SubstsRef;
42-
use rustc_middle::ty::{self, InferConst, Ty, TyCtxt, TypeFoldable};
42+
use rustc_middle::ty::{self, InferConst, ToPredicate, Ty, TyCtxt, TypeFoldable};
4343
use rustc_middle::ty::{IntType, UintType};
4444
use rustc_span::{Span, DUMMY_SP};
4545

@@ -307,7 +307,7 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> {
307307
self.obligations.push(Obligation::new(
308308
self.trace.cause.clone(),
309309
self.param_env,
310-
ty::Predicate::WellFormed(b_ty),
310+
ty::PredicateKind::WellFormed(b_ty).to_predicate(self.infcx.tcx),
311311
));
312312
}
313313

@@ -398,11 +398,15 @@ impl<'infcx, 'tcx> CombineFields<'infcx, 'tcx> {
398398
b: &'tcx ty::Const<'tcx>,
399399
) {
400400
let predicate = if a_is_expected {
401-
ty::Predicate::ConstEquate(a, b)
401+
ty::PredicateKind::ConstEquate(a, b)
402402
} else {
403-
ty::Predicate::ConstEquate(b, a)
403+
ty::PredicateKind::ConstEquate(b, a)
404404
};
405-
self.obligations.push(Obligation::new(self.trace.cause.clone(), self.param_env, predicate));
405+
self.obligations.push(Obligation::new(
406+
self.trace.cause.clone(),
407+
self.param_env,
408+
predicate.to_predicate(self.tcx()),
409+
));
406410
}
407411
}
408412

src/librustc_infer/infer/outlives/mod.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ pub fn explicit_outlives_bounds<'tcx>(
1111
param_env: ty::ParamEnv<'tcx>,
1212
) -> impl Iterator<Item = OutlivesBound<'tcx>> + 'tcx {
1313
debug!("explicit_outlives_bounds()");
14-
param_env.caller_bounds.into_iter().filter_map(move |predicate| match predicate {
15-
ty::Predicate::Projection(..)
16-
| ty::Predicate::Trait(..)
17-
| ty::Predicate::Subtype(..)
18-
| ty::Predicate::WellFormed(..)
19-
| ty::Predicate::ObjectSafe(..)
20-
| ty::Predicate::ClosureKind(..)
21-
| ty::Predicate::TypeOutlives(..)
22-
| ty::Predicate::ConstEvaluatable(..)
23-
| ty::Predicate::ConstEquate(..) => None,
24-
ty::Predicate::RegionOutlives(ref data) => data
14+
param_env.caller_bounds.into_iter().filter_map(move |predicate| match predicate.kind() {
15+
ty::PredicateKind::Projection(..)
16+
| ty::PredicateKind::Trait(..)
17+
| ty::PredicateKind::Subtype(..)
18+
| ty::PredicateKind::WellFormed(..)
19+
| ty::PredicateKind::ObjectSafe(..)
20+
| ty::PredicateKind::ClosureKind(..)
21+
| ty::PredicateKind::TypeOutlives(..)
22+
| ty::PredicateKind::ConstEvaluatable(..)
23+
| ty::PredicateKind::ConstEquate(..) => None,
24+
ty::PredicateKind::RegionOutlives(ref data) => data
2525
.no_bound_vars()
2626
.map(|ty::OutlivesPredicate(r_a, r_b)| OutlivesBound::RegionSubRegion(r_b, r_a)),
2727
})

src/librustc_infer/infer/sub.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::traits::Obligation;
66
use rustc_middle::ty::fold::TypeFoldable;
77
use rustc_middle::ty::relate::{Cause, Relate, RelateResult, TypeRelation};
88
use rustc_middle::ty::TyVar;
9-
use rustc_middle::ty::{self, Ty, TyCtxt};
9+
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt};
1010
use std::mem;
1111

1212
/// Ensures `a` is made a subtype of `b`. Returns `a` on success.
@@ -100,11 +100,12 @@ impl TypeRelation<'tcx> for Sub<'combine, 'infcx, 'tcx> {
100100
self.fields.obligations.push(Obligation::new(
101101
self.fields.trace.cause.clone(),
102102
self.fields.param_env,
103-
ty::Predicate::Subtype(ty::Binder::dummy(ty::SubtypePredicate {
103+
ty::PredicateKind::Subtype(ty::Binder::dummy(ty::SubtypePredicate {
104104
a_is_expected: self.a_is_expected,
105105
a,
106106
b,
107-
})),
107+
}))
108+
.to_predicate(self.tcx()),
108109
));
109110

110111
Ok(a)

src/librustc_infer/traits/engine.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub trait TraitEngine<'tcx>: 'tcx {
3333
cause,
3434
recursion_depth: 0,
3535
param_env,
36-
predicate: trait_ref.without_const().to_predicate(),
36+
predicate: trait_ref.without_const().to_predicate(infcx.tcx),
3737
},
3838
);
3939
}

src/librustc_infer/traits/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ pub type TraitObligation<'tcx> = Obligation<'tcx, ty::PolyTraitPredicate<'tcx>>;
5959

6060
// `PredicateObligation` is used a lot. Make sure it doesn't unintentionally get bigger.
6161
#[cfg(target_arch = "x86_64")]
62-
static_assert_size!(PredicateObligation<'_>, 112);
62+
static_assert_size!(PredicateObligation<'_>, 88);
6363

6464
pub type Obligations<'tcx, O> = Vec<Obligation<'tcx, O>>;
6565
pub type PredicateObligations<'tcx> = Vec<PredicateObligation<'tcx>>;

src/librustc_infer/traits/util.rs

+46-36
Original file line numberDiff line numberDiff line change
@@ -10,40 +10,49 @@ pub fn anonymize_predicate<'tcx>(
1010
tcx: TyCtxt<'tcx>,
1111
pred: &ty::Predicate<'tcx>,
1212
) -> ty::Predicate<'tcx> {
13-
match *pred {
14-
ty::Predicate::Trait(ref data, constness) => {
15-
ty::Predicate::Trait(tcx.anonymize_late_bound_regions(data), constness)
13+
match pred.kind() {
14+
&ty::PredicateKind::Trait(ref data, constness) => {
15+
ty::PredicateKind::Trait(tcx.anonymize_late_bound_regions(data), constness)
16+
.to_predicate(tcx)
1617
}
1718

18-
ty::Predicate::RegionOutlives(ref data) => {
19-
ty::Predicate::RegionOutlives(tcx.anonymize_late_bound_regions(data))
19+
ty::PredicateKind::RegionOutlives(data) => {
20+
ty::PredicateKind::RegionOutlives(tcx.anonymize_late_bound_regions(data))
21+
.to_predicate(tcx)
2022
}
2123

22-
ty::Predicate::TypeOutlives(ref data) => {
23-
ty::Predicate::TypeOutlives(tcx.anonymize_late_bound_regions(data))
24+
ty::PredicateKind::TypeOutlives(data) => {
25+
ty::PredicateKind::TypeOutlives(tcx.anonymize_late_bound_regions(data))
26+
.to_predicate(tcx)
2427
}
2528

26-
ty::Predicate::Projection(ref data) => {
27-
ty::Predicate::Projection(tcx.anonymize_late_bound_regions(data))
29+
ty::PredicateKind::Projection(data) => {
30+
ty::PredicateKind::Projection(tcx.anonymize_late_bound_regions(data)).to_predicate(tcx)
2831
}
2932

30-
ty::Predicate::WellFormed(data) => ty::Predicate::WellFormed(data),
33+
&ty::PredicateKind::WellFormed(data) => {
34+
ty::PredicateKind::WellFormed(data).to_predicate(tcx)
35+
}
3136

32-
ty::Predicate::ObjectSafe(data) => ty::Predicate::ObjectSafe(data),
37+
&ty::PredicateKind::ObjectSafe(data) => {
38+
ty::PredicateKind::ObjectSafe(data).to_predicate(tcx)
39+
}
3340

34-
ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind) => {
35-
ty::Predicate::ClosureKind(closure_def_id, closure_substs, kind)
41+
&ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind) => {
42+
ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind).to_predicate(tcx)
3643
}
3744

38-
ty::Predicate::Subtype(ref data) => {
39-
ty::Predicate::Subtype(tcx.anonymize_late_bound_regions(data))
45+
ty::PredicateKind::Subtype(data) => {
46+
ty::PredicateKind::Subtype(tcx.anonymize_late_bound_regions(data)).to_predicate(tcx)
4047
}
4148

42-
ty::Predicate::ConstEvaluatable(def_id, substs) => {
43-
ty::Predicate::ConstEvaluatable(def_id, substs)
49+
&ty::PredicateKind::ConstEvaluatable(def_id, substs) => {
50+
ty::PredicateKind::ConstEvaluatable(def_id, substs).to_predicate(tcx)
4451
}
4552

46-
ty::Predicate::ConstEquate(c1, c2) => ty::Predicate::ConstEquate(c1, c2),
53+
ty::PredicateKind::ConstEquate(c1, c2) => {
54+
ty::PredicateKind::ConstEquate(c1, c2).to_predicate(tcx)
55+
}
4756
}
4857
}
4958

@@ -99,14 +108,14 @@ pub fn elaborate_trait_ref<'tcx>(
99108
tcx: TyCtxt<'tcx>,
100109
trait_ref: ty::PolyTraitRef<'tcx>,
101110
) -> Elaborator<'tcx> {
102-
elaborate_predicates(tcx, std::iter::once(trait_ref.without_const().to_predicate()))
111+
elaborate_predicates(tcx, std::iter::once(trait_ref.without_const().to_predicate(tcx)))
103112
}
104113

105114
pub fn elaborate_trait_refs<'tcx>(
106115
tcx: TyCtxt<'tcx>,
107116
trait_refs: impl Iterator<Item = ty::PolyTraitRef<'tcx>>,
108117
) -> Elaborator<'tcx> {
109-
let predicates = trait_refs.map(|trait_ref| trait_ref.without_const().to_predicate());
118+
let predicates = trait_refs.map(|trait_ref| trait_ref.without_const().to_predicate(tcx));
110119
elaborate_predicates(tcx, predicates)
111120
}
112121

@@ -145,8 +154,8 @@ impl Elaborator<'tcx> {
145154

146155
fn elaborate(&mut self, obligation: &PredicateObligation<'tcx>) {
147156
let tcx = self.visited.tcx;
148-
match obligation.predicate {
149-
ty::Predicate::Trait(ref data, _) => {
157+
match obligation.predicate.kind() {
158+
ty::PredicateKind::Trait(ref data, _) => {
150159
// Get predicates declared on the trait.
151160
let predicates = tcx.super_predicates_of(data.def_id());
152161

@@ -167,36 +176,36 @@ impl Elaborator<'tcx> {
167176

168177
self.stack.extend(obligations);
169178
}
170-
ty::Predicate::WellFormed(..) => {
179+
ty::PredicateKind::WellFormed(..) => {
171180
// Currently, we do not elaborate WF predicates,
172181
// although we easily could.
173182
}
174-
ty::Predicate::ObjectSafe(..) => {
183+
ty::PredicateKind::ObjectSafe(..) => {
175184
// Currently, we do not elaborate object-safe
176185
// predicates.
177186
}
178-
ty::Predicate::Subtype(..) => {
187+
ty::PredicateKind::Subtype(..) => {
179188
// Currently, we do not "elaborate" predicates like `X <: Y`,
180189
// though conceivably we might.
181190
}
182-
ty::Predicate::Projection(..) => {
191+
ty::PredicateKind::Projection(..) => {
183192
// Nothing to elaborate in a projection predicate.
184193
}
185-
ty::Predicate::ClosureKind(..) => {
194+
ty::PredicateKind::ClosureKind(..) => {
186195
// Nothing to elaborate when waiting for a closure's kind to be inferred.
187196
}
188-
ty::Predicate::ConstEvaluatable(..) => {
197+
ty::PredicateKind::ConstEvaluatable(..) => {
189198
// Currently, we do not elaborate const-evaluatable
190199
// predicates.
191200
}
192-
ty::Predicate::ConstEquate(..) => {
201+
ty::PredicateKind::ConstEquate(..) => {
193202
// Currently, we do not elaborate const-equate
194203
// predicates.
195204
}
196-
ty::Predicate::RegionOutlives(..) => {
205+
ty::PredicateKind::RegionOutlives(..) => {
197206
// Nothing to elaborate from `'a: 'b`.
198207
}
199-
ty::Predicate::TypeOutlives(ref data) => {
208+
ty::PredicateKind::TypeOutlives(ref data) => {
200209
// We know that `T: 'a` for some type `T`. We can
201210
// often elaborate this. For example, if we know that
202211
// `[U]: 'a`, that implies that `U: 'a`. Similarly, if
@@ -228,15 +237,15 @@ impl Elaborator<'tcx> {
228237
if r.is_late_bound() {
229238
None
230239
} else {
231-
Some(ty::Predicate::RegionOutlives(ty::Binder::dummy(
240+
Some(ty::PredicateKind::RegionOutlives(ty::Binder::dummy(
232241
ty::OutlivesPredicate(r, r_min),
233242
)))
234243
}
235244
}
236245

237246
Component::Param(p) => {
238247
let ty = tcx.mk_ty_param(p.index, p.name);
239-
Some(ty::Predicate::TypeOutlives(ty::Binder::dummy(
248+
Some(ty::PredicateKind::TypeOutlives(ty::Binder::dummy(
240249
ty::OutlivesPredicate(ty, r_min),
241250
)))
242251
}
@@ -250,8 +259,9 @@ impl Elaborator<'tcx> {
250259
None
251260
}
252261
})
253-
.filter(|p| visited.insert(p))
254-
.map(|p| predicate_obligation(p, None)),
262+
.map(|predicate_kind| predicate_kind.to_predicate(tcx))
263+
.filter(|predicate| visited.insert(predicate))
264+
.map(|predicate| predicate_obligation(predicate, None)),
255265
);
256266
}
257267
}
@@ -317,7 +327,7 @@ impl<'tcx, I: Iterator<Item = PredicateObligation<'tcx>>> Iterator for FilterToT
317327

318328
fn next(&mut self) -> Option<ty::PolyTraitRef<'tcx>> {
319329
while let Some(obligation) = self.base_iterator.next() {
320-
if let ty::Predicate::Trait(data, _) = obligation.predicate {
330+
if let ty::PredicateKind::Trait(data, _) = obligation.predicate.kind() {
321331
return Some(data.to_poly_trait_ref());
322332
}
323333
}

src/librustc_lint/builtin.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -1202,13 +1202,13 @@ declare_lint_pass!(
12021202
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TrivialConstraints {
12031203
fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::Item<'tcx>) {
12041204
use rustc_middle::ty::fold::TypeFoldable;
1205-
use rustc_middle::ty::Predicate::*;
1205+
use rustc_middle::ty::PredicateKind::*;
12061206

12071207
if cx.tcx.features().trivial_bounds {
12081208
let def_id = cx.tcx.hir().local_def_id(item.hir_id);
12091209
let predicates = cx.tcx.predicates_of(def_id);
12101210
for &(predicate, span) in predicates.predicates {
1211-
let predicate_kind_name = match predicate {
1211+
let predicate_kind_name = match predicate.kind() {
12121212
Trait(..) => "Trait",
12131213
TypeOutlives(..) |
12141214
RegionOutlives(..) => "Lifetime",
@@ -1497,8 +1497,8 @@ impl ExplicitOutlivesRequirements {
14971497
) -> Vec<ty::Region<'tcx>> {
14981498
inferred_outlives
14991499
.iter()
1500-
.filter_map(|(pred, _)| match pred {
1501-
ty::Predicate::RegionOutlives(outlives) => {
1500+
.filter_map(|(pred, _)| match pred.kind() {
1501+
ty::PredicateKind::RegionOutlives(outlives) => {
15021502
let outlives = outlives.skip_binder();
15031503
match outlives.0 {
15041504
ty::ReEarlyBound(ebr) if ebr.index == index => Some(outlives.1),
@@ -1516,8 +1516,8 @@ impl ExplicitOutlivesRequirements {
15161516
) -> Vec<ty::Region<'tcx>> {
15171517
inferred_outlives
15181518
.iter()
1519-
.filter_map(|(pred, _)| match pred {
1520-
ty::Predicate::TypeOutlives(outlives) => {
1519+
.filter_map(|(pred, _)| match pred.kind() {
1520+
ty::PredicateKind::TypeOutlives(outlives) => {
15211521
let outlives = outlives.skip_binder();
15221522
outlives.0.is_param(index).then_some(outlives.1)
15231523
}

src/librustc_lint/unused.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
146146
ty::Opaque(def, _) => {
147147
let mut has_emitted = false;
148148
for (predicate, _) in cx.tcx.predicates_of(def).predicates {
149-
if let ty::Predicate::Trait(ref poly_trait_predicate, _) = predicate {
149+
if let ty::PredicateKind::Trait(ref poly_trait_predicate, _) =
150+
predicate.kind()
151+
{
150152
let trait_ref = poly_trait_predicate.skip_binder().trait_ref;
151153
let def_id = trait_ref.def_id;
152154
let descr_pre =

0 commit comments

Comments
 (0)