-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test implied bounds + nested proj oblig
- Loading branch information
Showing
2 changed files
with
42 additions
and
0 deletions.
There are no files selected for viewing
27 changes: 27 additions & 0 deletions
27
src/test/ui/implied-bounds/assoc-ty-wf-used-to-get-assoc-ty.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,27 @@ | ||
// Test for a less than ideal interaction of implied bounds and normalization. | ||
trait Tr { | ||
type Ty; | ||
} | ||
|
||
impl<T: 'static> Tr for T { | ||
type Ty = &'static T; | ||
} | ||
|
||
// `<&'a u8 as Tr>::Ty` should cause an error because `&'a u8: Tr` doesn't hold for | ||
// all possible 'a. However, we consider normalized types for implied bounds. | ||
// | ||
// We normalize this projection to `&'static &'a u8` and add a nested `&'a u8: 'static` | ||
// bound. This bound is then proven using the implied bounds for `&'static &'a u8` which | ||
// we only get by normalizing in the first place. | ||
fn test<'a>(x: &'a u8, _wf: <&'a u8 as Tr>::Ty) -> &'static u8 { x } | ||
|
||
fn main() { | ||
// This works as we have 'static references due to promotion. | ||
let _: &'static u8 = test(&3, &&3); | ||
// This causes an error because the projection requires 'a to be 'static. | ||
// It would be unsound if this compiled. | ||
let x: u8 = 3; | ||
let _: &'static u8 = test(&x, &&3); | ||
//~^ ERROR `x` does not live long enough | ||
|
||
} |
15 changes: 15 additions & 0 deletions
15
src/test/ui/implied-bounds/assoc-ty-wf-used-to-get-assoc-ty.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,15 @@ | ||
error[E0597]: `x` does not live long enough | ||
--> $DIR/assoc-ty-wf-used-to-get-assoc-ty.rs:24:31 | ||
| | ||
LL | let _: &'static u8 = test(&x, &&3); | ||
| -----^^------ | ||
| | | | ||
| | borrowed value does not live long enough | ||
| argument requires that `x` is borrowed for `'static` | ||
... | ||
LL | } | ||
| - `x` dropped here while still borrowed | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0597`. |