Skip to content

Possible type inference regression in guarded match arms #55820

@Robbepop

Description

@Robbepop

Inspecting the CI of this crate I just found out that type inference for it no longer works. This happened about 23 days ago.

The code below is a reduced example that fails with the same error. Link to playground.

enum Foo { A, B }

impl Foo {
    fn is_a(&self) -> bool { if let Foo::A = self { true } else { false } }
}

impl<'a> From<&'a str> for Foo {
    fn from(input: &'a str) -> Self { if input == "a" { Foo::A } else { Foo::B } }
}

fn foo(input: &str) {
    match input.into() {
        ref foo if foo.is_a() => println!("Foo::A"),
        Foo::B => println!("Foo::B"),
        _ => panic!()
    }
}

NOTE: The compiler can infer the types correctly if we swap the first two match arms.

Is this a bug in the compiler or wanted behavior?
I am wondering since the compiler was able to infer types correctly about 23 days ago.

CI here: https://travis-ci.org/Robbepop/stevia/jobs/452228341

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions