More nll revisions

This commit is contained in:
Jack Huey 2022-04-01 22:12:17 -04:00
parent 72e3e0e6f5
commit 1c1d01eb49
54 changed files with 457 additions and 300 deletions

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-associated-types2.rs:13:42 --> $DIR/variance-associated-types2.rs:17:42
| |
LL | let _: Box<dyn Foo<Bar = &'a u32>> = make(); LL | let _: Box<dyn Foo<Bar = &'a u32>> = make();
| ^^^^^^ lifetime mismatch | ^^^^^^ lifetime mismatch
@ -7,7 +7,7 @@ LL | let _: Box<dyn Foo<Bar = &'a u32>> = make();
= note: expected trait object `dyn Foo<Bar = &'a u32>` = note: expected trait object `dyn Foo<Bar = &'a u32>`
found trait object `dyn Foo<Bar = &'static u32>` found trait object `dyn Foo<Bar = &'static u32>`
note: the lifetime `'a` as defined here... note: the lifetime `'a` as defined here...
--> $DIR/variance-associated-types2.rs:12:9 --> $DIR/variance-associated-types2.rs:16:9
| |
LL | fn take<'a>(_: &'a u32) { LL | fn take<'a>(_: &'a u32) {
| ^^ | ^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-associated-types2.rs:13:12 --> $DIR/variance-associated-types2.rs:17:12
| |
LL | fn take<'a>(_: &'a u32) { LL | fn take<'a>(_: &'a u32) {
| -- lifetime `'a` defined here | -- lifetime `'a` defined here

View File

@ -1,6 +1,10 @@
// Test that dyn Foo<Bar = T> is invariant with respect to T. // Test that dyn Foo<Bar = T> is invariant with respect to T.
// Failure to enforce invariance here can be weaponized, see #71550 for details. // Failure to enforce invariance here can be weaponized, see #71550 for details.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Foo { trait Foo {
type Bar; type Bar;
} }
@ -11,7 +15,8 @@ fn make() -> Box<dyn Foo<Bar = &'static u32>> {
fn take<'a>(_: &'a u32) { fn take<'a>(_: &'a u32) {
let _: Box<dyn Foo<Bar = &'a u32>> = make(); let _: Box<dyn Foo<Bar = &'a u32>> = make();
//~^ ERROR mismatched types [E0308] //[base]~^ ERROR mismatched types [E0308]
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn main() {} fn main() {}

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:4:5 --> $DIR/variance-btree-invariant-types.rs:8:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -7,164 +7,164 @@ LL | v
= note: expected struct `std::collections::btree_map::IterMut<'_, &'new (), _>` = note: expected struct `std::collections::btree_map::IterMut<'_, &'new (), _>`
found struct `std::collections::btree_map::IterMut<'_, &'static (), _>` found struct `std::collections::btree_map::IterMut<'_, &'static (), _>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:3:21 --> $DIR/variance-btree-invariant-types.rs:7:21
| |
LL | fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> { LL | fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> {
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:7:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `std::collections::btree_map::IterMut<'_, _, &'new ()>`
found struct `std::collections::btree_map::IterMut<'_, _, &'static ()>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:6:21
|
LL | fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> {
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:10:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `std::collections::btree_map::IterMut<'_, &'static (), _>`
found struct `std::collections::btree_map::IterMut<'_, &'new (), _>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:9:24
|
LL | fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> {
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:13:5 --> $DIR/variance-btree-invariant-types.rs:13:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
| |
= note: expected struct `std::collections::btree_map::IterMut<'_, _, &'static ()>` = note: expected struct `std::collections::btree_map::IterMut<'_, _, &'new ()>`
found struct `std::collections::btree_map::IterMut<'_, _, &'new ()>` found struct `std::collections::btree_map::IterMut<'_, _, &'static ()>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:12:24 --> $DIR/variance-btree-invariant-types.rs:12:21
| |
LL | fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> { LL | fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> {
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:18:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `std::collections::btree_map::IterMut<'_, &'static (), _>`
found struct `std::collections::btree_map::IterMut<'_, &'new (), _>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:17:24
|
LL | fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> {
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:17:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `RangeMut<'_, &'new (), _>`
found struct `RangeMut<'_, &'static (), _>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:16:22
|
LL | fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> {
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:20:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `RangeMut<'_, _, &'new ()>`
found struct `RangeMut<'_, _, &'static ()>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:19:22
|
LL | fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> {
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:23:5 --> $DIR/variance-btree-invariant-types.rs:23:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
| |
= note: expected struct `RangeMut<'_, &'static (), _>` = note: expected struct `std::collections::btree_map::IterMut<'_, _, &'static ()>`
found struct `RangeMut<'_, &'new (), _>` found struct `std::collections::btree_map::IterMut<'_, _, &'new ()>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:22:25 --> $DIR/variance-btree-invariant-types.rs:22:24
| |
LL | fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> { LL | fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> {
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:26:5 --> $DIR/variance-btree-invariant-types.rs:29:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
| |
= note: expected struct `RangeMut<'_, _, &'static ()>` = note: expected struct `RangeMut<'_, &'new (), _>`
found struct `RangeMut<'_, _, &'new ()>` found struct `RangeMut<'_, &'static (), _>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:25:25 --> $DIR/variance-btree-invariant-types.rs:28:22
| |
LL | fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> { LL | fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> {
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:31:5 --> $DIR/variance-btree-invariant-types.rs:34:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
| |
= note: expected struct `std::collections::btree_map::OccupiedEntry<'_, &'new (), _>` = note: expected struct `RangeMut<'_, _, &'new ()>`
found struct `std::collections::btree_map::OccupiedEntry<'_, &'static (), _>` found struct `RangeMut<'_, _, &'static ()>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:29:20 --> $DIR/variance-btree-invariant-types.rs:33:22
| |
LL | fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>) LL | fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> {
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:35:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `std::collections::btree_map::OccupiedEntry<'_, _, &'new ()>`
found struct `std::collections::btree_map::OccupiedEntry<'_, _, &'static ()>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:33:20
|
LL | fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>)
| ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:39:5 --> $DIR/variance-btree-invariant-types.rs:39:5
| |
LL | v
| ^ lifetime mismatch
|
= note: expected struct `RangeMut<'_, &'static (), _>`
found struct `RangeMut<'_, &'new (), _>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:38:25
|
LL | fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> {
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:44:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `RangeMut<'_, _, &'static ()>`
found struct `RangeMut<'_, _, &'new ()>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:43:25
|
LL | fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> {
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:51:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `std::collections::btree_map::OccupiedEntry<'_, &'new (), _>`
found struct `std::collections::btree_map::OccupiedEntry<'_, &'static (), _>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:49:20
|
LL | fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>)
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:57:5
|
LL | v
| ^ lifetime mismatch
|
= note: expected struct `std::collections::btree_map::OccupiedEntry<'_, _, &'new ()>`
found struct `std::collections::btree_map::OccupiedEntry<'_, _, &'static ()>`
note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:55:20
|
LL | fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>)
| ^^^^
= note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:63:5
|
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
| |
= note: expected struct `std::collections::btree_map::OccupiedEntry<'_, &'static (), _>` = note: expected struct `std::collections::btree_map::OccupiedEntry<'_, &'static (), _>`
found struct `std::collections::btree_map::OccupiedEntry<'_, &'new (), _>` found struct `std::collections::btree_map::OccupiedEntry<'_, &'new (), _>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:37:23 --> $DIR/variance-btree-invariant-types.rs:61:23
| |
LL | fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>) LL | fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>)
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:43:5 --> $DIR/variance-btree-invariant-types.rs:69:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -172,14 +172,14 @@ LL | v
= note: expected struct `std::collections::btree_map::OccupiedEntry<'_, _, &'static ()>` = note: expected struct `std::collections::btree_map::OccupiedEntry<'_, _, &'static ()>`
found struct `std::collections::btree_map::OccupiedEntry<'_, _, &'new ()>` found struct `std::collections::btree_map::OccupiedEntry<'_, _, &'new ()>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:41:23 --> $DIR/variance-btree-invariant-types.rs:67:23
| |
LL | fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>) LL | fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>)
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:48:5 --> $DIR/variance-btree-invariant-types.rs:76:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -187,14 +187,14 @@ LL | v
= note: expected struct `std::collections::btree_map::VacantEntry<'_, &'new (), _>` = note: expected struct `std::collections::btree_map::VacantEntry<'_, &'new (), _>`
found struct `std::collections::btree_map::VacantEntry<'_, &'static (), _>` found struct `std::collections::btree_map::VacantEntry<'_, &'static (), _>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:46:20 --> $DIR/variance-btree-invariant-types.rs:74:20
| |
LL | fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>) LL | fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>)
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:52:5 --> $DIR/variance-btree-invariant-types.rs:82:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -202,14 +202,14 @@ LL | v
= note: expected struct `std::collections::btree_map::VacantEntry<'_, _, &'new ()>` = note: expected struct `std::collections::btree_map::VacantEntry<'_, _, &'new ()>`
found struct `std::collections::btree_map::VacantEntry<'_, _, &'static ()>` found struct `std::collections::btree_map::VacantEntry<'_, _, &'static ()>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:50:20 --> $DIR/variance-btree-invariant-types.rs:80:20
| |
LL | fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>) LL | fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>)
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:56:5 --> $DIR/variance-btree-invariant-types.rs:88:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -217,14 +217,14 @@ LL | v
= note: expected struct `std::collections::btree_map::VacantEntry<'_, &'static (), _>` = note: expected struct `std::collections::btree_map::VacantEntry<'_, &'static (), _>`
found struct `std::collections::btree_map::VacantEntry<'_, &'new (), _>` found struct `std::collections::btree_map::VacantEntry<'_, &'new (), _>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:54:23 --> $DIR/variance-btree-invariant-types.rs:86:23
| |
LL | fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>) LL | fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>)
| ^^^^ | ^^^^
= note: ...does not necessarily outlive the static lifetime = note: ...does not necessarily outlive the static lifetime
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-btree-invariant-types.rs:60:5 --> $DIR/variance-btree-invariant-types.rs:94:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -232,7 +232,7 @@ LL | v
= note: expected struct `std::collections::btree_map::VacantEntry<'_, _, &'static ()>` = note: expected struct `std::collections::btree_map::VacantEntry<'_, _, &'static ()>`
found struct `std::collections::btree_map::VacantEntry<'_, _, &'new ()>` found struct `std::collections::btree_map::VacantEntry<'_, _, &'new ()>`
note: the lifetime `'new` as defined here... note: the lifetime `'new` as defined here...
--> $DIR/variance-btree-invariant-types.rs:58:23 --> $DIR/variance-btree-invariant-types.rs:92:23
| |
LL | fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>) LL | fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>)
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:4:5 --> $DIR/variance-btree-invariant-types.rs:8:5
| |
LL | fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> { LL | fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -11,7 +11,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:7:5 --> $DIR/variance-btree-invariant-types.rs:13:5
| |
LL | fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> { LL | fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -23,7 +23,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:10:5 --> $DIR/variance-btree-invariant-types.rs:18:5
| |
LL | fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> { LL | fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -35,7 +35,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:13:5 --> $DIR/variance-btree-invariant-types.rs:23:5
| |
LL | fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> { LL | fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -47,7 +47,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:17:5 --> $DIR/variance-btree-invariant-types.rs:29:5
| |
LL | fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> { LL | fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -59,7 +59,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:20:5 --> $DIR/variance-btree-invariant-types.rs:34:5
| |
LL | fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> { LL | fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -71,7 +71,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:23:5 --> $DIR/variance-btree-invariant-types.rs:39:5
| |
LL | fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> { LL | fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -83,7 +83,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:26:5 --> $DIR/variance-btree-invariant-types.rs:44:5
| |
LL | fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> { LL | fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> {
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -95,7 +95,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:31:5 --> $DIR/variance-btree-invariant-types.rs:51:5
| |
LL | fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>) LL | fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -108,7 +108,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:35:5 --> $DIR/variance-btree-invariant-types.rs:57:5
| |
LL | fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>) LL | fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -121,7 +121,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:39:5 --> $DIR/variance-btree-invariant-types.rs:63:5
| |
LL | fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>) LL | fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -134,7 +134,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:43:5 --> $DIR/variance-btree-invariant-types.rs:69:5
| |
LL | fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>) LL | fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -147,7 +147,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:48:5 --> $DIR/variance-btree-invariant-types.rs:76:5
| |
LL | fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>) LL | fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -160,7 +160,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:52:5 --> $DIR/variance-btree-invariant-types.rs:82:5
| |
LL | fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>) LL | fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -173,7 +173,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:56:5 --> $DIR/variance-btree-invariant-types.rs:88:5
| |
LL | fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>) LL | fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here
@ -186,7 +186,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-btree-invariant-types.rs:60:5 --> $DIR/variance-btree-invariant-types.rs:94:5
| |
LL | fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>) LL | fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>)
| ---- lifetime `'new` defined here | ---- lifetime `'new` defined here

View File

@ -1,63 +1,99 @@
use std::collections::btree_map::{IterMut, OccupiedEntry, RangeMut, VacantEntry}; use std::collections::btree_map::{IterMut, OccupiedEntry, RangeMut, VacantEntry};
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> { fn iter_cov_key<'a, 'new>(v: IterMut<'a, &'static (), ()>) -> IterMut<'a, &'new (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> { fn iter_cov_val<'a, 'new>(v: IterMut<'a, (), &'static ()>) -> IterMut<'a, (), &'new ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> { fn iter_contra_key<'a, 'new>(v: IterMut<'a, &'new (), ()>) -> IterMut<'a, &'static (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> { fn iter_contra_val<'a, 'new>(v: IterMut<'a, (), &'new ()>) -> IterMut<'a, (), &'static ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> { fn range_cov_key<'a, 'new>(v: RangeMut<'a, &'static (), ()>) -> RangeMut<'a, &'new (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> { fn range_cov_val<'a, 'new>(v: RangeMut<'a, (), &'static ()>) -> RangeMut<'a, (), &'new ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> { fn range_contra_key<'a, 'new>(v: RangeMut<'a, &'new (), ()>) -> RangeMut<'a, &'static (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> { fn range_contra_val<'a, 'new>(v: RangeMut<'a, (), &'new ()>) -> RangeMut<'a, (), &'static ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>) fn occ_cov_key<'a, 'new>(v: OccupiedEntry<'a, &'static (), ()>)
-> OccupiedEntry<'a, &'new (), ()> { -> OccupiedEntry<'a, &'new (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>) fn occ_cov_val<'a, 'new>(v: OccupiedEntry<'a, (), &'static ()>)
-> OccupiedEntry<'a, (), &'new ()> { -> OccupiedEntry<'a, (), &'new ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>) fn occ_contra_key<'a, 'new>(v: OccupiedEntry<'a, &'new (), ()>)
-> OccupiedEntry<'a, &'static (), ()> { -> OccupiedEntry<'a, &'static (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>) fn occ_contra_val<'a, 'new>(v: OccupiedEntry<'a, (), &'new ()>)
-> OccupiedEntry<'a, (), &'static ()> { -> OccupiedEntry<'a, (), &'static ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>) fn vac_cov_key<'a, 'new>(v: VacantEntry<'a, &'static (), ()>)
-> VacantEntry<'a, &'new (), ()> { -> VacantEntry<'a, &'new (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>) fn vac_cov_val<'a, 'new>(v: VacantEntry<'a, (), &'static ()>)
-> VacantEntry<'a, (), &'new ()> { -> VacantEntry<'a, (), &'new ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>) fn vac_contra_key<'a, 'new>(v: VacantEntry<'a, &'new (), ()>)
-> VacantEntry<'a, &'static (), ()> { -> VacantEntry<'a, &'static (), ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }
fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>) fn vac_contra_val<'a, 'new>(v: VacantEntry<'a, (), &'new ()>)
-> VacantEntry<'a, (), &'static ()> { -> VacantEntry<'a, (), &'static ()> {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ lifetime may not live long enough
} }

View File

@ -1,5 +1,5 @@
error[E0623]: lifetime mismatch error[E0623]: lifetime mismatch
--> $DIR/variance-cell-is-invariant.rs:14:25 --> $DIR/variance-cell-is-invariant.rs:18:25
| |
LL | fn use_<'short,'long>(c: Foo<'short>, LL | fn use_<'short,'long>(c: Foo<'short>,
| ----------- these two types are declared with different lifetimes... | ----------- these two types are declared with different lifetimes...

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-cell-is-invariant.rs:14:12 --> $DIR/variance-cell-is-invariant.rs:18:12
| |
LL | fn use_<'short,'long>(c: Foo<'short>, LL | fn use_<'short,'long>(c: Foo<'short>,
| ------ ----- lifetime `'long` defined here | ------ ----- lifetime `'long` defined here

View File

@ -1,6 +1,10 @@
// Test that Cell is considered invariant with respect to its // Test that Cell is considered invariant with respect to its
// type. // type.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
use std::cell::Cell; use std::cell::Cell;
struct Foo<'a> { struct Foo<'a> {
@ -11,7 +15,9 @@ fn use_<'short,'long>(c: Foo<'short>,
s: &'short isize, s: &'short isize,
l: &'long isize, l: &'long isize,
_where:Option<&'short &'long ()>) { _where:Option<&'short &'long ()>) {
let _: Foo<'long> = c; //~ ERROR E0623 let _: Foo<'long> = c;
//[base]~^ ERROR E0623
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn main() { fn main() {

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-contravariant-arg-object.rs:14:5 --> $DIR/variance-contravariant-arg-object.rs:18:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -7,18 +7,18 @@ LL | v
= note: expected trait object `dyn Get<&'min i32>` = note: expected trait object `dyn Get<&'min i32>`
found trait object `dyn Get<&'max i32>` found trait object `dyn Get<&'max i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-contravariant-arg-object.rs:10:21 --> $DIR/variance-contravariant-arg-object.rs:14:21
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-contravariant-arg-object.rs:10:27 --> $DIR/variance-contravariant-arg-object.rs:14:27
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-contravariant-arg-object.rs:22:5 --> $DIR/variance-contravariant-arg-object.rs:28:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -26,12 +26,12 @@ LL | v
= note: expected trait object `dyn Get<&'max i32>` = note: expected trait object `dyn Get<&'max i32>`
found trait object `dyn Get<&'min i32>` found trait object `dyn Get<&'min i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-contravariant-arg-object.rs:17:21 --> $DIR/variance-contravariant-arg-object.rs:23:21
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-contravariant-arg-object.rs:17:27 --> $DIR/variance-contravariant-arg-object.rs:23:27
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-contravariant-arg-object.rs:14:5 --> $DIR/variance-contravariant-arg-object.rs:18:5
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | v
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-contravariant-arg-object.rs:22:5 --> $DIR/variance-contravariant-arg-object.rs:28:5
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -3,6 +3,10 @@
// Test that even when `T` is only used in contravariant position, it // Test that even when `T` is only used in contravariant position, it
// is treated as invariant. // is treated as invariant.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get<T> : 'static { trait Get<T> : 'static {
fn get(&self, t: T); fn get(&self, t: T);
} }
@ -11,7 +15,9 @@ fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
-> Box<dyn Get<&'min i32>> -> Box<dyn Get<&'min i32>>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
@ -19,7 +25,9 @@ fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
where 'max : 'min where 'max : 'min
{ {
// Previously OK: // Previously OK:
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn main() { } fn main() { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-contravariant-arg-trait-match.rs:13:5 --> $DIR/variance-contravariant-arg-trait-match.rs:17:5
| |
LL | impls_get::<G,&'min i32>() LL | impls_get::<G,&'min i32>()
| ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -7,18 +7,18 @@ LL | impls_get::<G,&'min i32>()
= note: expected type `Get<&'min i32>` = note: expected type `Get<&'min i32>`
found type `Get<&'max i32>` found type `Get<&'max i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-contravariant-arg-trait-match.rs:10:21 --> $DIR/variance-contravariant-arg-trait-match.rs:14:21
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-contravariant-arg-trait-match.rs:10:27 --> $DIR/variance-contravariant-arg-trait-match.rs:14:27
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-contravariant-arg-trait-match.rs:21:5 --> $DIR/variance-contravariant-arg-trait-match.rs:27:5
| |
LL | impls_get::<G,&'max i32>() LL | impls_get::<G,&'max i32>()
| ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -26,12 +26,12 @@ LL | impls_get::<G,&'max i32>()
= note: expected type `Get<&'max i32>` = note: expected type `Get<&'max i32>`
found type `Get<&'min i32>` found type `Get<&'min i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-contravariant-arg-trait-match.rs:16:21 --> $DIR/variance-contravariant-arg-trait-match.rs:22:21
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-contravariant-arg-trait-match.rs:16:27 --> $DIR/variance-contravariant-arg-trait-match.rs:22:27
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-contravariant-arg-trait-match.rs:13:5 --> $DIR/variance-contravariant-arg-trait-match.rs:17:5
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | impls_get::<G,&'min i32>()
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-contravariant-arg-trait-match.rs:21:5 --> $DIR/variance-contravariant-arg-trait-match.rs:27:5
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -3,6 +3,10 @@
// Test that even when `T` is only used in contravariant position, it // Test that even when `T` is only used in contravariant position, it
// is treated as invariant. // is treated as invariant.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get<T> { trait Get<T> {
fn get(&self, t: T); fn get(&self, t: T);
} }
@ -10,7 +14,9 @@ trait Get<T> {
fn get_min_from_max<'min, 'max, G>() fn get_min_from_max<'min, 'max, G>()
where 'max : 'min, G : Get<&'max i32> where 'max : 'min, G : Get<&'max i32>
{ {
impls_get::<G,&'min i32>() //~ ERROR mismatched types impls_get::<G,&'min i32>()
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>() fn get_max_from_min<'min, 'max, G>()
@ -18,7 +24,9 @@ fn get_max_from_min<'min, 'max, G>()
{ {
// Previously OK, but now an error because traits are invariant: // Previously OK, but now an error because traits are invariant:
impls_get::<G,&'max i32>() //~ ERROR mismatched types impls_get::<G,&'max i32>()
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn impls_get<G,T>() where G : Get<T> { } fn impls_get<G,T>() where G : Get<T> { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-contravariant-self-trait-match.rs:13:5 --> $DIR/variance-contravariant-self-trait-match.rs:17:5
| |
LL | impls_get::<&'min G>(); LL | impls_get::<&'min G>();
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -7,18 +7,18 @@ LL | impls_get::<&'min G>();
= note: expected type `<&'min G as Get>` = note: expected type `<&'min G as Get>`
found type `<&'max G as Get>` found type `<&'max G as Get>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-contravariant-self-trait-match.rs:10:21 --> $DIR/variance-contravariant-self-trait-match.rs:14:21
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-contravariant-self-trait-match.rs:10:27 --> $DIR/variance-contravariant-self-trait-match.rs:14:27
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-contravariant-self-trait-match.rs:22:5 --> $DIR/variance-contravariant-self-trait-match.rs:28:5
| |
LL | impls_get::<&'max G>(); LL | impls_get::<&'max G>();
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -26,12 +26,12 @@ LL | impls_get::<&'max G>();
= note: expected type `<&'max G as Get>` = note: expected type `<&'max G as Get>`
found type `<&'min G as Get>` found type `<&'min G as Get>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-contravariant-self-trait-match.rs:16:21 --> $DIR/variance-contravariant-self-trait-match.rs:22:21
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-contravariant-self-trait-match.rs:16:27 --> $DIR/variance-contravariant-self-trait-match.rs:22:27
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-contravariant-self-trait-match.rs:13:5 --> $DIR/variance-contravariant-self-trait-match.rs:17:5
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | impls_get::<&'min G>();
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-contravariant-self-trait-match.rs:22:5 --> $DIR/variance-contravariant-self-trait-match.rs:28:5
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -3,6 +3,10 @@
// Test that even when `Self` is only used in contravariant position, it // Test that even when `Self` is only used in contravariant position, it
// is treated as invariant. // is treated as invariant.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get { trait Get {
fn get(&self); fn get(&self);
} }
@ -10,7 +14,9 @@ trait Get {
fn get_min_from_max<'min, 'max, G>() fn get_min_from_max<'min, 'max, G>()
where 'max : 'min, G : 'max, &'max G : Get where 'max : 'min, G : 'max, &'max G : Get
{ {
impls_get::<&'min G>(); //~ ERROR mismatched types impls_get::<&'min G>();
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>() fn get_max_from_min<'min, 'max, G>()
@ -19,7 +25,9 @@ fn get_max_from_min<'min, 'max, G>()
// Previously OK, but now error because traits are invariant with // Previously OK, but now error because traits are invariant with
// respect to all inputs. // respect to all inputs.
impls_get::<&'max G>(); //~ ERROR mismatched types impls_get::<&'max G>();
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn impls_get<G>() where G : Get { } fn impls_get<G>() where G : Get { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-invariant-arg-object.rs:11:5 --> $DIR/variance-covariant-arg-object.rs:19:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -7,18 +7,18 @@ LL | v
= note: expected trait object `dyn Get<&'min i32>` = note: expected trait object `dyn Get<&'min i32>`
found trait object `dyn Get<&'max i32>` found trait object `dyn Get<&'max i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-invariant-arg-object.rs:7:21 --> $DIR/variance-covariant-arg-object.rs:14:21
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-invariant-arg-object.rs:7:27 --> $DIR/variance-covariant-arg-object.rs:14:27
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-invariant-arg-object.rs:18:5 --> $DIR/variance-covariant-arg-object.rs:28:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -26,12 +26,12 @@ LL | v
= note: expected trait object `dyn Get<&'max i32>` = note: expected trait object `dyn Get<&'max i32>`
found trait object `dyn Get<&'min i32>` found trait object `dyn Get<&'min i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-invariant-arg-object.rs:14:21 --> $DIR/variance-covariant-arg-object.rs:24:21
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-invariant-arg-object.rs:14:27 --> $DIR/variance-covariant-arg-object.rs:24:27
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-covariant-arg-object.rs:15:5 --> $DIR/variance-covariant-arg-object.rs:19:5
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | v
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-covariant-arg-object.rs:22:5 --> $DIR/variance-covariant-arg-object.rs:28:5
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -3,6 +3,10 @@
// Test that even when `T` is only used in covariant position, it // Test that even when `T` is only used in covariant position, it
// is treated as invariant. // is treated as invariant.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get<T> : 'static { trait Get<T> : 'static {
fn get(&self) -> T; fn get(&self) -> T;
} }
@ -12,14 +16,18 @@ fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
where 'max : 'min where 'max : 'min
{ {
// Previously OK, now an error as traits are invariant. // Previously OK, now an error as traits are invariant.
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
-> Box<dyn Get<&'max i32>> -> Box<dyn Get<&'max i32>>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn main() { } fn main() { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-invariant-arg-trait-match.rs:10:5 --> $DIR/variance-covariant-arg-trait-match.rs:18:5
| |
LL | impls_get::<G,&'min i32>() LL | impls_get::<G,&'min i32>()
| ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -7,18 +7,18 @@ LL | impls_get::<G,&'min i32>()
= note: expected type `Get<&'min i32>` = note: expected type `Get<&'min i32>`
found type `Get<&'max i32>` found type `Get<&'max i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-invariant-arg-trait-match.rs:7:21 --> $DIR/variance-covariant-arg-trait-match.rs:14:21
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-invariant-arg-trait-match.rs:7:27 --> $DIR/variance-covariant-arg-trait-match.rs:14:27
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-invariant-arg-trait-match.rs:16:5 --> $DIR/variance-covariant-arg-trait-match.rs:26:5
| |
LL | impls_get::<G,&'max i32>() LL | impls_get::<G,&'max i32>()
| ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -26,12 +26,12 @@ LL | impls_get::<G,&'max i32>()
= note: expected type `Get<&'max i32>` = note: expected type `Get<&'max i32>`
found type `Get<&'min i32>` found type `Get<&'min i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-invariant-arg-trait-match.rs:13:21 --> $DIR/variance-covariant-arg-trait-match.rs:23:21
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-invariant-arg-trait-match.rs:13:27 --> $DIR/variance-covariant-arg-trait-match.rs:23:27
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-covariant-arg-trait-match.rs:14:5 --> $DIR/variance-covariant-arg-trait-match.rs:18:5
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | impls_get::<G,&'min i32>()
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-covariant-arg-trait-match.rs:20:5 --> $DIR/variance-covariant-arg-trait-match.rs:26:5
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -3,6 +3,10 @@
// Test that even when `T` is only used in covariant position, it // Test that even when `T` is only used in covariant position, it
// is treated as invariant. // is treated as invariant.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get<T> { trait Get<T> {
fn get(&self) -> T; fn get(&self) -> T;
} }
@ -11,13 +15,17 @@ fn get_min_from_max<'min, 'max, G>()
where 'max : 'min, G : Get<&'max i32> where 'max : 'min, G : Get<&'max i32>
{ {
// Previously OK, now an error as traits are invariant. // Previously OK, now an error as traits are invariant.
impls_get::<G,&'min i32>() //~ ERROR mismatched types impls_get::<G,&'min i32>()
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>() fn get_max_from_min<'min, 'max, G>()
where 'max : 'min, G : Get<&'min i32> where 'max : 'min, G : Get<&'min i32>
{ {
impls_get::<G,&'max i32>() //~ ERROR mismatched types impls_get::<G,&'max i32>()
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn impls_get<G,T>() where G : Get<T> { } fn impls_get<G,T>() where G : Get<T> { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-invariant-self-trait-match.rs:10:5 --> $DIR/variance-covariant-self-trait-match.rs:18:5
| |
LL | impls_get::<&'min G>(); LL | impls_get::<&'min G>();
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -7,18 +7,18 @@ LL | impls_get::<&'min G>();
= note: expected type `<&'min G as Get>` = note: expected type `<&'min G as Get>`
found type `<&'max G as Get>` found type `<&'max G as Get>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-invariant-self-trait-match.rs:7:21 --> $DIR/variance-covariant-self-trait-match.rs:14:21
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-invariant-self-trait-match.rs:7:27 --> $DIR/variance-covariant-self-trait-match.rs:14:27
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-invariant-self-trait-match.rs:16:5 --> $DIR/variance-covariant-self-trait-match.rs:26:5
| |
LL | impls_get::<&'max G>(); LL | impls_get::<&'max G>();
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -26,12 +26,12 @@ LL | impls_get::<&'max G>();
= note: expected type `<&'max G as Get>` = note: expected type `<&'max G as Get>`
found type `<&'min G as Get>` found type `<&'min G as Get>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-invariant-self-trait-match.rs:13:21 --> $DIR/variance-covariant-self-trait-match.rs:23:21
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-invariant-self-trait-match.rs:13:27 --> $DIR/variance-covariant-self-trait-match.rs:23:27
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-covariant-self-trait-match.rs:14:5 --> $DIR/variance-covariant-self-trait-match.rs:18:5
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | impls_get::<&'min G>();
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-covariant-self-trait-match.rs:20:5 --> $DIR/variance-covariant-self-trait-match.rs:26:5
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -3,6 +3,10 @@
// Test that even when `Self` is only used in covariant position, it // Test that even when `Self` is only used in covariant position, it
// is treated as invariant. // is treated as invariant.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get { trait Get {
fn get() -> Self; fn get() -> Self;
} }
@ -11,13 +15,17 @@ fn get_min_from_max<'min, 'max, G>()
where 'max : 'min, G : 'max, &'max G : Get where 'max : 'min, G : 'max, &'max G : Get
{ {
// Previously OK, now an error as traits are invariant. // Previously OK, now an error as traits are invariant.
impls_get::<&'min G>(); //~ ERROR mismatched types impls_get::<&'min G>();
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>() fn get_max_from_min<'min, 'max, G>()
where 'max : 'min, G : 'max, &'min G : Get where 'max : 'min, G : 'max, &'min G : Get
{ {
impls_get::<&'max G>(); //~ ERROR mismatched types impls_get::<&'max G>();
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn impls_get<G>() where G : Get { } fn impls_get<G>() where G : Get { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-covariant-arg-object.rs:15:5 --> $DIR/variance-invariant-arg-object.rs:15:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -7,18 +7,18 @@ LL | v
= note: expected trait object `dyn Get<&'min i32>` = note: expected trait object `dyn Get<&'min i32>`
found trait object `dyn Get<&'max i32>` found trait object `dyn Get<&'max i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-covariant-arg-object.rs:10:21 --> $DIR/variance-invariant-arg-object.rs:11:21
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-covariant-arg-object.rs:10:27 --> $DIR/variance-invariant-arg-object.rs:11:27
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-covariant-arg-object.rs:22:5 --> $DIR/variance-invariant-arg-object.rs:24:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -26,12 +26,12 @@ LL | v
= note: expected trait object `dyn Get<&'max i32>` = note: expected trait object `dyn Get<&'max i32>`
found trait object `dyn Get<&'min i32>` found trait object `dyn Get<&'min i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-covariant-arg-object.rs:18:21 --> $DIR/variance-invariant-arg-object.rs:20:21
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-covariant-arg-object.rs:18:27 --> $DIR/variance-invariant-arg-object.rs:20:27
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-invariant-arg-object.rs:11:5 --> $DIR/variance-invariant-arg-object.rs:15:5
| |
LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>) LL | fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | v
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-invariant-arg-object.rs:18:5 --> $DIR/variance-invariant-arg-object.rs:24:5
| |
LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) LL | fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -1,5 +1,9 @@
#![allow(dead_code)] #![allow(dead_code)]
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get<T> : 'static { trait Get<T> : 'static {
fn get(&self, t: T) -> T; fn get(&self, t: T) -> T;
} }
@ -8,14 +12,18 @@ fn get_min_from_max<'min, 'max>(v: Box<dyn Get<&'max i32>>)
-> Box<dyn Get<&'min i32>> -> Box<dyn Get<&'min i32>>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>) fn get_max_from_min<'min, 'max, G>(v: Box<dyn Get<&'min i32>>)
-> Box<dyn Get<&'max i32>> -> Box<dyn Get<&'max i32>>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn main() { } fn main() { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-covariant-arg-trait-match.rs:14:5 --> $DIR/variance-invariant-arg-trait-match.rs:14:5
| |
LL | impls_get::<G,&'min i32>() LL | impls_get::<G,&'min i32>()
| ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -7,18 +7,18 @@ LL | impls_get::<G,&'min i32>()
= note: expected type `Get<&'min i32>` = note: expected type `Get<&'min i32>`
found type `Get<&'max i32>` found type `Get<&'max i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-covariant-arg-trait-match.rs:10:21 --> $DIR/variance-invariant-arg-trait-match.rs:11:21
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-covariant-arg-trait-match.rs:10:27 --> $DIR/variance-invariant-arg-trait-match.rs:11:27
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-covariant-arg-trait-match.rs:20:5 --> $DIR/variance-invariant-arg-trait-match.rs:22:5
| |
LL | impls_get::<G,&'max i32>() LL | impls_get::<G,&'max i32>()
| ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -26,12 +26,12 @@ LL | impls_get::<G,&'max i32>()
= note: expected type `Get<&'max i32>` = note: expected type `Get<&'max i32>`
found type `Get<&'min i32>` found type `Get<&'min i32>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-covariant-arg-trait-match.rs:17:21 --> $DIR/variance-invariant-arg-trait-match.rs:19:21
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-covariant-arg-trait-match.rs:17:27 --> $DIR/variance-invariant-arg-trait-match.rs:19:27
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-invariant-arg-trait-match.rs:10:5 --> $DIR/variance-invariant-arg-trait-match.rs:14:5
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | impls_get::<G,&'min i32>()
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-invariant-arg-trait-match.rs:16:5 --> $DIR/variance-invariant-arg-trait-match.rs:22:5
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -1,5 +1,9 @@
#![allow(dead_code)] #![allow(dead_code)]
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get<T> { trait Get<T> {
fn get(&self, t: T) -> T; fn get(&self, t: T) -> T;
} }
@ -7,13 +11,17 @@ trait Get<T> {
fn get_min_from_max<'min, 'max, G>() fn get_min_from_max<'min, 'max, G>()
where 'max : 'min, G : Get<&'max i32> where 'max : 'min, G : Get<&'max i32>
{ {
impls_get::<G,&'min i32>() //~ ERROR mismatched types impls_get::<G,&'min i32>()
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>() fn get_max_from_min<'min, 'max, G>()
where 'max : 'min, G : Get<&'min i32> where 'max : 'min, G : Get<&'min i32>
{ {
impls_get::<G,&'max i32>() //~ ERROR mismatched types impls_get::<G,&'max i32>()
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn impls_get<G,T>() where G : Get<T> { } fn impls_get<G,T>() where G : Get<T> { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-covariant-self-trait-match.rs:14:5 --> $DIR/variance-invariant-self-trait-match.rs:14:5
| |
LL | impls_get::<&'min G>(); LL | impls_get::<&'min G>();
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -7,18 +7,18 @@ LL | impls_get::<&'min G>();
= note: expected type `<&'min G as Get>` = note: expected type `<&'min G as Get>`
found type `<&'max G as Get>` found type `<&'max G as Get>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-covariant-self-trait-match.rs:10:21 --> $DIR/variance-invariant-self-trait-match.rs:11:21
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-covariant-self-trait-match.rs:10:27 --> $DIR/variance-invariant-self-trait-match.rs:11:27
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-covariant-self-trait-match.rs:20:5 --> $DIR/variance-invariant-self-trait-match.rs:22:5
| |
LL | impls_get::<&'max G>(); LL | impls_get::<&'max G>();
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
@ -26,12 +26,12 @@ LL | impls_get::<&'max G>();
= note: expected type `<&'max G as Get>` = note: expected type `<&'max G as Get>`
found type `<&'min G as Get>` found type `<&'min G as Get>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-covariant-self-trait-match.rs:17:21 --> $DIR/variance-invariant-self-trait-match.rs:19:21
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-covariant-self-trait-match.rs:17:27 --> $DIR/variance-invariant-self-trait-match.rs:19:27
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-invariant-self-trait-match.rs:10:5 --> $DIR/variance-invariant-self-trait-match.rs:14:5
| |
LL | fn get_min_from_max<'min, 'max, G>() LL | fn get_min_from_max<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -12,7 +12,7 @@ LL | impls_get::<&'min G>();
= help: consider adding the following bound: `'min: 'max` = help: consider adding the following bound: `'min: 'max`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-invariant-self-trait-match.rs:16:5 --> $DIR/variance-invariant-self-trait-match.rs:22:5
| |
LL | fn get_max_from_min<'min, 'max, G>() LL | fn get_max_from_min<'min, 'max, G>()
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -1,5 +1,9 @@
#![allow(dead_code)] #![allow(dead_code)]
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Get { trait Get {
fn get(&self) -> Self; fn get(&self) -> Self;
} }
@ -7,13 +11,17 @@ trait Get {
fn get_min_from_max<'min, 'max, G>() fn get_min_from_max<'min, 'max, G>()
where 'max : 'min, &'max G : Get, G : 'max where 'max : 'min, &'max G : Get, G : 'max
{ {
impls_get::<&'min G>(); //~ ERROR mismatched types impls_get::<&'min G>();
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn get_max_from_min<'min, 'max, G>() fn get_max_from_min<'min, 'max, G>()
where 'max : 'min, &'min G : Get, G : 'min where 'max : 'min, &'min G : Get, G : 'min
{ {
impls_get::<&'max G>(); //~ ERROR mismatched types impls_get::<&'max G>();
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn impls_get<G>() where G : Get { } fn impls_get<G>() where G : Get { }

View File

@ -1,5 +1,5 @@
error[E0621]: explicit lifetime required in the type of `get` error[E0621]: explicit lifetime required in the type of `get`
--> $DIR/variance-trait-matching.rs:24:5 --> $DIR/variance-trait-matching.rs:28:5
| |
LL | fn get<'a, G>(get: &G) -> i32 LL | fn get<'a, G>(get: &G) -> i32
| -- help: add explicit lifetime `'a` to the type of `get`: `&'a G` | -- help: add explicit lifetime `'a` to the type of `get`: `&'a G`

View File

@ -1,5 +1,5 @@
error[E0621]: explicit lifetime required in the type of `get` error[E0621]: explicit lifetime required in the type of `get`
--> $DIR/variance-trait-matching.rs:24:5 --> $DIR/variance-trait-matching.rs:28:5
| |
LL | fn get<'a, G>(get: &G) -> i32 LL | fn get<'a, G>(get: &G) -> i32
| -- help: add explicit lifetime `'a` to the type of `get`: `&'a G` | -- help: add explicit lifetime `'a` to the type of `get`: `&'a G`

View File

@ -1,5 +1,9 @@
#![allow(dead_code)] #![allow(dead_code)]
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
// Get<T> is covariant in T // Get<T> is covariant in T
trait Get<T> { trait Get<T> {
fn get(&self) -> T; fn get(&self) -> T;

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-use-contravariant-struct-1.rs:12:5 --> $DIR/variance-use-contravariant-struct-1.rs:14:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -7,12 +7,12 @@ LL | v
= note: expected struct `SomeStruct<&'min ()>` = note: expected struct `SomeStruct<&'min ()>`
found struct `SomeStruct<&'max ()>` found struct `SomeStruct<&'max ()>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-use-contravariant-struct-1.rs:8:8 --> $DIR/variance-use-contravariant-struct-1.rs:10:8
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-use-contravariant-struct-1.rs:8:13 --> $DIR/variance-use-contravariant-struct-1.rs:10:13
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>)
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-use-contravariant-struct-1.rs:12:5 --> $DIR/variance-use-contravariant-struct-1.rs:14:5
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -1,7 +1,9 @@
// Test various uses of structs with distint variances to make sure // Test various uses of structs with distint variances to make sure
// they permit lifetimes to be approximated as expected. // they permit lifetimes to be approximated as expected.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
struct SomeStruct<T>(fn(T)); struct SomeStruct<T>(fn(T));
@ -9,7 +11,9 @@ fn foo<'min,'max>(v: SomeStruct<&'max ()>)
-> SomeStruct<&'min ()> -> SomeStruct<&'min ()>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-use-covariant-struct-1.rs:10:5 --> $DIR/variance-use-covariant-struct-1.rs:14:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -7,12 +7,12 @@ LL | v
= note: expected struct `SomeStruct<&'max ()>` = note: expected struct `SomeStruct<&'max ()>`
found struct `SomeStruct<&'min ()>` found struct `SomeStruct<&'min ()>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-use-covariant-struct-1.rs:6:8 --> $DIR/variance-use-covariant-struct-1.rs:10:8
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-use-covariant-struct-1.rs:6:13 --> $DIR/variance-use-covariant-struct-1.rs:10:13
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>)
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-use-covariant-struct-1.rs:10:5 --> $DIR/variance-use-covariant-struct-1.rs:14:5
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'min ()>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -1,13 +1,19 @@
// Test that a covariant struct does not permit the lifetime of a // Test that a covariant struct does not permit the lifetime of a
// reference to be enlarged. // reference to be enlarged.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
struct SomeStruct<T>(T); struct SomeStruct<T>(T);
fn foo<'min,'max>(v: SomeStruct<&'min ()>) fn foo<'min,'max>(v: SomeStruct<&'min ()>)
-> SomeStruct<&'max ()> -> SomeStruct<&'max ()>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn main() { } fn main() { }

View File

@ -1,5 +1,5 @@
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-use-invariant-struct-1.rs:12:5 --> $DIR/variance-use-invariant-struct-1.rs:14:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -7,18 +7,18 @@ LL | v
= note: expected struct `SomeStruct<&'min ()>` = note: expected struct `SomeStruct<&'min ()>`
found struct `SomeStruct<&'max ()>` found struct `SomeStruct<&'max ()>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-use-invariant-struct-1.rs:8:8 --> $DIR/variance-use-invariant-struct-1.rs:10:8
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-use-invariant-struct-1.rs:8:13 --> $DIR/variance-use-invariant-struct-1.rs:10:13
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>)
| ^^^^ | ^^^^
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/variance-use-invariant-struct-1.rs:19:5 --> $DIR/variance-use-invariant-struct-1.rs:23:5
| |
LL | v LL | v
| ^ lifetime mismatch | ^ lifetime mismatch
@ -26,12 +26,12 @@ LL | v
= note: expected struct `SomeStruct<&'max ()>` = note: expected struct `SomeStruct<&'max ()>`
found struct `SomeStruct<&'min ()>` found struct `SomeStruct<&'min ()>`
note: the lifetime `'min` as defined here... note: the lifetime `'min` as defined here...
--> $DIR/variance-use-invariant-struct-1.rs:15:8 --> $DIR/variance-use-invariant-struct-1.rs:19:8
| |
LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>) LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>)
| ^^^^ | ^^^^
note: ...does not necessarily outlive the lifetime `'max` as defined here note: ...does not necessarily outlive the lifetime `'max` as defined here
--> $DIR/variance-use-invariant-struct-1.rs:15:13 --> $DIR/variance-use-invariant-struct-1.rs:19:13
| |
LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>) LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>)
| ^^^^ | ^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-use-invariant-struct-1.rs:12:5 --> $DIR/variance-use-invariant-struct-1.rs:14:5
| |
LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>) LL | fn foo<'min,'max>(v: SomeStruct<&'max ()>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here
@ -15,7 +15,7 @@ LL | v
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/variance-use-invariant-struct-1.rs:19:5 --> $DIR/variance-use-invariant-struct-1.rs:23:5
| |
LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>) LL | fn bar<'min,'max>(v: SomeStruct<&'min ()>)
| ---- ---- lifetime `'max` defined here | ---- ---- lifetime `'max` defined here

View File

@ -1,7 +1,9 @@
// Test various uses of structs with distint variances to make sure // Test various uses of structs with distint variances to make sure
// they permit lifetimes to be approximated as expected. // they permit lifetimes to be approximated as expected.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
struct SomeStruct<T>(*mut T); struct SomeStruct<T>(*mut T);
@ -9,14 +11,18 @@ fn foo<'min,'max>(v: SomeStruct<&'max ()>)
-> SomeStruct<&'min ()> -> SomeStruct<&'min ()>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn bar<'min,'max>(v: SomeStruct<&'min ()>) fn bar<'min,'max>(v: SomeStruct<&'min ()>)
-> SomeStruct<&'max ()> -> SomeStruct<&'max ()>
where 'max : 'min where 'max : 'min
{ {
v //~ ERROR mismatched types v
//[base]~^ ERROR mismatched types
//[nll]~^^ ERROR lifetime may not live long enough
} }

View File

@ -1,131 +1,131 @@
error[E0312]: lifetime of reference outlives lifetime of borrowed content... error[E0312]: lifetime of reference outlives lifetime of borrowed content...
--> $DIR/wf-static-method.rs:17:9 --> $DIR/wf-static-method.rs:21:9
| |
LL | u LL | u
| ^ | ^
| |
note: ...the reference is valid for the lifetime `'a` as defined here... note: ...the reference is valid for the lifetime `'a` as defined here...
--> $DIR/wf-static-method.rs:14:6 --> $DIR/wf-static-method.rs:18:6
| |
LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () {
| ^^ | ^^
note: ...but the borrowed content is only valid for the lifetime `'b` as defined here note: ...but the borrowed content is only valid for the lifetime `'b` as defined here
--> $DIR/wf-static-method.rs:14:10 --> $DIR/wf-static-method.rs:18:10
| |
LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () {
| ^^ | ^^
error[E0478]: lifetime bound not satisfied error[E0478]: lifetime bound not satisfied
--> $DIR/wf-static-method.rs:26:18 --> $DIR/wf-static-method.rs:32:18
| |
LL | let me = Self::make_me(); LL | let me = Self::make_me();
| ^^^^ | ^^^^
| |
note: lifetime parameter instantiated with the lifetime `'b` as defined here note: lifetime parameter instantiated with the lifetime `'b` as defined here
--> $DIR/wf-static-method.rs:23:10 --> $DIR/wf-static-method.rs:29:10
| |
LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
| ^^ | ^^
note: but lifetime parameter must outlive the lifetime `'a` as defined here note: but lifetime parameter must outlive the lifetime `'a` as defined here
--> $DIR/wf-static-method.rs:23:6 --> $DIR/wf-static-method.rs:29:6
| |
LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
| ^^ | ^^
error[E0312]: lifetime of reference outlives lifetime of borrowed content... error[E0312]: lifetime of reference outlives lifetime of borrowed content...
--> $DIR/wf-static-method.rs:33:9 --> $DIR/wf-static-method.rs:41:9
| |
LL | u LL | u
| ^ | ^
| |
note: ...the reference is valid for the lifetime `'a` as defined here... note: ...the reference is valid for the lifetime `'a` as defined here...
--> $DIR/wf-static-method.rs:31:6 --> $DIR/wf-static-method.rs:39:6
| |
LL | impl<'a, 'b> Evil<'a, 'b> { LL | impl<'a, 'b> Evil<'a, 'b> {
| ^^ | ^^
note: ...but the borrowed content is only valid for the lifetime `'b` as defined here note: ...but the borrowed content is only valid for the lifetime `'b` as defined here
--> $DIR/wf-static-method.rs:31:10 --> $DIR/wf-static-method.rs:39:10
| |
LL | impl<'a, 'b> Evil<'a, 'b> { LL | impl<'a, 'b> Evil<'a, 'b> {
| ^^ | ^^
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements
--> $DIR/wf-static-method.rs:41:5 --> $DIR/wf-static-method.rs:51:5
| |
LL | <()>::static_evil(b) LL | <()>::static_evil(b)
| ^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^
| |
note: first, the lifetime cannot outlive the lifetime `'b` as defined here... note: first, the lifetime cannot outlive the lifetime `'b` as defined here...
--> $DIR/wf-static-method.rs:40:13 --> $DIR/wf-static-method.rs:50:13
| |
LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^ | ^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:41:23 --> $DIR/wf-static-method.rs:51:23
| |
LL | <()>::static_evil(b) LL | <()>::static_evil(b)
| ^ | ^
note: but, the lifetime must be valid for the lifetime `'a` as defined here... note: but, the lifetime must be valid for the lifetime `'a` as defined here...
--> $DIR/wf-static-method.rs:40:9 --> $DIR/wf-static-method.rs:50:9
| |
LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^ | ^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:41:5 --> $DIR/wf-static-method.rs:51:5
| |
LL | <()>::static_evil(b) LL | <()>::static_evil(b)
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements
--> $DIR/wf-static-method.rs:45:5 --> $DIR/wf-static-method.rs:57:5
| |
LL | <IndirectEvil>::static_evil(b) LL | <IndirectEvil>::static_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
note: first, the lifetime cannot outlive the lifetime `'b` as defined here... note: first, the lifetime cannot outlive the lifetime `'b` as defined here...
--> $DIR/wf-static-method.rs:44:22 --> $DIR/wf-static-method.rs:56:22
| |
LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^ | ^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:45:33 --> $DIR/wf-static-method.rs:57:33
| |
LL | <IndirectEvil>::static_evil(b) LL | <IndirectEvil>::static_evil(b)
| ^ | ^
note: but, the lifetime must be valid for the lifetime `'a` as defined here... note: but, the lifetime must be valid for the lifetime `'a` as defined here...
--> $DIR/wf-static-method.rs:44:18 --> $DIR/wf-static-method.rs:56:18
| |
LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^ | ^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:45:5 --> $DIR/wf-static-method.rs:57:5
| |
LL | <IndirectEvil>::static_evil(b) LL | <IndirectEvil>::static_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements
--> $DIR/wf-static-method.rs:50:5 --> $DIR/wf-static-method.rs:63:5
| |
LL | <Evil>::inherent_evil(b) LL | <Evil>::inherent_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
| |
note: first, the lifetime cannot outlive the lifetime `'b` as defined here... note: first, the lifetime cannot outlive the lifetime `'b` as defined here...
--> $DIR/wf-static-method.rs:49:22 --> $DIR/wf-static-method.rs:62:22
| |
LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^ | ^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:50:27 --> $DIR/wf-static-method.rs:63:27
| |
LL | <Evil>::inherent_evil(b) LL | <Evil>::inherent_evil(b)
| ^ | ^
note: but, the lifetime must be valid for the lifetime `'a` as defined here... note: but, the lifetime must be valid for the lifetime `'a` as defined here...
--> $DIR/wf-static-method.rs:49:18 --> $DIR/wf-static-method.rs:62:18
| |
LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^ | ^^
note: ...so that reference does not outlive borrowed content note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:50:5 --> $DIR/wf-static-method.rs:63:5
| |
LL | <Evil>::inherent_evil(b) LL | <Evil>::inherent_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -1,5 +1,5 @@
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/wf-static-method.rs:17:9 --> $DIR/wf-static-method.rs:21:9
| |
LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { LL | impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () {
| -- -- lifetime `'b` defined here | -- -- lifetime `'b` defined here
@ -12,7 +12,7 @@ LL | u
= help: consider adding the following bound: `'b: 'a` = help: consider adding the following bound: `'b: 'a`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/wf-static-method.rs:26:18 --> $DIR/wf-static-method.rs:32:18
| |
LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { LL | impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
| -- -- lifetime `'b` defined here | -- -- lifetime `'b` defined here
@ -25,7 +25,7 @@ LL | let me = Self::make_me();
= help: consider adding the following bound: `'b: 'a` = help: consider adding the following bound: `'b: 'a`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/wf-static-method.rs:33:9 --> $DIR/wf-static-method.rs:41:9
| |
LL | impl<'a, 'b> Evil<'a, 'b> { LL | impl<'a, 'b> Evil<'a, 'b> {
| -- -- lifetime `'b` defined here | -- -- lifetime `'b` defined here
@ -38,7 +38,7 @@ LL | u
= help: consider adding the following bound: `'b: 'a` = help: consider adding the following bound: `'b: 'a`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/wf-static-method.rs:41:5 --> $DIR/wf-static-method.rs:51:5
| |
LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| -- -- lifetime `'b` defined here | -- -- lifetime `'b` defined here
@ -50,7 +50,7 @@ LL | <()>::static_evil(b)
= help: consider adding the following bound: `'b: 'a` = help: consider adding the following bound: `'b: 'a`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/wf-static-method.rs:45:5 --> $DIR/wf-static-method.rs:57:5
| |
LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| -- -- lifetime `'b` defined here | -- -- lifetime `'b` defined here
@ -62,7 +62,7 @@ LL | <IndirectEvil>::static_evil(b)
= help: consider adding the following bound: `'b: 'a` = help: consider adding the following bound: `'b: 'a`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/wf-static-method.rs:50:5 --> $DIR/wf-static-method.rs:63:5
| |
LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| -- -- lifetime `'b` defined here | -- -- lifetime `'b` defined here

View File

@ -4,6 +4,10 @@
// static inherent methods isn't quite working - need to // static inherent methods isn't quite working - need to
// fix that before removing the check. // fix that before removing the check.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
trait Foo<'a, 'b, T>: Sized { trait Foo<'a, 'b, T>: Sized {
fn make_me() -> Self { loop {} } fn make_me() -> Self { loop {} }
fn static_evil(u: &'b u32) -> &'a u32; fn static_evil(u: &'b u32) -> &'a u32;
@ -14,7 +18,9 @@ struct Evil<'a, 'b: 'a>(Option<&'a &'b ()>);
impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () { impl<'a, 'b> Foo<'a, 'b, Evil<'a, 'b>> for () {
fn make_me() -> Self { } fn make_me() -> Self { }
fn static_evil(u: &'b u32) -> &'a u32 { fn static_evil(u: &'b u32) -> &'a u32 {
u //~ ERROR E0312 u
//[base]~^ ERROR E0312
//[nll]~^^ ERROR lifetime may not live long enough
} }
} }
@ -23,14 +29,18 @@ struct IndirectEvil<'a, 'b: 'a>(Option<&'a &'b ()>);
impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> { impl<'a, 'b> Foo<'a, 'b, ()> for IndirectEvil<'a, 'b> {
fn make_me() -> Self { IndirectEvil(None) } fn make_me() -> Self { IndirectEvil(None) }
fn static_evil(u: &'b u32) -> &'a u32 { fn static_evil(u: &'b u32) -> &'a u32 {
let me = Self::make_me(); //~ ERROR lifetime bound not satisfied let me = Self::make_me();
//[base]~^ ERROR lifetime bound not satisfied
//[nll]~^^ ERROR lifetime may not live long enough
loop {} // (`me` could be used for the lifetime transmute). loop {} // (`me` could be used for the lifetime transmute).
} }
} }
impl<'a, 'b> Evil<'a, 'b> { impl<'a, 'b> Evil<'a, 'b> {
fn inherent_evil(u: &'b u32) -> &'a u32 { fn inherent_evil(u: &'b u32) -> &'a u32 {
u //~ ERROR E0312 u
//[base]~^ ERROR E0312
//[nll]~^^ ERROR lifetime may not live long enough
} }
} }
@ -38,17 +48,21 @@ impl<'a, 'b> Evil<'a, 'b> {
// *check* that they hold. // *check* that they hold.
fn evil<'a, 'b>(b: &'b u32) -> &'a u32 { fn evil<'a, 'b>(b: &'b u32) -> &'a u32 {
<()>::static_evil(b) //~ ERROR cannot infer an appropriate lifetime <()>::static_evil(b)
//[base]~^ ERROR cannot infer an appropriate lifetime
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 { fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
<IndirectEvil>::static_evil(b) <IndirectEvil>::static_evil(b)
//~^ ERROR cannot infer an appropriate lifetime //[base]~^ ERROR cannot infer an appropriate lifetime
//[nll]~^^ ERROR lifetime may not live long enough
} }
fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 { fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
<Evil>::inherent_evil(b) <Evil>::inherent_evil(b)
//~^ ERROR cannot infer an appropriate lifetime //[base]~^ ERROR cannot infer an appropriate lifetime
//[nll]~^^ ERROR lifetime may not live long enough
} }

View File

@ -1,5 +1,5 @@
error: implementation of `Bar` is not general enough error: implementation of `Bar` is not general enough
--> $DIR/where-for-self-2.rs:23:5 --> $DIR/where-for-self-2.rs:27:5
| |
LL | foo(&X); LL | foo(&X);
| ^^^ implementation of `Bar` is not general enough | ^^^ implementation of `Bar` is not general enough

View File

@ -1,5 +1,5 @@
error: implementation of `Bar` is not general enough error: implementation of `Bar` is not general enough
--> $DIR/where-for-self-2.rs:23:5 --> $DIR/where-for-self-2.rs:27:5
| |
LL | foo(&X); LL | foo(&X);
| ^^^^^^^ implementation of `Bar` is not general enough | ^^^^^^^ implementation of `Bar` is not general enough

View File

@ -3,6 +3,10 @@
// specific lifetime is not enough to satisfy the `for<'a> ...` constraint, which // specific lifetime is not enough to satisfy the `for<'a> ...` constraint, which
// should require *all* lifetimes. // should require *all* lifetimes.
// revisions: base nll
// ignore-compare-mode-nll
//[nll] compile-flags: -Z borrowck=mir
static X: &'static u32 = &42; static X: &'static u32 = &42;
trait Bar { trait Bar {