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.
Rollup merge of rust-lang#130412 - compiler-errors:rpitit-overcapture…
…, r=jieyouxu Don't ICE when RPITIT captures more method args than trait definition Make sure we don't ICE when an RPITIT captures more method args than the trait definition, which is not allowed. This was because we were using the wrong def id for error reporting. Due to the default lifetime capture rules of RPITITs (capturing everything in scope), this is only doable if we use precise capturing, which isn't currently allowed for RPITITs anyways but we still end up reaching the relevant codepaths. Fixes rust-lang#129850
- Loading branch information
Showing
4 changed files
with
73 additions
and
8 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
16 changes: 16 additions & 0 deletions
16
tests/ui/impl-trait/precise-capturing/rpitit-captures-more-method-lifetimes.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,16 @@ | ||
// Make sure we don't ICE when an RPITIT captures more method args than the | ||
// trait definition, which is not allowed. Due to the default lifetime capture | ||
// rules of RPITITs, this is only doable if we use precise capturing. | ||
|
||
pub trait Foo { | ||
fn bar<'tr: 'tr>(&'tr mut self) -> impl Sized + use<Self>; | ||
//~^ ERROR `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits | ||
} | ||
|
||
impl Foo for () { | ||
fn bar<'im: 'im>(&'im mut self) -> impl Sized + 'im {} | ||
//~^ ERROR return type captures more lifetimes than trait definition | ||
//~| WARN impl trait in impl method signature does not match trait method signature | ||
} | ||
|
||
fn main() {} |
42 changes: 42 additions & 0 deletions
42
tests/ui/impl-trait/precise-capturing/rpitit-captures-more-method-lifetimes.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,42 @@ | ||
error: `use<...>` precise capturing syntax is currently not allowed in return-position `impl Trait` in traits | ||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:6:53 | ||
| | ||
LL | fn bar<'tr: 'tr>(&'tr mut self) -> impl Sized + use<Self>; | ||
| ^^^^^^^^^ | ||
| | ||
= note: currently, return-position `impl Trait` in traits and trait implementations capture all lifetimes in scope | ||
|
||
error: return type captures more lifetimes than trait definition | ||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:11:40 | ||
| | ||
LL | fn bar<'im: 'im>(&'im mut self) -> impl Sized + 'im {} | ||
| --- ^^^^^^^^^^^^^^^^ | ||
| | | ||
| this lifetime was captured | ||
| | ||
note: hidden type must only reference lifetimes captured by this impl trait | ||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:6:40 | ||
| | ||
LL | fn bar<'tr: 'tr>(&'tr mut self) -> impl Sized + use<Self>; | ||
| ^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: hidden type inferred to be `impl Sized + 'im` | ||
|
||
warning: impl trait in impl method signature does not match trait method signature | ||
--> $DIR/rpitit-captures-more-method-lifetimes.rs:11:40 | ||
| | ||
LL | fn bar<'tr: 'tr>(&'tr mut self) -> impl Sized + use<Self>; | ||
| ---------------------- return type from trait method defined here | ||
... | ||
LL | fn bar<'im: 'im>(&'im mut self) -> impl Sized + 'im {} | ||
| ^^^^^^^^^^^^^^^^ | ||
| | ||
= note: add `#[allow(refining_impl_trait)]` if it is intended for this to be part of the public API of this crate | ||
= note: we are soliciting feedback, see issue #121718 <https://github.com/rust-lang/rust/issues/121718> for more information | ||
= note: `#[warn(refining_impl_trait_reachable)]` on by default | ||
help: replace the return type so that it matches the trait | ||
| | ||
LL | fn bar<'im: 'im>(&'im mut self) -> impl Sized {} | ||
| ~~~~~~~~~~ | ||
|
||
error: aborting due to 2 previous errors; 1 warning emitted | ||
|