self.demand_eqtype_pat(pat.span, expected, pat_ty, discrim_span);
// Type-check subpatterns.
- if self.check_struct_pat_fields(pat_ty, pat.hir_id, pat.span, variant, fields, etc, def_bm)
- {
+ if self.check_struct_pat_fields(
+ pat_ty,
+ pat.hir_id,
+ pat.span,
+ variant,
+ fields,
+ etc,
+ def_bm,
+ discrim_span,
+ ) {
pat_ty
} else {
self.tcx.types.err
fields: &'tcx [hir::FieldPat<'tcx>],
etc: bool,
def_bm: BindingMode,
+ discrim_span: Option<Span>,
) -> bool {
let tcx = self.tcx;
}
};
- self.check_pat(&field.pat, field_ty, def_bm, None);
+ self.check_pat(&field.pat, field_ty, def_bm, discrim_span);
}
let mut unmentioned_fields = variant
--- /dev/null
+error[E0308]: mismatched types
+ --> $DIR/pat-struct-field-expr-has-type.rs:7:16
+ |
+LL | match (S { f: 42 }) {
+ | ------------- this expression has type `u8`
+LL | S { f: Ok(_) } => {}
+ | ^^^^^ expected `u8`, found enum `std::result::Result`
+ |
+ = note: expected type `u8`
+ found enum `std::result::Result<_, _>`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.