@@ -400,27 +400,36 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
400400 let expected_ty = self . structurally_resolved_type ( pat. span , expected) ;
401401 let ( inner_ty, slice_ty) = match expected_ty. sty {
402402 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) )
412423 . emit ( ) ;
424+ ( inner_ty, tcx. types . err )
413425 }
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) )
417426 } 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 ( ) ;
424433 ( inner_ty, tcx. types . err )
425434 }
426435 }
@@ -1080,8 +1089,18 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
10801089 let msg = format ! ( "expected tuple struct/variant, found {} `{}`" ,
10811090 res. descr( ) ,
10821091 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 ( ) ;
10851104 on_error ( ) ;
10861105 } ;
10871106
0 commit comments