Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Handle equal regions in opaque type inference
- Loading branch information
1 parent
728224d
commit 5cfa7d1
Showing
4 changed files
with
127 additions
and
18 deletions.
There are no files selected for viewing
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
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
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,49 @@ | ||
// Test that we consider equal regions when checking for hidden regions in | ||
// opaque types | ||
|
||
// check-pass | ||
|
||
// `'a == 'static` so `&'a i32` is fine as the return type | ||
fn equal_regions_static<'a: 'static>(x: &'a i32) -> impl Sized { | ||
//~^ WARNING unnecessary lifetime parameter `'a` | ||
x | ||
} | ||
|
||
// `'a == 'b` so `&'b i32` is fine as the return type | ||
fn equal_regions<'a: 'b, 'b: 'a>(x: &'b i32) -> impl Sized + 'a { | ||
let y: &'a i32 = x; | ||
let z: &'b i32 = y; | ||
x | ||
} | ||
|
||
// `'a == 'b` so `&'a i32` is fine as the return type | ||
fn equal_regions_rev<'a: 'b, 'b: 'a>(x: &'a i32) -> impl Sized + 'b { | ||
let y: &'a i32 = x; | ||
let z: &'b i32 = y; | ||
x | ||
} | ||
|
||
// `'a == 'b` so `*mut &'b i32` is fine as the return type | ||
fn equal_regions_inv<'a: 'b, 'b: 'a>(x: *mut &'b i32) -> impl Sized + 'a { | ||
let y: *mut &'a i32 = x; | ||
let z: *mut &'b i32 = y; | ||
x | ||
} | ||
|
||
// `'a == 'b` so `*mut &'a i32` is fine as the return type | ||
fn equal_regions_inv_rev<'a: 'b, 'b: 'a>(x: *mut &'a i32) -> impl Sized + 'b { | ||
let y: *mut &'a i32 = x; | ||
let z: *mut &'b i32 = y; | ||
x | ||
} | ||
|
||
// Should be able to infer `fn(&'static ())` as the return type. | ||
fn contravariant_lub<'a, 'b: 'a, 'c: 'a, 'd: 'b + 'c>( | ||
x: fn(&'b ()), | ||
y: fn(&'c ()), | ||
c: bool, | ||
) -> impl Sized + 'a { | ||
if c { x } else { y } | ||
} | ||
|
||
fn main() {} |
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,8 @@ | ||
warning: unnecessary lifetime parameter `'a` | ||
--> $DIR/equal-hidden-lifetimes.rs:7:25 | ||
| | ||
LL | fn equal_regions_static<'a: 'static>(x: &'a i32) -> impl Sized { | ||
| ^^^^^^^^^^^ | ||
| | ||
= help: you can use the `'static` lifetime directly, in place of `'a` | ||
|