Skip to content

Deref coercions do not work with blocks #26978

Open
@barosl

Description

@barosl
Contributor

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 to U. This includes blocks
which are part of control flow statements, such as if/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.

Activity

Gankra

Gankra commented on Jul 11, 2015

@Gankra
Contributor

CC @nrc

bluss

bluss commented on Jul 12, 2015

@bluss
Member

As some users have discovered, {x}.item can be used to force a x: &mut X to move instead of reborrow. Is that related? We might not be allowed to break that.

changed the title [-]Auto-deref does not work with blocks[/-] [+]Deref coercions do not work with blocks[/+] on Jul 12, 2015
nrc

nrc commented on Jul 12, 2015

@nrc
Member

I suspect this is something specific to deref coercions. I think it is 'just a bug', but I don't know how easy it is to fix.

tbu-

tbu- commented on Aug 20, 2015

@tbu-
Contributor

This blocks usage of try! together with deref coercions if I understand this bug correctly:

let _: &Path = &try!(env::current_dir()); fails to compile.

barosl

barosl commented on Aug 21, 2015

@barosl
ContributorAuthor

@tbu- Yup, actually this issue was found by a Stack Overflow question that tried the same thing.

llogiq

llogiq commented on Sep 19, 2015

@llogiq
Contributor

There is also this rust-users thread with a very similar problem.

nrc

nrc commented on Sep 21, 2015

@nrc
Member

triage: I-nominated

nrc

nrc commented on Sep 21, 2015

@nrc
Member

triaged because it is such an annoying bug. Recommend p-medium.

added
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Sep 21, 2015
nikomatsakis

nikomatsakis commented on Oct 1, 2015

@nikomatsakis
Contributor

19 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-type-systemArea: Type systemP-mediumMedium priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-typesRelevant to the types team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @eddyb@nikomatsakis@barosl@nrc@Gankra

      Issue actions

        Deref coercions do not work with blocks · Issue #26978 · rust-lang/rust