8

Fix non-capturing closure return type coercion by FabianWolff · Pull Request #88...

 3 years ago
source link: https://github.com/rust-lang/rust/pull/88147
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Copy link

Contributor

FabianWolff commented on Aug 18

Fixes #88097. For the example given there:

fn peculiar() -> impl Fn(u8) -> u8 {
    return |x| x + 1
}

which incorrectly reports an error, I noticed something weird in the debug log:

DEBUG rustc_typeck::check::coercion coercion::try_find_coercion_lub([[email protected]:2:12: 2:21], [[email protected]:2:12: 2:21], exprs=1 exprs)

Apparently, try_find_coercion_lub() thinks that the LUB for two closure types always has to be a function pointer (which explains the expected closure, found fn pointer error in #88097). There is one corner case where that isn't true, though — namely, when the two closure types are equal, in which case the trivial LUB is the type itself. This PR fixes this by inserting an explicit check for type equality in try_find_coercion_lub().


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK