Open
Description
It seems that the compiler handles a block differently when coercing a value.
fn f(_: &str) {}
fn main() {
let x = "Akemi Homura".to_owned();
f(&x); // OK
f(&(x)); // OK
f(&{x}); // Error
}
RFC 401 says that a block with type U
is also a target for coercion, so I think this behavior is a bug.
blocks, if a block has type
U
, then the last expression in the block (if it
is not semicolon-terminated) is a coercion site toU
. This includes blocks
which are part of control flow statements, such asif
/else
, if the block
has a known type.
Also, the compiler seems to be able to coerce blocks using some "trivial" rules (e.g. &mut T
-> &T
).
fn f(_: &i32) {}
fn main() {
let x = &mut 42;
f(x); // OK
f((x)); // OK
f({x}); // OK
}
So I guess this is more likely a problem of auto-deref.