@@ -2387,18 +2387,30 @@ fn try_index_step<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
23872387 base_expr : & ast:: Expr ,
23882388 adjusted_ty : Ty < ' tcx > ,
23892389 adjustment : ty:: AutoDerefRef < ' tcx > ,
2390- lvalue_pref : LvaluePreference )
2390+ lvalue_pref : LvaluePreference ,
2391+ index_ty : Ty < ' tcx > )
23912392 -> Option < ( /*index type*/ Ty < ' tcx > , /*element type*/ Ty < ' tcx > ) >
23922393{
23932394 let tcx = fcx. tcx ( ) ;
2394- debug ! ( "try_index_step(expr={}, base_expr.id={}, adjusted_ty={}, adjustment={})" ,
2395+ debug ! ( "try_index_step(expr={}, base_expr.id={}, adjusted_ty={}, adjustment={}, index_ty={} )" ,
23952396 expr. repr( tcx) ,
23962397 base_expr. repr( tcx) ,
23972398 adjusted_ty. repr( tcx) ,
2398- adjustment) ;
2399+ adjustment,
2400+ index_ty. repr( tcx) ) ;
23992401
24002402 let input_ty = fcx. infcx ( ) . next_ty_var ( ) ;
24012403
2404+ // First, try built-in indexing.
2405+ match ( ty:: index ( adjusted_ty) , & index_ty. sty ) {
2406+ ( Some ( ty) , & ty:: ty_uint( ast:: TyU ) ) | ( Some ( ty) , & ty:: ty_infer( ty:: IntVar ( _) ) ) => {
2407+ debug ! ( "try_index_step: success, using built-in indexing" ) ;
2408+ fcx. write_adjustment ( base_expr. id , base_expr. span , ty:: AdjustDerefRef ( adjustment) ) ;
2409+ return Some ( ( tcx. types . uint , ty) ) ;
2410+ }
2411+ _ => { }
2412+ }
2413+
24022414 // Try `IndexMut` first, if preferred.
24032415 let method = match ( lvalue_pref, tcx. lang_items . index_mut_trait ( ) ) {
24042416 ( PreferMutLvalue , Some ( trait_did) ) => {
@@ -2429,18 +2441,6 @@ fn try_index_step<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
24292441 ( method, _) => method,
24302442 } ;
24312443
2432- if method. is_none ( ) {
2433- // If there are no overridden index impls, use built-in indexing.
2434- match ty:: index ( adjusted_ty) {
2435- Some ( ty) => {
2436- debug ! ( "try_index_step: success, using built-in indexing" ) ;
2437- fcx. write_adjustment ( base_expr. id , base_expr. span , ty:: AdjustDerefRef ( adjustment) ) ;
2438- return Some ( ( tcx. types . uint , ty) ) ;
2439- }
2440- None => { }
2441- }
2442- }
2443-
24442444 // If some lookup succeeds, write callee into table and extract index/element
24452445 // type from the method signature.
24462446 // If some lookup succeeded, install method in table
@@ -4205,11 +4205,14 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
42054205 & * * base,
42064206 adj_ty,
42074207 adj,
4208- lvalue_pref)
4208+ lvalue_pref,
4209+ idx_t)
42094210 } ) ;
42104211
42114212 match result {
42124213 Some ( ( index_ty, element_ty) ) => {
4214+ // FIXME: we've already checked idx above, we should
4215+ // probably just demand subtype or something here.
42134216 check_expr_has_type ( fcx, & * * idx, index_ty) ;
42144217 fcx. write_ty ( id, element_ty) ;
42154218 }
0 commit comments