Skip to content

Commit d34a3a4

Browse files
committed
Auto merge of rust-lang#85090 - Aaron1011:type-outlives-global, r=matthewjasper,jackh726
Return `EvaluatedToOk` when type in outlives predicate is global A global type doesn't reference any local regions or types, so it's guaranteed to outlive any region.
2 parents 71b8742 + 1f7cb16 commit d34a3a4

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

compiler/rustc_trait_selection/src/traits/select/mod.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,15 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
492492
None => Ok(EvaluatedToAmbig),
493493
},
494494

495-
ty::PredicateKind::TypeOutlives(..) | ty::PredicateKind::RegionOutlives(..) => {
495+
ty::PredicateKind::TypeOutlives(pred) => {
496+
if pred.0.is_global() {
497+
Ok(EvaluatedToOk)
498+
} else {
499+
Ok(EvaluatedToOkModuloRegions)
500+
}
501+
}
502+
503+
ty::PredicateKind::RegionOutlives(..) => {
496504
// We do not consider region relationships when evaluating trait matches.
497505
Ok(EvaluatedToOkModuloRegions)
498506
}

src/test/ui/traits/issue-83538-tainted-cache-after-cycle.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ pub struct Second {
1717
d: Vec<First>,
1818
}
1919

20-
struct Third<f> {
21-
g: Vec<f>,
20+
struct Third<'a, f> {
21+
g: Vec<(f, &'a f)>,
2222
}
2323

2424
enum Ty {
@@ -38,29 +38,29 @@ struct Sixth {
3838
}
3939

4040
#[rustc_evaluate_where_clauses]
41-
fn forward()
41+
fn forward<'a>()
4242
where
4343
Vec<First>: Unpin,
44-
Third<Ty>: Unpin,
44+
Third<'a, Ty>: Unpin,
4545
{
4646
}
4747

4848
#[rustc_evaluate_where_clauses]
49-
fn reverse()
49+
fn reverse<'a>()
5050
where
51-
Third<Ty>: Unpin,
51+
Third<'a, Ty>: Unpin,
5252
Vec<First>: Unpin,
5353
{
5454
}
5555

5656
fn main() {
57-
// Key is that Vec<First> is "ok" and Third<Ty> is "ok modulo regions":
57+
// Key is that Vec<First> is "ok" and Third<'_, Ty> is "ok modulo regions":
5858

5959
forward();
6060
//~^ ERROR evaluate(Binder(TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>), [])) = Ok(EvaluatedToOk)
61-
//~| ERROR evaluate(Binder(TraitPredicate(<Third<Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
61+
//~| ERROR evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
6262

6363
reverse();
6464
//~^ ERROR evaluate(Binder(TraitPredicate(<std::vec::Vec<First> as std::marker::Unpin>), [])) = Ok(EvaluatedToOk)
65-
//~| ERROR evaluate(Binder(TraitPredicate(<Third<Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
65+
//~| ERROR evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
6666
}

src/test/ui/traits/issue-83538-tainted-cache-after-cycle.stderr

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ LL | Vec<First>: Unpin,
77
LL | forward();
88
| ^^^^^^^
99

10-
error: evaluate(Binder(TraitPredicate(<Third<Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
10+
error: evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
1111
--> $DIR/issue-83538-tainted-cache-after-cycle.rs:59:5
1212
|
13-
LL | Third<Ty>: Unpin,
14-
| ----- predicate
13+
LL | Third<'a, Ty>: Unpin,
14+
| ----- predicate
1515
...
1616
LL | forward();
1717
| ^^^^^^^
1818

19-
error: evaluate(Binder(TraitPredicate(<Third<Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
19+
error: evaluate(Binder(TraitPredicate(<Third<'_, Ty> as std::marker::Unpin>), [])) = Ok(EvaluatedToOkModuloRegions)
2020
--> $DIR/issue-83538-tainted-cache-after-cycle.rs:63:5
2121
|
22-
LL | Third<Ty>: Unpin,
23-
| ----- predicate
22+
LL | Third<'a, Ty>: Unpin,
23+
| ----- predicate
2424
...
2525
LL | reverse();
2626
| ^^^^^^^

0 commit comments

Comments
 (0)