Skip to content

Commit

Permalink
Check that we forbid nested items, but not nested closures
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Jan 16, 2024
1 parent fc17342 commit 2a7e53a
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
error[E0308]: mismatched types
--> $DIR/itiat-allow-nested-closures.rs:21:22
|
LL | type Assoc = impl Sized;
| ---------- the found opaque type
...
LL | let _: i32 = closure();
| --- ^^^^^^^^^ expected `i32`, found opaque type
| |
| expected due to this

error[E0308]: mismatched types
--> $DIR/itiat-allow-nested-closures.rs:22:9
|
LL | fn bar() -> Self::Assoc {
| ----------- expected `()` because of return type
...
LL | 1i32
| ^^^^ expected `()`, found `i32`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.
26 changes: 26 additions & 0 deletions tests/ui/type-alias-impl-trait/itiat-allow-nested-closures.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#![feature(impl_trait_in_assoc_type)]

// revisions: ok bad
// [ok] check-pass

trait Foo {
type Assoc;
fn bar() -> Self::Assoc;
}

impl Foo for () {
type Assoc = impl Sized;
fn bar() -> Self::Assoc {
let closure = || -> Self::Assoc {
#[cfg(ok)]
let x: Self::Assoc = 42_i32;
#[cfg(bad)]
let x: Self::Assoc = ();
x
};
let _: i32 = closure(); //[bad]~ ERROR mismatched types
1i32 //[bad]~ ERROR mismatched types
}
}

fn main() {}
20 changes: 20 additions & 0 deletions tests/ui/type-alias-impl-trait/itiat-forbid-nested-items.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#![feature(impl_trait_in_assoc_type)]

trait Foo {
type Assoc;
fn bar() -> Self::Assoc;
}

impl Foo for () {
type Assoc = impl Sized;
fn bar() -> Self::Assoc {
fn foo() -> <() as Foo>::Assoc {
let x: <() as Foo>::Assoc = 42_i32; //~ ERROR mismatched types
x
};
let _: i32 = foo();
1i32
}
}

fn main() {}
22 changes: 22 additions & 0 deletions tests/ui/type-alias-impl-trait/itiat-forbid-nested-items.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
error[E0308]: mismatched types
--> $DIR/itiat-forbid-nested-items.rs:12:41
|
LL | type Assoc = impl Sized;
| ---------- the expected opaque type
...
LL | let x: <() as Foo>::Assoc = 42_i32;
| ------------------ ^^^^^^ expected opaque type, found `i32`
| |
| expected due to this
|
= note: expected opaque type `<() as Foo>::Assoc`
found type `i32`
note: this item must have the opaque type in its signature in order to be able to register hidden types
--> $DIR/itiat-forbid-nested-items.rs:11:12
|
LL | fn foo() -> <() as Foo>::Assoc {
| ^^^

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0308`.

0 comments on commit 2a7e53a

Please sign in to comment.