forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of rust-lang#57729 - pnkfelix:issue-55748-pat-types-are-…
…constraints-on-bindings-too, r=nikomatsakis extra testing of how NLL handles wildcard type `_` test that wildcard type `_` is not duplicated by `type Foo<X> = (X, X);` and potentially instantiated at different types when used in type ascriptions in let bindings. (NLL's handling of this for the type ascription *expression form* is currently broken, or at least differs from what AST-borrowck does. I'll file a separate bug about that. Its not something critical to address since that expression is guarded by `#![feature(type_ascription)]`.) cc rust-lang#55748
- Loading branch information
Showing
2 changed files
with
99 additions
and
0 deletions.
There are no files selected for viewing
70 changes: 70 additions & 0 deletions
70
src/test/ui/nll/user-annotations/issue-55748-pat-types-constrain-bindings.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
// This test is ensuring that type ascriptions on let bindings | ||
// constrain both: | ||
// | ||
// 1. the input expression on the right-hand side (after any potential | ||
// coercion, and allowing for covariance), *and* | ||
// | ||
// 2. the bindings (if any) nested within the pattern on the left-hand | ||
// side (and here, the type-constraint is *invariant*). | ||
|
||
#![feature(nll)] | ||
|
||
#![allow(dead_code, unused_mut)] | ||
type PairUncoupled<'a, 'b, T> = (&'a T, &'b T); | ||
type PairCoupledRegions<'a, T> = (&'a T, &'a T); | ||
type PairCoupledTypes<T> = (T, T); | ||
|
||
fn uncoupled_lhs<'a>(_x: &'a u32, s: &'static u32) -> &'static u32 { | ||
let ((mut y, mut _z),): (PairUncoupled<u32>,) = ((s, &_x),); // ok | ||
// Above compiling does *not* imply below would compile. | ||
// ::std::mem::swap(&mut y, &mut _z); | ||
y | ||
} | ||
|
||
fn swap_regions((mut y, mut _z): PairCoupledRegions<u32>) { | ||
::std::mem::swap(&mut y, &mut _z); | ||
} | ||
|
||
fn coupled_regions_lhs<'a>(_x: &'a u32, s: &'static u32) -> &'static u32 { | ||
let ((y, _z),): (PairCoupledRegions<u32>,) = ((s, &_x),); | ||
// If above line compiled, so should line below ... | ||
|
||
// swap_regions((y, _z)); | ||
|
||
// ... but the ascribed type also invalidates this use of `y` | ||
y //~ ERROR lifetime may not live long enough | ||
} | ||
|
||
fn swap_types((mut y, mut _z): PairCoupledTypes<&u32>) { | ||
::std::mem::swap(&mut y, &mut _z); | ||
} | ||
|
||
fn coupled_types_lhs<'a>(_x: &'a u32, s: &'static u32) -> &'static u32 { | ||
let ((y, _z),): (PairCoupledTypes<&u32>,) = ((s, &_x),); | ||
// If above line compiled, so should line below ... | ||
|
||
// swap_types((y, _z)); | ||
|
||
// ... but the ascribed type also invalidates this use of `y` | ||
y //~ ERROR lifetime may not live long enough | ||
} | ||
|
||
fn swap_wilds((mut y, mut _z): PairCoupledTypes<&u32>) { | ||
::std::mem::swap(&mut y, &mut _z); | ||
} | ||
|
||
fn coupled_wilds_lhs<'a>(_x: &'a u32, s: &'static u32) -> &'static u32 { | ||
let ((y, _z),): (PairCoupledTypes<_>,) = ((s, &_x),); | ||
// If above line compiled, so should line below | ||
// swap_wilds((y, _z)); | ||
|
||
// ... but the ascribed type also invalidates this use of `y` | ||
y //~ ERROR lifetime may not live long enough | ||
} | ||
|
||
fn main() { | ||
uncoupled_lhs(&3, &4); | ||
coupled_regions_lhs(&3, &4); | ||
coupled_types_lhs(&3, &4); | ||
coupled_wilds_lhs(&3, &4); | ||
} |
29 changes: 29 additions & 0 deletions
29
src/test/ui/nll/user-annotations/issue-55748-pat-types-constrain-bindings.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
error: lifetime may not live long enough | ||
--> $DIR/issue-55748-pat-types-constrain-bindings.rs:35:5 | ||
| | ||
LL | fn coupled_regions_lhs<'a>(_x: &'a u32, s: &'static u32) -> &'static u32 { | ||
| -- lifetime `'a` defined here | ||
... | ||
LL | y | ||
| ^ returning this value requires that `'a` must outlive `'static` | ||
|
||
error: lifetime may not live long enough | ||
--> $DIR/issue-55748-pat-types-constrain-bindings.rs:49:5 | ||
| | ||
LL | fn coupled_types_lhs<'a>(_x: &'a u32, s: &'static u32) -> &'static u32 { | ||
| -- lifetime `'a` defined here | ||
... | ||
LL | y | ||
| ^ returning this value requires that `'a` must outlive `'static` | ||
|
||
error: lifetime may not live long enough | ||
--> $DIR/issue-55748-pat-types-constrain-bindings.rs:62:5 | ||
| | ||
LL | fn coupled_wilds_lhs<'a>(_x: &'a u32, s: &'static u32) -> &'static u32 { | ||
| -- lifetime `'a` defined here | ||
... | ||
LL | y | ||
| ^ returning this value requires that `'a` must outlive `'static` | ||
|
||
error: aborting due to 3 previous errors | ||
|