@@ -125,35 +125,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
125
125
self . check_expr_with_expectation ( e, expected)
126
126
}
127
127
ExprKind :: Array ( ref args) => {
128
- let uty = expected. to_option ( self ) . and_then ( |uty| {
129
- match uty. sty {
130
- ty:: Array ( ty, _) | ty:: Slice ( ty) => Some ( ty) ,
131
- _ => None
132
- }
133
- } ) ;
134
-
135
- let element_ty = if !args. is_empty ( ) {
136
- let coerce_to = uty. unwrap_or_else ( || {
137
- self . next_ty_var ( TypeVariableOrigin {
138
- kind : TypeVariableOriginKind :: TypeInference ,
139
- span : expr. span ,
140
- } )
141
- } ) ;
142
- let mut coerce = CoerceMany :: with_coercion_sites ( coerce_to, args) ;
143
- assert_eq ! ( self . diverges. get( ) , Diverges :: Maybe ) ;
144
- for e in args {
145
- let e_ty = self . check_expr_with_hint ( e, coerce_to) ;
146
- let cause = self . misc ( e. span ) ;
147
- coerce. coerce ( self , & cause, e, e_ty) ;
148
- }
149
- coerce. complete ( self )
150
- } else {
151
- self . next_ty_var ( TypeVariableOrigin {
152
- kind : TypeVariableOriginKind :: TypeInference ,
153
- span : expr. span ,
154
- } )
155
- } ;
156
- tcx. mk_array ( element_ty, args. len ( ) as u64 )
128
+ self . check_expr_array ( args, expected, expr)
157
129
}
158
130
ExprKind :: Repeat ( ref element, ref count) => {
159
131
let count_def_id = tcx. hir ( ) . local_def_id_from_hir_id ( count. hir_id ) ;
@@ -815,4 +787,41 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
815
787
}
816
788
}
817
789
}
790
+
791
+ fn check_expr_array (
792
+ & self ,
793
+ args : & ' tcx [ hir:: Expr ] ,
794
+ expected : Expectation < ' tcx > ,
795
+ expr : & ' tcx hir:: Expr
796
+ ) -> Ty < ' tcx > {
797
+ let uty = expected. to_option ( self ) . and_then ( |uty| {
798
+ match uty. sty {
799
+ ty:: Array ( ty, _) | ty:: Slice ( ty) => Some ( ty) ,
800
+ _ => None
801
+ }
802
+ } ) ;
803
+
804
+ let element_ty = if !args. is_empty ( ) {
805
+ let coerce_to = uty. unwrap_or_else ( || {
806
+ self . next_ty_var ( TypeVariableOrigin {
807
+ kind : TypeVariableOriginKind :: TypeInference ,
808
+ span : expr. span ,
809
+ } )
810
+ } ) ;
811
+ let mut coerce = CoerceMany :: with_coercion_sites ( coerce_to, args) ;
812
+ assert_eq ! ( self . diverges. get( ) , Diverges :: Maybe ) ;
813
+ for e in args {
814
+ let e_ty = self . check_expr_with_hint ( e, coerce_to) ;
815
+ let cause = self . misc ( e. span ) ;
816
+ coerce. coerce ( self , & cause, e, e_ty) ;
817
+ }
818
+ coerce. complete ( self )
819
+ } else {
820
+ self . next_ty_var ( TypeVariableOrigin {
821
+ kind : TypeVariableOriginKind :: TypeInference ,
822
+ span : expr. span ,
823
+ } )
824
+ } ;
825
+ self . tcx . mk_array ( element_ty, args. len ( ) as u64 )
826
+ }
818
827
}
0 commit comments