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#121386 - oli-obk:no_higher_ranked_opaques, …
…r=lcnr test that we do not support higher-ranked regions in opaque type inference We already do all the right checks in `check_opaque_type_parameter_valid`, and we have done so since at least 2 years. I collected the tests from rust-lang#116935 and rust-lang#100503 and added some more cc rust-lang#96146 r? `@lcnr`
- Loading branch information
Showing
19 changed files
with
455 additions
and
34 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
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,25 @@ | ||
// Regression test for #97099. | ||
// This was an ICE because `impl Sized` captures the lifetime 'a. | ||
|
||
// check-fail | ||
|
||
trait Trait<E> { | ||
type Assoc; | ||
} | ||
|
||
struct Foo; | ||
|
||
impl<'a> Trait<&'a ()> for Foo { | ||
type Assoc = (); | ||
} | ||
|
||
fn foo() -> impl for<'a> Trait<&'a ()> { | ||
Foo | ||
} | ||
|
||
fn bar() -> impl for<'a> Trait<&'a (), Assoc = impl Sized> { | ||
foo() | ||
//~^ ERROR hidden type for `impl Sized` captures lifetime that does not appear in bounds | ||
} | ||
|
||
fn main() {} |
13 changes: 13 additions & 0 deletions
13
tests/ui/rfcs/impl-trait/higher-ranked-regions-diag.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,13 @@ | ||
error[E0700]: hidden type for `impl Sized` captures lifetime that does not appear in bounds | ||
--> $DIR/higher-ranked-regions-diag.rs:21:5 | ||
| | ||
LL | fn bar() -> impl for<'a> Trait<&'a (), Assoc = impl Sized> { | ||
| -- ---------- opaque type defined here | ||
| | | ||
| hidden type `<impl for<'a> Trait<&'a ()> as Trait<&'a ()>>::Assoc` captures the lifetime `'a` as defined here | ||
LL | foo() | ||
| ^^^^^ | ||
|
||
error: aborting due to 1 previous error | ||
|
||
For more information about this error, try `rustc --explain E0700`. |
82 changes: 82 additions & 0 deletions
82
tests/ui/rfcs/type-alias-impl-trait/higher-ranked-regions-basic.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,82 @@ | ||
// Basic tests for opaque type inference under for<_> binders. | ||
|
||
// check-fail | ||
|
||
#![feature(type_alias_impl_trait)] | ||
|
||
trait Trait<'a> { | ||
type Ty; | ||
} | ||
impl<'a, T> Trait<'a> for T { | ||
type Ty = &'a (); | ||
} | ||
|
||
mod basic_pass { | ||
use super::*; | ||
type Opq<'a> = impl Sized + 'a; | ||
fn test() -> impl for<'a> Trait<'a, Ty = Opq<'a>> {} | ||
//~^ ERROR: expected generic lifetime parameter, found `'a` | ||
} | ||
|
||
mod capture_rpit { | ||
use super::*; | ||
fn test() -> impl for<'a> Trait<'a, Ty = impl Sized> {} | ||
//~^ ERROR hidden type for `impl Sized` captures lifetime that does not appear in bounds | ||
} | ||
|
||
mod capture_tait { | ||
use super::*; | ||
type Opq0 = impl Sized; | ||
type Opq1<'a> = impl for<'b> Trait<'b, Ty = Opq0>; | ||
type Opq2 = impl for<'a> Trait<'a, Ty = Opq1<'a>>; | ||
fn test() -> Opq2 {} | ||
//~^ ERROR hidden type for `capture_tait::Opq0` captures lifetime that does not appear in bounds | ||
} | ||
|
||
mod capture_tait_complex_pass { | ||
use super::*; | ||
type Opq0<'a> = impl Sized; | ||
type Opq1<'a> = impl for<'b> Trait<'b, Ty = Opq0<'b>>; // <- Note 'b | ||
type Opq2 = impl for<'a> Trait<'a, Ty = Opq1<'a>>; | ||
fn test() -> Opq2 {} | ||
//~^ ERROR: expected generic lifetime parameter, found `'a` | ||
} | ||
|
||
// Same as the above, but make sure that different placeholder regions are not equal. | ||
mod capture_tait_complex_fail { | ||
use super::*; | ||
type Opq0<'a> = impl Sized; | ||
type Opq1<'a> = impl for<'b> Trait<'b, Ty = Opq0<'a>>; // <- Note 'a | ||
type Opq2 = impl for<'a> Trait<'a, Ty = Opq1<'a>>; | ||
fn test() -> Opq2 {} | ||
//~^ ERROR hidden type for `capture_tait_complex_fail::Opq0<'a>` captures lifetime that does not appear in bounds | ||
} | ||
|
||
// non-defining use because 'static is used. | ||
mod constrain_fail0 { | ||
use super::*; | ||
type Opq0<'a, 'b> = impl Sized; | ||
fn test() -> impl for<'a> Trait<'a, Ty = Opq0<'a, 'static>> {} | ||
//~^ ERROR non-defining opaque type use in defining scope | ||
//~| ERROR: expected generic lifetime parameter, found `'a` | ||
} | ||
|
||
// non-defining use because generic lifetime is used multiple times. | ||
mod constrain_fail { | ||
use super::*; | ||
type Opq0<'a, 'b> = impl Sized; | ||
fn test() -> impl for<'a> Trait<'a, Ty = Opq0<'a, 'a>> {} | ||
//~^ ERROR non-defining opaque type use in defining scope | ||
//~| ERROR: expected generic lifetime parameter, found `'a` | ||
} | ||
|
||
mod constrain_pass { | ||
use super::*; | ||
type Opq0<'a, 'b> = impl Sized; | ||
type Opq1<'a> = impl for<'b> Trait<'b, Ty = Opq0<'a, 'b>>; | ||
type Opq2 = impl for<'a> Trait<'a, Ty = Opq1<'a>>; | ||
fn test() -> Opq2 {} | ||
//~^ ERROR: expected generic lifetime parameter, found `'a` | ||
} | ||
|
||
fn main() {} |
Oops, something went wrong.