forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#122206 - matthiaskrgr:rollup-4txx9wx, r=matth…
…iaskrgr Rollup of 9 pull requests Successful merges: - rust-lang#121201 (align_offset, align_to: no longer allow implementations to spuriously fail to align) - rust-lang#122076 (Tweak the way we protect in-place function arguments in interpreters) - rust-lang#122100 (Better comment for implicit captures in RPITIT) - rust-lang#122157 (Add the new description field to Target::to_json, and add descriptions for some MSVC targets) - rust-lang#122164 (Fix misaligned loads when loading UEFI arg pointers) - rust-lang#122171 (Add some new solver tests) - rust-lang#122172 (Don't ICE if we collect no RPITITs unless there are no unification errors) - rust-lang#122197 (inspect formatter: add braces) - rust-lang#122198 (Remove handling for previously dropped LLVM version) r? `@ghost` `@rustbot` modify labels: rollup
- Loading branch information
Showing
47 changed files
with
418 additions
and
214 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
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 |
---|---|---|
@@ -1,57 +1,26 @@ | ||
A lifetime bound on a trait implementation was captured at an incorrect place. | ||
An `impl Trait` captured a higher-ranked lifetime, which is not supported. | ||
|
||
Currently, `impl Trait` types are only allowed to capture lifetimes from | ||
their parent items, and not from any `for<'a>` binders in scope. | ||
|
||
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(()) | ||
} | ||
trait BorrowInto<'a> { | ||
type Target; | ||
struct Foo; | ||
impl Foo { | ||
fn impl_fn_capture_hrtb_in_impl_trait() | ||
-> Box<for<'a> Id<impl Lt<'a>>> // error! | ||
{ | ||
Box::new(()) | ||
} | ||
fn borrow_into(&'a self) -> Self::Target; | ||
} | ||
``` | ||
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. | ||
impl<'a> BorrowInto<'a> for () { | ||
type Target = &'a (); | ||
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(()) | ||
fn borrow_into(&'a self) -> Self::Target { | ||
self | ||
} | ||
} | ||
struct Foo; | ||
impl Foo { | ||
fn impl_fn_capture_hrtb_in_impl_trait<'b>() | ||
-> Box<for<'a> Id<impl Lt<'b>>> // ok! | ||
{ | ||
Box::new(()) | ||
} | ||
fn opaque() -> impl for<'a> BorrowInto<'a, Target = impl Sized + 'a> { | ||
() | ||
} | ||
``` |
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
Oops, something went wrong.