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.
test that wildcard type
_
is not duplicated by `type Foo<X> = (X, X…
…);` and potentially instantiated at different types.
- 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 unsatisfied lifetime constraints | ||
} | ||
|
||
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 unsatisfied lifetime constraints | ||
} | ||
|
||
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 unsatisfied lifetime constraints | ||
} | ||
|
||
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: unsatisfied lifetime constraints | ||
--> $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 //~ ERROR unsatisfied lifetime constraints | ||
| ^ returning this value requires that `'a` must outlive `'static` | ||
|
||
error: unsatisfied lifetime constraints | ||
--> $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 //~ ERROR unsatisfied lifetime constraints | ||
| ^ returning this value requires that `'a` must outlive `'static` | ||
|
||
error: unsatisfied lifetime constraints | ||
--> $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 //~ ERROR unsatisfied lifetime constraints | ||
| ^ returning this value requires that `'a` must outlive `'static` | ||
|
||
error: aborting due to 3 previous errors | ||
|