Skip to content

Commit 2a7e53a

Browse files
committed
Check that we forbid nested items, but not nested closures
1 parent fc17342 commit 2a7e53a

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/itiat-allow-nested-closures.rs:21:22
3+
|
4+
LL | type Assoc = impl Sized;
5+
| ---------- the found opaque type
6+
...
7+
LL | let _: i32 = closure();
8+
| --- ^^^^^^^^^ expected `i32`, found opaque type
9+
| |
10+
| expected due to this
11+
12+
error[E0308]: mismatched types
13+
--> $DIR/itiat-allow-nested-closures.rs:22:9
14+
|
15+
LL | fn bar() -> Self::Assoc {
16+
| ----------- expected `()` because of return type
17+
...
18+
LL | 1i32
19+
| ^^^^ expected `()`, found `i32`
20+
21+
error: aborting due to 2 previous errors
22+
23+
For more information about this error, try `rustc --explain E0308`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#![feature(impl_trait_in_assoc_type)]
2+
3+
// revisions: ok bad
4+
// [ok] check-pass
5+
6+
trait Foo {
7+
type Assoc;
8+
fn bar() -> Self::Assoc;
9+
}
10+
11+
impl Foo for () {
12+
type Assoc = impl Sized;
13+
fn bar() -> Self::Assoc {
14+
let closure = || -> Self::Assoc {
15+
#[cfg(ok)]
16+
let x: Self::Assoc = 42_i32;
17+
#[cfg(bad)]
18+
let x: Self::Assoc = ();
19+
x
20+
};
21+
let _: i32 = closure(); //[bad]~ ERROR mismatched types
22+
1i32 //[bad]~ ERROR mismatched types
23+
}
24+
}
25+
26+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#![feature(impl_trait_in_assoc_type)]
2+
3+
trait Foo {
4+
type Assoc;
5+
fn bar() -> Self::Assoc;
6+
}
7+
8+
impl Foo for () {
9+
type Assoc = impl Sized;
10+
fn bar() -> Self::Assoc {
11+
fn foo() -> <() as Foo>::Assoc {
12+
let x: <() as Foo>::Assoc = 42_i32; //~ ERROR mismatched types
13+
x
14+
};
15+
let _: i32 = foo();
16+
1i32
17+
}
18+
}
19+
20+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
error[E0308]: mismatched types
2+
--> $DIR/itiat-forbid-nested-items.rs:12:41
3+
|
4+
LL | type Assoc = impl Sized;
5+
| ---------- the expected opaque type
6+
...
7+
LL | let x: <() as Foo>::Assoc = 42_i32;
8+
| ------------------ ^^^^^^ expected opaque type, found `i32`
9+
| |
10+
| expected due to this
11+
|
12+
= note: expected opaque type `<() as Foo>::Assoc`
13+
found type `i32`
14+
note: this item must have the opaque type in its signature in order to be able to register hidden types
15+
--> $DIR/itiat-forbid-nested-items.rs:11:12
16+
|
17+
LL | fn foo() -> <() as Foo>::Assoc {
18+
| ^^^
19+
20+
error: aborting due to 1 previous error
21+
22+
For more information about this error, try `rustc --explain E0308`.

0 commit comments

Comments
 (0)