-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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 #113182 - compiler-errors:rpit-stricter-captures, r=o…
…li-obk Error when RPITITs' hidden types capture more lifetimes than their trait definitions This implements a stricter set of captures rules for RPITITs. They now may only capture: 1. Lifetimes from the impl header (both the self type and any trait substs -- we may want to restrict just to the self type's lifetimes, but the PR makes that easy to do, too) 2. Lifetimes mentioned by the `impl Trait` in the trait method's definition. Namely, they may not mention lifetimes from the method (early or late) that are not mentioned in the `impl Trait`. cc #105258 which I think was trying to do this too, though I'm not super familiar with what exactly differs from that or why that one was broken. cc #112194 (doesn't fix this issue per se, because it's still an open question, but I think this is objectively better than the status quo, and gets us closer to resolving that issue.) Technically is a fix for the ICE in #108580, but it turns that issue into an error now. We can decide separately whether or not nested RPITITs should capture lifetimes from their parents. r? ``@oli-obk``
- Loading branch information
Showing
5 changed files
with
283 additions
and
56 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
65 changes: 55 additions & 10 deletions
65
tests/ui/impl-trait/in-trait/signature-mismatch.current.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 |
---|---|---|
@@ -1,16 +1,61 @@ | ||
error: `impl` item signature doesn't match `trait` item signature | ||
--> $DIR/signature-mismatch.rs:17:5 | ||
error: return type captures more lifetimes than trait definition | ||
--> $DIR/signature-mismatch.rs:36:47 | ||
| | ||
LL | fn async_fn<'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a { | ||
| -- this lifetime was captured ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
note: hidden type must only reference lifetimes captured by this impl trait | ||
--> $DIR/signature-mismatch.rs:17:40 | ||
| | ||
LL | fn async_fn(&self, buff: &[u8]) -> impl Future<Output = Vec<u8>>; | ||
| ----------------------------------------------------------------- expected `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '3` | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: hidden type inferred to be `impl Future<Output = Vec<u8>> + 'a` | ||
|
||
error: return type captures more lifetimes than trait definition | ||
--> $DIR/signature-mismatch.rs:41:57 | ||
| | ||
LL | fn async_fn_early<'a: 'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a { | ||
| -- this lifetime was captured ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
note: hidden type must only reference lifetimes captured by this impl trait | ||
--> $DIR/signature-mismatch.rs:18:57 | ||
| | ||
LL | fn async_fn_early<'a: 'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>>; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: hidden type inferred to be `impl Future<Output = Vec<u8>> + 'a` | ||
|
||
error: return type captures more lifetimes than trait definition | ||
--> $DIR/signature-mismatch.rs:49:10 | ||
| | ||
LL | fn async_fn_multiple<'a, 'b>( | ||
| -- this lifetime was captured | ||
... | ||
LL | fn async_fn<'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '2` | ||
LL | ) -> impl Future<Output = Vec<u8>> + Captures2<'a, 'b> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
note: hidden type must only reference lifetimes captured by this impl trait | ||
--> $DIR/signature-mismatch.rs:20:12 | ||
| | ||
LL | -> impl Future<Output = Vec<u8>> + Captures<'a>; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: hidden type inferred to be `impl Future<Output = Vec<u8>> + Captures2<'a, 'b>` | ||
|
||
error[E0309]: the parameter type `T` may not live long enough | ||
--> $DIR/signature-mismatch.rs:58:10 | ||
| | ||
LL | ) -> impl Future<Output = Vec<u8>> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `impl Future<Output = Vec<u8>>` will meet its required lifetime bounds... | ||
| | ||
note: ...that is required by this bound | ||
--> $DIR/signature-mismatch.rs:25:42 | ||
| | ||
LL | ) -> impl Future<Output = Vec<u8>> + 'a; | ||
| ^^ | ||
help: consider adding an explicit lifetime bound... | ||
| | ||
= note: expected signature `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '3` | ||
found signature `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '2` | ||
= help: the lifetime requirements from the `impl` do not correspond to the requirements in the `trait` | ||
= help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output | ||
LL | fn async_fn_reduce_outlive<'a, 'b, T: 'a>( | ||
| ++++ | ||
|
||
error: aborting due to previous error | ||
error: aborting due to 4 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0309`. |
65 changes: 55 additions & 10 deletions
65
tests/ui/impl-trait/in-trait/signature-mismatch.next.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 |
---|---|---|
@@ -1,16 +1,61 @@ | ||
error: `impl` item signature doesn't match `trait` item signature | ||
--> $DIR/signature-mismatch.rs:17:5 | ||
error: return type captures more lifetimes than trait definition | ||
--> $DIR/signature-mismatch.rs:36:47 | ||
| | ||
LL | fn async_fn<'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a { | ||
| -- this lifetime was captured ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
note: hidden type must only reference lifetimes captured by this impl trait | ||
--> $DIR/signature-mismatch.rs:17:40 | ||
| | ||
LL | fn async_fn(&self, buff: &[u8]) -> impl Future<Output = Vec<u8>>; | ||
| ----------------------------------------------------------------- expected `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '3` | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: hidden type inferred to be `impl Future<Output = Vec<u8>> + 'a` | ||
|
||
error: return type captures more lifetimes than trait definition | ||
--> $DIR/signature-mismatch.rs:41:57 | ||
| | ||
LL | fn async_fn_early<'a: 'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a { | ||
| -- this lifetime was captured ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
note: hidden type must only reference lifetimes captured by this impl trait | ||
--> $DIR/signature-mismatch.rs:18:57 | ||
| | ||
LL | fn async_fn_early<'a: 'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>>; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: hidden type inferred to be `impl Future<Output = Vec<u8>> + 'a` | ||
|
||
error: return type captures more lifetimes than trait definition | ||
--> $DIR/signature-mismatch.rs:49:10 | ||
| | ||
LL | fn async_fn_multiple<'a, 'b>( | ||
| -- this lifetime was captured | ||
... | ||
LL | fn async_fn<'a>(&self, buff: &'a [u8]) -> impl Future<Output = Vec<u8>> + 'a { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '2` | ||
LL | ) -> impl Future<Output = Vec<u8>> + Captures2<'a, 'b> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
note: hidden type must only reference lifetimes captured by this impl trait | ||
--> $DIR/signature-mismatch.rs:20:12 | ||
| | ||
LL | -> impl Future<Output = Vec<u8>> + Captures<'a>; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
= note: hidden type inferred to be `impl Future<Output = Vec<u8>> + Captures2<'a, 'b>` | ||
|
||
error[E0309]: the parameter type `T` may not live long enough | ||
--> $DIR/signature-mismatch.rs:58:10 | ||
| | ||
LL | ) -> impl Future<Output = Vec<u8>> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `impl Future<Output = Vec<u8>>` will meet its required lifetime bounds... | ||
| | ||
note: ...that is required by this bound | ||
--> $DIR/signature-mismatch.rs:25:42 | ||
| | ||
LL | ) -> impl Future<Output = Vec<u8>> + 'a; | ||
| ^^ | ||
help: consider adding an explicit lifetime bound... | ||
| | ||
= note: expected signature `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '3` | ||
found signature `fn(&'1 Struct, &'2 [u8]) -> impl Future<Output = Vec<u8>> + '2` | ||
= help: the lifetime requirements from the `impl` do not correspond to the requirements in the `trait` | ||
= help: verify the lifetime relationships in the `trait` and `impl` between the `self` argument, the other inputs and its output | ||
LL | fn async_fn_reduce_outlive<'a, 'b, T: 'a>( | ||
| ++++ | ||
|
||
error: aborting due to previous error | ||
error: aborting due to 4 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0309`. |
Oops, something went wrong.