@@ -400,27 +400,36 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
400
400
let expected_ty = self . structurally_resolved_type ( pat. span , expected) ;
401
401
let ( inner_ty, slice_ty) = match expected_ty. sty {
402
402
ty:: Array ( inner_ty, size) => {
403
- let size = size. unwrap_usize ( tcx) ;
404
- let min_len = before. len ( ) as u64 + after. len ( ) as u64 ;
405
- if slice. is_none ( ) {
406
- if min_len != size {
407
- struct_span_err ! (
408
- tcx. sess, pat. span, E0527 ,
409
- "pattern requires {} elements but array has {}" ,
410
- min_len, size)
411
- . span_label ( pat. span , format ! ( "expected {} elements" , size) )
403
+ if let Some ( size) = size. assert_usize ( tcx) {
404
+ let min_len = before. len ( ) as u64 + after. len ( ) as u64 ;
405
+ if slice. is_none ( ) {
406
+ if min_len != size {
407
+ struct_span_err ! (
408
+ tcx. sess, pat. span, E0527 ,
409
+ "pattern requires {} elements but array has {}" ,
410
+ min_len, size)
411
+ . span_label ( pat. span , format ! ( "expected {} elements" , size) )
412
+ . emit ( ) ;
413
+ }
414
+ ( inner_ty, tcx. types . err )
415
+ } else if let Some ( rest) = size. checked_sub ( min_len) {
416
+ ( inner_ty, tcx. mk_array ( inner_ty, rest) )
417
+ } else {
418
+ struct_span_err ! ( tcx. sess, pat. span, E0528 ,
419
+ "pattern requires at least {} elements but array has {}" ,
420
+ min_len, size)
421
+ . span_label ( pat. span ,
422
+ format ! ( "pattern cannot match array of {} elements" , size) )
412
423
. emit ( ) ;
424
+ ( inner_ty, tcx. types . err )
413
425
}
414
- ( inner_ty, tcx. types . err )
415
- } else if let Some ( rest) = size. checked_sub ( min_len) {
416
- ( inner_ty, tcx. mk_array ( inner_ty, rest) )
417
426
} else {
418
- struct_span_err ! ( tcx . sess , pat . span , E0528 ,
419
- "pattern requires at least {} elements but array has {}" ,
420
- min_len , size )
421
- . span_label ( pat . span ,
422
- format ! ( "pattern cannot match array of {} elements" , size ) )
423
- . emit ( ) ;
427
+ struct_span_err ! (
428
+ tcx . sess ,
429
+ pat . span ,
430
+ E0730 ,
431
+ " cannot pattern- match on an array without a fixed length" ,
432
+ ) . emit ( ) ;
424
433
( inner_ty, tcx. types . err )
425
434
}
426
435
}
@@ -1080,8 +1089,18 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
1080
1089
let msg = format ! ( "expected tuple struct/variant, found {} `{}`" ,
1081
1090
res. descr( ) ,
1082
1091
hir:: print:: to_string( tcx. hir( ) , |s| s. print_qpath( qpath, false ) ) ) ;
1083
- struct_span_err ! ( tcx. sess, pat. span, E0164 , "{}" , msg)
1084
- . span_label ( pat. span , "not a tuple variant or struct" ) . emit ( ) ;
1092
+ let mut err = struct_span_err ! ( tcx. sess, pat. span, E0164 , "{}" , msg) ;
1093
+ match ( res, & pat. node ) {
1094
+ ( Res :: Def ( DefKind :: Fn , _) , _) | ( Res :: Def ( DefKind :: Method , _) , _) => {
1095
+ err. span_label ( pat. span , "`fn` calls are not allowed in patterns" ) ;
1096
+ err. help ( "for more information, visit \
1097
+ https://doc.rust-lang.org/book/ch18-00-patterns.html") ;
1098
+ }
1099
+ _ => {
1100
+ err. span_label ( pat. span , "not a tuple variant or struct" ) ;
1101
+ }
1102
+ }
1103
+ err. emit ( ) ;
1085
1104
on_error ( ) ;
1086
1105
} ;
1087
1106
0 commit comments