Skip to content

Commit 7db8904

Browse files
committed
Add test for issue-70877
1 parent 043eca7 commit 7db8904

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#![feature(type_alias_impl_trait)]
2+
#![feature(impl_trait_in_bindings)]
3+
#![allow(incomplete_features)]
4+
5+
type FooArg<'a> = &'a dyn ToString;
6+
type FooRet = impl std::fmt::Debug;
7+
8+
type FooItem = Box<dyn Fn(FooArg) -> FooRet>;
9+
type Foo = impl Iterator<Item = FooItem>; //~ ERROR: type mismatch
10+
11+
#[repr(C)]
12+
struct Bar(u8);
13+
14+
impl Iterator for Bar {
15+
type Item = FooItem;
16+
17+
fn next(&mut self) -> Option<Self::Item> {
18+
Some(Box::new(quux))
19+
}
20+
}
21+
22+
fn quux(st: FooArg) -> FooRet {
23+
Some(st.to_string())
24+
}
25+
26+
fn ham() -> Foo {
27+
Bar(1)
28+
}
29+
30+
fn oof() -> impl std::fmt::Debug {
31+
let mut bar = ham();
32+
let func = bar.next().unwrap();
33+
return func(&"oof");
34+
}
35+
36+
fn main() {
37+
let _ = oof();
38+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
error[E0271]: type mismatch resolving `<Bar as Iterator>::Item == Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option<String> + 'static)>`
2+
--> $DIR/issue-70877.rs:9:12
3+
|
4+
LL | type FooRet = impl std::fmt::Debug;
5+
| -------------------- the expected opaque type
6+
...
7+
LL | type Foo = impl Iterator<Item = FooItem>;
8+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected opaque type, found enum `Option`
9+
|
10+
= note: expected struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> impl Debug + 'static)>`
11+
found struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option<String> + 'static)>`
12+
13+
error: aborting due to previous error
14+
15+
For more information about this error, try `rustc --explain E0271`.

0 commit comments

Comments
 (0)