diff options
| -rw-r--r-- | compiler/rustc_typeck/src/check/demand.rs | 4 | ||||
| -rw-r--r-- | src/test/ui/did_you_mean/compatible-variants.rs | 15 | ||||
| -rw-r--r-- | src/test/ui/did_you_mean/compatible-variants.stderr | 10 |
3 files changed, 27 insertions, 2 deletions
diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs index 58e5c9315c3..17b08fe1e40 100644 --- a/compiler/rustc_typeck/src/check/demand.rs +++ b/compiler/rustc_typeck/src/check/demand.rs @@ -336,7 +336,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let compatible_variants: Vec<String> = expected_adt .variants() .iter() - .filter(|variant| variant.fields.len() == 1) + .filter(|variant| { + variant.fields.len() == 1 && variant.ctor_kind == hir::def::CtorKind::Fn + }) .filter_map(|variant| { let sole_field = &variant.fields[0]; let sole_field_ty = sole_field.ty(self.tcx, substs); diff --git a/src/test/ui/did_you_mean/compatible-variants.rs b/src/test/ui/did_you_mean/compatible-variants.rs index b078064b267..d9457cf5e32 100644 --- a/src/test/ui/did_you_mean/compatible-variants.rs +++ b/src/test/ui/did_you_mean/compatible-variants.rs @@ -64,3 +64,18 @@ fn main() { //~^ ERROR mismatched types //~| HELP try wrapping } + +enum A { + B { b: B}, +} + +enum B { + Fst, + Snd, +} + +fn foo() { + // We don't want to suggest `A::B(B::Fst)` here. + let a: A = B::Fst; + //~^ ERROR mismatched types +} \ No newline at end of file diff --git a/src/test/ui/did_you_mean/compatible-variants.stderr b/src/test/ui/did_you_mean/compatible-variants.stderr index 51c1bf97c4e..6224af3976b 100644 --- a/src/test/ui/did_you_mean/compatible-variants.stderr +++ b/src/test/ui/did_you_mean/compatible-variants.stderr @@ -190,6 +190,14 @@ help: try wrapping the expression in `Some` LL | let _ = Foo { bar: Some(bar) }; | ++++++++++ + -error: aborting due to 11 previous errors +error[E0308]: mismatched types + --> $DIR/compatible-variants.rs:79:16 + | +LL | let a: A = B::Fst; + | - ^^^^^^ expected enum `A`, found enum `B` + | | + | expected due to this + +error: aborting due to 12 previous errors For more information about this error, try `rustc --explain E0308`. |
