diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-12-30 07:27:56 +0100 |
|---|---|---|
| committer | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-12-30 13:50:20 +0100 |
| commit | 960acb044bcefc46520cee263b6877160fd296ca (patch) | |
| tree | b0f7a946f127e0e9fdac7bb74a5d8c10470e41ef /src | |
| parent | ab050d6a83a9bdc5856a20402b6ea440d474638c (diff) | |
| download | rust-960acb044bcefc46520cee263b6877160fd296ca.tar.gz rust-960acb044bcefc46520cee263b6877160fd296ca.zip | |
Show scrutinee expr type for struct fields.
TODO: The type is wrong and will be fixed in later commits.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_typeck/check/pat.rs | 15 | ||||
| -rw-r--r-- | src/test/ui/pattern/pat-struct-field-expr-has-type.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/pattern/pat-struct-field-expr-has-type.stderr | 14 |
3 files changed, 35 insertions, 3 deletions
diff --git a/src/librustc_typeck/check/pat.rs b/src/librustc_typeck/check/pat.rs index 397f8682ede..1f374c3fe20 100644 --- a/src/librustc_typeck/check/pat.rs +++ b/src/librustc_typeck/check/pat.rs @@ -577,8 +577,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { 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 @@ -859,6 +867,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { fields: &'tcx [hir::FieldPat<'tcx>], etc: bool, def_bm: BindingMode, + discrim_span: Option<Span>, ) -> bool { let tcx = self.tcx; @@ -908,7 +917,7 @@ impl<'a, 'tcx> FnCtxt<'a, '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 diff --git a/src/test/ui/pattern/pat-struct-field-expr-has-type.rs b/src/test/ui/pattern/pat-struct-field-expr-has-type.rs new file mode 100644 index 00000000000..1d18214de7f --- /dev/null +++ b/src/test/ui/pattern/pat-struct-field-expr-has-type.rs @@ -0,0 +1,9 @@ +struct S { + f: u8, +} + +fn main() { + match (S { f: 42 }) { + S { f: Ok(_) } => {} //~ ERROR mismatched types + } +} diff --git a/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr b/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr new file mode 100644 index 00000000000..7962c376a92 --- /dev/null +++ b/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr @@ -0,0 +1,14 @@ +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`. |
