Rollup merge of #64161 - estebank:point-variant, r=Centril
Point at variant on pattern field count mismatch
This commit is contained in:
commit
6968e53a5c
5 changed files with 48 additions and 9 deletions
|
@ -675,21 +675,39 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
self.tcx.check_stability(variant.fields[i].did, Some(pat.hir_id), subpat.span);
|
self.tcx.check_stability(variant.fields[i].did, Some(pat.hir_id), subpat.span);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let subpats_ending = if subpats.len() == 1 { "" } else { "s" };
|
// Pattern has wrong number of fields.
|
||||||
let fields_ending = if variant.fields.len() == 1 { "" } else { "s" };
|
self.e0023(pat.span, res, &subpats, &variant.fields);
|
||||||
struct_span_err!(tcx.sess, pat.span, E0023,
|
|
||||||
"this pattern has {} field{}, but the corresponding {} has {} field{}",
|
|
||||||
subpats.len(), subpats_ending, res.descr(),
|
|
||||||
variant.fields.len(), fields_ending)
|
|
||||||
.span_label(pat.span, format!("expected {} field{}, found {}",
|
|
||||||
variant.fields.len(), fields_ending, subpats.len()))
|
|
||||||
.emit();
|
|
||||||
on_error();
|
on_error();
|
||||||
return tcx.types.err;
|
return tcx.types.err;
|
||||||
}
|
}
|
||||||
pat_ty
|
pat_ty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn e0023(&self, pat_span: Span, res: Res, subpats: &'tcx [P<Pat>], fields: &[ty::FieldDef]) {
|
||||||
|
let subpats_ending = if subpats.len() == 1 { "" } else { "s" };
|
||||||
|
let fields_ending = if fields.len() == 1 { "" } else { "s" };
|
||||||
|
let res_span = self.tcx.def_span(res.def_id());
|
||||||
|
struct_span_err!(
|
||||||
|
self.tcx.sess,
|
||||||
|
pat_span,
|
||||||
|
E0023,
|
||||||
|
"this pattern has {} field{}, but the corresponding {} has {} field{}",
|
||||||
|
subpats.len(),
|
||||||
|
subpats_ending,
|
||||||
|
res.descr(),
|
||||||
|
fields.len(),
|
||||||
|
fields_ending,
|
||||||
|
)
|
||||||
|
.span_label(pat_span, format!(
|
||||||
|
"expected {} field{}, found {}",
|
||||||
|
fields.len(),
|
||||||
|
fields_ending,
|
||||||
|
subpats.len(),
|
||||||
|
))
|
||||||
|
.span_label(res_span, format!("{} defined here", res.descr()))
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
|
|
||||||
fn check_pat_tuple(
|
fn check_pat_tuple(
|
||||||
&self,
|
&self,
|
||||||
span: Span,
|
span: Span,
|
||||||
|
|
|
@ -1,18 +1,27 @@
|
||||||
error[E0023]: this pattern has 1 field, but the corresponding tuple variant has 2 fields
|
error[E0023]: this pattern has 1 field, but the corresponding tuple variant has 2 fields
|
||||||
--> $DIR/E0023.rs:10:9
|
--> $DIR/E0023.rs:10:9
|
||||||
|
|
|
|
||||||
|
LL | Apple(String, String),
|
||||||
|
| --------------------- tuple variant defined here
|
||||||
|
...
|
||||||
LL | Fruit::Apple(a) => {},
|
LL | Fruit::Apple(a) => {},
|
||||||
| ^^^^^^^^^^^^^^^ expected 2 fields, found 1
|
| ^^^^^^^^^^^^^^^ expected 2 fields, found 1
|
||||||
|
|
||||||
error[E0023]: this pattern has 3 fields, but the corresponding tuple variant has 2 fields
|
error[E0023]: this pattern has 3 fields, but the corresponding tuple variant has 2 fields
|
||||||
--> $DIR/E0023.rs:11:9
|
--> $DIR/E0023.rs:11:9
|
||||||
|
|
|
|
||||||
|
LL | Apple(String, String),
|
||||||
|
| --------------------- tuple variant defined here
|
||||||
|
...
|
||||||
LL | Fruit::Apple(a, b, c) => {},
|
LL | Fruit::Apple(a, b, c) => {},
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^ expected 2 fields, found 3
|
| ^^^^^^^^^^^^^^^^^^^^^ expected 2 fields, found 3
|
||||||
|
|
||||||
error[E0023]: this pattern has 2 fields, but the corresponding tuple variant has 1 field
|
error[E0023]: this pattern has 2 fields, but the corresponding tuple variant has 1 field
|
||||||
--> $DIR/E0023.rs:12:9
|
--> $DIR/E0023.rs:12:9
|
||||||
|
|
|
|
||||||
|
LL | Pear(u32),
|
||||||
|
| --------- tuple variant defined here
|
||||||
|
...
|
||||||
LL | Fruit::Pear(1, 2) => {},
|
LL | Fruit::Pear(1, 2) => {},
|
||||||
| ^^^^^^^^^^^^^^^^^ expected 1 field, found 2
|
| ^^^^^^^^^^^^^^^^^ expected 1 field, found 2
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
error[E0023]: this pattern has 2 fields, but the corresponding tuple variant has 3 fields
|
error[E0023]: this pattern has 2 fields, but the corresponding tuple variant has 3 fields
|
||||||
--> $DIR/match-pattern-field-mismatch.rs:10:11
|
--> $DIR/match-pattern-field-mismatch.rs:10:11
|
||||||
|
|
|
|
||||||
|
LL | Rgb(usize, usize, usize),
|
||||||
|
| ------------------------ tuple variant defined here
|
||||||
|
...
|
||||||
LL | Color::Rgb(_, _) => { }
|
LL | Color::Rgb(_, _) => { }
|
||||||
| ^^^^^^^^^^^^^^^^ expected 3 fields, found 2
|
| ^^^^^^^^^^^^^^^^ expected 3 fields, found 2
|
||||||
|
|
||||||
|
|
|
@ -19,12 +19,18 @@ LL | (1, 2, .., 3, 4) => {}
|
||||||
error[E0023]: this pattern has 4 fields, but the corresponding tuple struct has 3 fields
|
error[E0023]: this pattern has 4 fields, but the corresponding tuple struct has 3 fields
|
||||||
--> $DIR/pat-tuple-overfield.rs:10:9
|
--> $DIR/pat-tuple-overfield.rs:10:9
|
||||||
|
|
|
|
||||||
|
LL | struct S(u8, u8, u8);
|
||||||
|
| --------------------- tuple struct defined here
|
||||||
|
...
|
||||||
LL | S(1, 2, 3, 4) => {}
|
LL | S(1, 2, 3, 4) => {}
|
||||||
| ^^^^^^^^^^^^^ expected 3 fields, found 4
|
| ^^^^^^^^^^^^^ expected 3 fields, found 4
|
||||||
|
|
||||||
error[E0023]: this pattern has 4 fields, but the corresponding tuple struct has 3 fields
|
error[E0023]: this pattern has 4 fields, but the corresponding tuple struct has 3 fields
|
||||||
--> $DIR/pat-tuple-overfield.rs:12:9
|
--> $DIR/pat-tuple-overfield.rs:12:9
|
||||||
|
|
|
|
||||||
|
LL | struct S(u8, u8, u8);
|
||||||
|
| --------------------- tuple struct defined here
|
||||||
|
...
|
||||||
LL | S(1, 2, .., 3, 4) => {}
|
LL | S(1, 2, .., 3, 4) => {}
|
||||||
| ^^^^^^^^^^^^^^^^^ expected 3 fields, found 4
|
| ^^^^^^^^^^^^^^^^^ expected 3 fields, found 4
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,9 @@ LL | A::D(_) => (),
|
||||||
error[E0023]: this pattern has 3 fields, but the corresponding tuple variant has 2 fields
|
error[E0023]: this pattern has 3 fields, but the corresponding tuple variant has 2 fields
|
||||||
--> $DIR/pattern-error-continue.rs:17:9
|
--> $DIR/pattern-error-continue.rs:17:9
|
||||||
|
|
|
|
||||||
|
LL | B(isize, isize),
|
||||||
|
| --------------- tuple variant defined here
|
||||||
|
...
|
||||||
LL | A::B(_, _, _) => (),
|
LL | A::B(_, _, _) => (),
|
||||||
| ^^^^^^^^^^^^^ expected 2 fields, found 3
|
| ^^^^^^^^^^^^^ expected 2 fields, found 3
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue