-
Notifications
You must be signed in to change notification settings - Fork 13k
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 #97040 - cjgillot:no-rpit-hrtb-beta, r=jackh726
Forbid nested opaque types to reference HRTB from opaque types. Backport version of #97039 if useful. r? `@Mark-Simulacrum`
- Loading branch information
Showing
13 changed files
with
235 additions
and
94 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/issue-54895.rs:15:53 | ||
| | ||
LL | fn f() -> impl for<'a> Trait<'a, Out = impl Sized + 'a> { | ||
| ^^ | ||
| | ||
note: lifetime declared here | ||
--> $DIR/issue-54895.rs:15:20 | ||
| | ||
LL | fn f() -> impl for<'a> Trait<'a, Out = impl Sized + 'a> { | ||
| ^^ | ||
|
||
error: aborting due to previous error | ||
|
This file was deleted.
Oops, something went wrong.
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,11 +1,14 @@ | ||
error: implementation of `FnOnce` is not general enough | ||
--> $DIR/issue-67830.rs:21:14 | ||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/issue-67830.rs:21:62 | ||
| | ||
LL | fn test() -> impl for<'a> MyFn<&'a A, Output=impl Iterator + 'a> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough | ||
| ^^ | ||
| | ||
= note: closure with signature `fn(&'2 A) -> std::option::IntoIter<&A>` must implement `FnOnce<(&'1 A,)>`, for any lifetime `'1`... | ||
= note: ...but it actually implements `FnOnce<(&'2 A,)>`, for some specific lifetime `'2` | ||
note: lifetime declared here | ||
--> $DIR/issue-67830.rs:21:23 | ||
| | ||
LL | fn test() -> impl for<'a> MyFn<&'a A, Output=impl Iterator + 'a> { | ||
| ^^ | ||
|
||
error: aborting due to previous error | ||
|
This file was deleted.
Oops, something went wrong.
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,20 +1,38 @@ | ||
error: implementation of `Hrtb` is not general enough | ||
--> $DIR/issue-88236-2.rs:16:38 | ||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/issue-88236-2.rs:15:61 | ||
| | ||
LL | fn make_impl() -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {} | ||
| ^^ | ||
| | ||
note: lifetime declared here | ||
--> $DIR/issue-88236-2.rs:15:28 | ||
| | ||
LL | fn make_impl() -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {} | ||
| ^^ | ||
|
||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/issue-88236-2.rs:18:80 | ||
| | ||
LL | fn make_weird_impl<'b>(x: &'b ()) -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Hrtb` is not general enough | ||
| ^^ | ||
| | ||
= note: `Hrtb<'0>` would have to be implemented for the type `&()`, for any lifetime `'0`... | ||
= note: ...but `Hrtb<'1>` is actually implemented for the type `&'1 ()`, for some specific lifetime `'1` | ||
note: lifetime declared here | ||
--> $DIR/issue-88236-2.rs:18:47 | ||
| | ||
LL | fn make_weird_impl<'b>(x: &'b ()) -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> { | ||
| ^^ | ||
|
||
error: implementation of `Hrtb` is not general enough | ||
--> $DIR/issue-88236-2.rs:19:36 | ||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/issue-88236-2.rs:23:78 | ||
| | ||
LL | fn make_bad_impl<'b>(x: &'b ()) -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> { | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Hrtb` is not general enough | ||
| ^^ | ||
| | ||
= note: `Hrtb<'1>` would have to be implemented for the type `&()`, for any lifetime `'1`... | ||
= note: ...but `Hrtb<'_>` is actually implemented for the type `&()` | ||
note: lifetime declared here | ||
--> $DIR/issue-88236-2.rs:23:45 | ||
| | ||
LL | fn make_bad_impl<'b>(x: &'b ()) -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> { | ||
| ^^ | ||
|
||
error: aborting due to 2 previous errors | ||
error: aborting due to 3 previous errors | ||
|
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 |
---|---|---|
@@ -0,0 +1,14 @@ | ||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/issue-88236.rs:15:61 | ||
| | ||
LL | fn make_impl() -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {} | ||
| ^^ | ||
| | ||
note: lifetime declared here | ||
--> $DIR/issue-88236.rs:15:28 | ||
| | ||
LL | fn make_impl() -> impl for<'a> Hrtb<'a, Assoc = impl Send + 'a> {} | ||
| ^^ | ||
|
||
error: aborting due to previous error | ||
|
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,66 @@ | ||
// Test the interaction between rested RPIT and HRTB. | ||
|
||
trait Foo<'a> { | ||
type Assoc; | ||
} | ||
|
||
impl Foo<'_> for () { | ||
type Assoc = (); | ||
} | ||
|
||
// Alternative version of `Foo` whose impl uses `'a`. | ||
trait Bar<'a> { | ||
type Assoc; | ||
} | ||
|
||
impl<'a> Bar<'a> for () { | ||
type Assoc = &'a (); | ||
} | ||
|
||
trait Qux<'a> {} | ||
|
||
impl Qux<'_> for () {} | ||
|
||
// This is not supported. | ||
fn one_hrtb_outlives() -> impl for<'a> Foo<'a, Assoc = impl Sized + 'a> {} | ||
//~^ ERROR higher kinded lifetime bounds on nested opaque types are not supported yet | ||
|
||
// This is not supported. | ||
fn one_hrtb_trait_param() -> impl for<'a> Foo<'a, Assoc = impl Qux<'a>> {} | ||
//~^ ERROR higher kinded lifetime bounds on nested opaque types are not supported yet | ||
|
||
fn one_hrtb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'a> {} | ||
//~^ ERROR higher kinded lifetime bounds on nested opaque types are not supported yet | ||
|
||
fn one_hrtb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl Qux<'a>> {} | ||
//~^ ERROR higher kinded lifetime bounds on nested opaque types are not supported yet | ||
|
||
// This should pass. | ||
fn one_hrtb_mention_fn_trait_param<'b>() -> impl for<'a> Foo<'a, Assoc = impl Qux<'b>> {} | ||
|
||
// This should pass. | ||
fn one_hrtb_mention_fn_outlives<'b>() -> impl for<'a> Foo<'a, Assoc = impl Sized + 'b> {} | ||
|
||
// This should pass. | ||
fn one_hrtb_mention_fn_trait_param_uses<'b>() -> impl for<'a> Bar<'a, Assoc = impl Qux<'b>> {} | ||
|
||
// This should pass. | ||
fn one_hrtb_mention_fn_outlives_uses<'b>() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'b> {} | ||
|
||
// This should pass. | ||
fn two_htrb_trait_param() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Qux<'b>> {} | ||
|
||
// `'b` is not in scope for the outlives bound. | ||
fn two_htrb_outlives() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Sized + 'b> {} | ||
//~^ ERROR use of undeclared lifetime name `'b` [E0261] | ||
//~| ERROR lifetime name `'b` shadows a lifetime name that is already in scope [E0496] | ||
|
||
// This should pass. | ||
fn two_htrb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Qux<'b>> {} | ||
|
||
// `'b` is not in scope for the outlives bound. | ||
fn two_htrb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Sized + 'b> {} | ||
//~^ ERROR use of undeclared lifetime name `'b` [E0261] | ||
//~| ERROR lifetime name `'b` shadows a lifetime name that is already in scope [E0496] | ||
|
||
fn main() {} |
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,80 @@ | ||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/nested-rpit-hrtb.rs:25:69 | ||
| | ||
LL | fn one_hrtb_outlives() -> impl for<'a> Foo<'a, Assoc = impl Sized + 'a> {} | ||
| ^^ | ||
| | ||
note: lifetime declared here | ||
--> $DIR/nested-rpit-hrtb.rs:25:36 | ||
| | ||
LL | fn one_hrtb_outlives() -> impl for<'a> Foo<'a, Assoc = impl Sized + 'a> {} | ||
| ^^ | ||
|
||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/nested-rpit-hrtb.rs:29:68 | ||
| | ||
LL | fn one_hrtb_trait_param() -> impl for<'a> Foo<'a, Assoc = impl Qux<'a>> {} | ||
| ^^ | ||
| | ||
note: lifetime declared here | ||
--> $DIR/nested-rpit-hrtb.rs:29:39 | ||
| | ||
LL | fn one_hrtb_trait_param() -> impl for<'a> Foo<'a, Assoc = impl Qux<'a>> {} | ||
| ^^ | ||
|
||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/nested-rpit-hrtb.rs:32:74 | ||
| | ||
LL | fn one_hrtb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'a> {} | ||
| ^^ | ||
| | ||
note: lifetime declared here | ||
--> $DIR/nested-rpit-hrtb.rs:32:41 | ||
| | ||
LL | fn one_hrtb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl Sized + 'a> {} | ||
| ^^ | ||
|
||
error: higher kinded lifetime bounds on nested opaque types are not supported yet | ||
--> $DIR/nested-rpit-hrtb.rs:35:73 | ||
| | ||
LL | fn one_hrtb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl Qux<'a>> {} | ||
| ^^ | ||
| | ||
note: lifetime declared here | ||
--> $DIR/nested-rpit-hrtb.rs:35:44 | ||
| | ||
LL | fn one_hrtb_trait_param_uses() -> impl for<'a> Bar<'a, Assoc = impl Qux<'a>> {} | ||
| ^^ | ||
|
||
error[E0261]: use of undeclared lifetime name `'b` | ||
--> $DIR/nested-rpit-hrtb.rs:54:77 | ||
| | ||
LL | fn two_htrb_outlives() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Sized + 'b> {} | ||
| - help: consider introducing lifetime `'b` here: `<'b>` ^^ undeclared lifetime | ||
|
||
error[E0496]: lifetime name `'b` shadows a lifetime name that is already in scope | ||
--> $DIR/nested-rpit-hrtb.rs:54:65 | ||
| | ||
LL | fn two_htrb_outlives() -> impl for<'a> Foo<'a, Assoc = impl for<'b> Sized + 'b> {} | ||
| ^^ -- first declared here | ||
| | | ||
| lifetime `'b` already in scope | ||
|
||
error[E0261]: use of undeclared lifetime name `'b` | ||
--> $DIR/nested-rpit-hrtb.rs:62:82 | ||
| | ||
LL | fn two_htrb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Sized + 'b> {} | ||
| - help: consider introducing lifetime `'b` here: `<'b>` ^^ undeclared lifetime | ||
|
||
error[E0496]: lifetime name `'b` shadows a lifetime name that is already in scope | ||
--> $DIR/nested-rpit-hrtb.rs:62:70 | ||
| | ||
LL | fn two_htrb_outlives_uses() -> impl for<'a> Bar<'a, Assoc = impl for<'b> Sized + 'b> {} | ||
| ^^ -- first declared here | ||
| | | ||
| lifetime `'b` already in scope | ||
|
||
error: aborting due to 8 previous errors | ||
|
||
Some errors have detailed explanations: E0261, E0496. | ||
For more information about an error, try `rustc --explain E0261`. |