@@ -245,29 +245,18 @@ TypeCheckExpr::visit (HIR::RangeFromToInclExpr &expr)
245
245
void
246
246
TypeCheckExpr::visit (HIR::ArrayIndexExpr &expr)
247
247
{
248
- TyTy::BaseType *size_ty;
249
- if (!context->lookup_builtin (" usize" , &size_ty))
250
- {
251
- rust_error_at (
252
- expr.get_locus (),
253
- " Failure looking up size type for index in ArrayIndexExpr" );
254
- return ;
255
- }
256
-
257
- auto resolved_index_expr
258
- = size_ty->unify (TypeCheckExpr::Resolve (expr.get_index_expr (), false ));
259
- if (resolved_index_expr->get_kind () != TyTy::TypeKind::ERROR)
260
- {
261
- // allow the index expr to fail lets just continue on
262
- context->insert_type (expr.get_index_expr ()->get_mappings (),
263
- resolved_index_expr);
264
- }
265
-
266
248
auto array_expr_ty
267
249
= TypeCheckExpr::Resolve (expr.get_array_expr (), inside_loop);
268
250
if (array_expr_ty->get_kind () == TyTy::TypeKind::ERROR)
269
251
return ;
270
- else if (array_expr_ty->get_kind () == TyTy::TypeKind::REF)
252
+
253
+ auto index_expr_ty = TypeCheckExpr::Resolve (expr.get_index_expr (), false );
254
+ if (index_expr_ty->get_kind () == TyTy::TypeKind::ERROR)
255
+ return ;
256
+
257
+ // is this a case of core::ops::index?
258
+
259
+ if (array_expr_ty->get_kind () == TyTy::TypeKind::REF)
271
260
{
272
261
// lets try and deref it since rust allows this
273
262
auto ref = static_cast <TyTy::ReferenceType *> (array_expr_ty);
@@ -284,6 +273,15 @@ TypeCheckExpr::visit (HIR::ArrayIndexExpr &expr)
284
273
return ;
285
274
}
286
275
276
+ TyTy::BaseType *size_ty;
277
+ bool ok = context->lookup_builtin (" usize" , &size_ty);
278
+ rust_assert (ok);
279
+
280
+ auto resolved_index_expr
281
+ = size_ty->unify (TypeCheckExpr::Resolve (expr.get_index_expr (), false ));
282
+ if (resolved_index_expr->get_kind () == TyTy::TypeKind::ERROR)
283
+ return ;
284
+
287
285
TyTy::ArrayType *array_type = static_cast <TyTy::ArrayType *> (array_expr_ty);
288
286
infered = array_type->get_element_type ()->clone ();
289
287
}
0 commit comments