Closed
Description
I tried this code:
#![feature(impl_trait_in_fn_trait_return)]
#![feature(unboxed_closures)] // only for `h`
use std::fmt::Debug;
// Fails??
fn f<T>() -> impl Fn(T) -> impl Debug {
|_x| 15
}
// Works?...
fn g<T>() -> impl MyFn<(T,), Out = impl Debug> {
|_x| 15
}
trait MyFn<T> { type Out; }
impl<T, U, F: Fn(T) -> U> MyFn<(T,)> for F { type Out = U; }
// Also fails??
fn h<T>() -> impl Fn<(T,), Output = impl Debug> {
|_x| 15
}
// Works??????
fn f_<T>() -> impl Fn(T) -> impl Debug {
std::convert::identity(|_x| 15)
}
// Works?????
fn f__<T>() -> impl Fn(T) -> impl Debug {
let r = |_x| 15;
r
}
I expected to see this happen: all of the above functions successfully compile.
Instead, this happened: f
and h
do not compile for no clear reason, while g
, f_
and f__
do compile, even though they are all almost identical.
Compiler output
error: concrete type differs from previous defining opaque type use
--> src/lib.rs:8:10
|
8 | |_x| 15
| ^^ expected `impl Debug`, got `i32`
|
note: previous use here
--> src/lib.rs:8:5
|
8 | |_x| 15
| ^^^^^^^
error[[E0720]](https://doc.rust-lang.org/nightly/error-index.html#E0720): cannot resolve opaque type
--> src/lib.rs:7:28
|
7 | fn f<T>() -> impl Fn(T) -> impl Debug {
| ^^^^^^^^^^ cannot resolve opaque type
error: concrete type differs from previous defining opaque type use
--> src/lib.rs:21:10
|
21 | |_x| 15
| ^^ expected `impl Debug`, got `i32`
|
note: previous use here
--> src/lib.rs:21:5
|
21 | |_x| 15
| ^^^^^^^
error[[E0720]](https://doc.rust-lang.org/nightly/error-index.html#E0720): cannot resolve opaque type
--> src/lib.rs:20:37
|
20 | fn h<T>() -> impl Fn<(T,), Output = impl Debug> {
| ^^^^^^^^^^ cannot resolve opaque type
Meta
Rustc version:
1.69.0-nightly (2023-02-09 8996ea93b6e554148c42)
Metadata
Metadata
Assignees
Labels
Area: Closures (`|…| { … }`)Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.Area: Type systemCategory: This is a bug.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.`#![feature(impl_trait_in_fn_trait_return)]`Relevant to the types team, which will review and decide on the PR/issue.