Skip to content

Commit

Permalink
Rollup merge of rust-lang#70578 - PankajChaudhary5:master, r=Guillaum…
Browse files Browse the repository at this point in the history
…eGomez

Add long error explanation for E0657

Added proper error explanation for issue E0657 in the Rust compiler.

Part of rust-lang#61137

r? @GuillaumeGomez
  • Loading branch information
Dylan-DPC authored Apr 17, 2020
2 parents 868b51b + 908436f commit abd72f7
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/librustc_error_codes/error_codes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,7 @@ E0644: include_str!("./error_codes/E0644.md"),
E0646: include_str!("./error_codes/E0646.md"),
E0647: include_str!("./error_codes/E0647.md"),
E0648: include_str!("./error_codes/E0648.md"),
E0657: include_str!("./error_codes/E0657.md"),
E0658: include_str!("./error_codes/E0658.md"),
E0659: include_str!("./error_codes/E0659.md"),
E0660: include_str!("./error_codes/E0660.md"),
Expand Down Expand Up @@ -597,7 +598,6 @@ E0751: include_str!("./error_codes/E0751.md"),
// used in argument position
E0640, // infer outlives requirements
// E0645, // trait aliases not finished
E0657, // `impl Trait` can only capture lifetimes bound at the fn level
E0667, // `impl Trait` in projections
E0687, // in-band lifetimes cannot be used in `fn`/`Fn` syntax
E0688, // in-band lifetimes cannot be mixed with explicit lifetime binders
Expand Down
57 changes: 57 additions & 0 deletions src/librustc_error_codes/error_codes/E0657.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
A lifetime bound on a trait implementation was captured at an incorrect place.

Erroneous code example:

```compile_fail,E0657
trait Id<T> {}
trait Lt<'a> {}
impl<'a> Lt<'a> for () {}
impl<T> Id<T> for T {}
fn free_fn_capture_hrtb_in_impl_trait()
-> Box<for<'a> Id<impl Lt<'a>>> // error!
{
Box::new(())
}
struct Foo;
impl Foo {
fn impl_fn_capture_hrtb_in_impl_trait()
-> Box<for<'a> Id<impl Lt<'a>>> // error!
{
Box::new(())
}
}
```

Here, you have used the inappropriate lifetime in the `impl Trait`,
The `impl Trait` can only capture lifetimes bound at the fn or impl
level.

To fix this we have to define the lifetime at the function or impl
level and use that lifetime in the `impl Trait`. For example you can
define the lifetime at the function:

```
trait Id<T> {}
trait Lt<'a> {}
impl<'a> Lt<'a> for () {}
impl<T> Id<T> for T {}
fn free_fn_capture_hrtb_in_impl_trait<'b>()
-> Box<for<'a> Id<impl Lt<'b>>> // ok!
{
Box::new(())
}
struct Foo;
impl Foo {
fn impl_fn_capture_hrtb_in_impl_trait<'b>()
-> Box<for<'a> Id<impl Lt<'b>>> // ok!
{
Box::new(())
}
}
```
1 change: 1 addition & 0 deletions src/test/ui/error-codes/E0657.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ LL | -> Box<for<'a> Id<impl Lt<'a>>>

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0657`.

0 comments on commit abd72f7

Please sign in to comment.