Skip to content

Possible type inference regression in guarded match arms #55820

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions