@@ -12,6 +12,7 @@ use rustc_hir::pat_util::EnumerateAndAdjustIterator;
1212use rustc_hir:: { HirId , Pat , PatKind } ;
1313use rustc_infer:: infer;
1414use rustc_infer:: infer:: type_variable:: { TypeVariableOrigin , TypeVariableOriginKind } ;
15+ use rustc_middle:: mir:: interpret:: ErrorHandled ;
1516use rustc_middle:: ty:: { self , Adt , BindingMode , Ty , TypeVisitableExt } ;
1617use rustc_session:: lint:: builtin:: NON_EXHAUSTIVE_OMITTED_PATTERNS ;
1718use rustc_span:: edit_distance:: find_best_match_for_name;
@@ -2164,7 +2165,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
21642165 len : ty:: Const < ' tcx > ,
21652166 min_len : u64 ,
21662167 ) -> ( Option < Ty < ' tcx > > , Ty < ' tcx > ) {
2167- let guar = if let Some ( len) = len. try_eval_target_usize ( self . tcx , self . param_env ) {
2168+ let len = match len. eval ( self . tcx , self . param_env , None ) {
2169+ Ok ( val) => val
2170+ . try_to_scalar ( )
2171+ . and_then ( |scalar| scalar. try_to_int ( ) . ok ( ) )
2172+ . and_then ( |int| int. try_to_target_usize ( self . tcx ) . ok ( ) ) ,
2173+ Err ( ErrorHandled :: Reported ( ..) ) => {
2174+ let guar = self . error_scrutinee_unfixed_length ( span) ;
2175+ return ( Some ( Ty :: new_error ( self . tcx , guar) ) , arr_ty) ;
2176+ }
2177+ Err ( ErrorHandled :: TooGeneric ( ..) ) => None ,
2178+ } ;
2179+
2180+ let guar = if let Some ( len) = len {
21682181 // Now we know the length...
21692182 if slice. is_none ( ) {
21702183 // ...and since there is no variable-length pattern,
0 commit comments