@@ -21,8 +21,7 @@ use middle::typeck::infer::{force_all, resolve_all, resolve_region};
2121use middle:: typeck:: infer:: resolve_type;
2222use middle:: typeck:: infer;
2323use middle:: typeck:: { MethodCall , MethodCallee } ;
24- use middle:: typeck:: { vtable_res, vtable_origin} ;
25- use middle:: typeck:: { vtable_static, vtable_param} ;
24+ use middle:: typeck:: { vtable_res, vtable_static, vtable_param} ;
2625use middle:: typeck:: write_substs_to_tcx;
2726use middle:: typeck:: write_ty_to_tcx;
2827use util:: ppaux;
@@ -100,38 +99,34 @@ fn resolve_method_map_entry(wbcx: &mut WbCtxt, sp: Span, method_call: MethodCall
10099 }
101100}
102101
103- fn resolve_vtable_map_entry ( fcx : & FnCtxt , sp : Span , id : ast :: NodeId ) {
102+ fn resolve_vtable_map_entry ( fcx : & FnCtxt , sp : Span , vtable_key : MethodCall ) {
104103 // Resolve any vtable map entry
105- match fcx. inh . vtable_map . borrow ( ) . find_copy ( & id ) {
104+ match fcx. inh . vtable_map . borrow ( ) . find_copy ( & vtable_key ) {
106105 Some ( origins) => {
107106 let r_origins = resolve_origins ( fcx, sp, origins) ;
108- fcx. ccx . vtable_map . borrow_mut ( ) . insert ( id , r_origins) ;
109- debug ! ( "writeback::resolve_vtable_map_entry(id ={}, vtables={:?})" ,
110- id , r_origins. repr( fcx. tcx( ) ) ) ;
107+ fcx. ccx . vtable_map . borrow_mut ( ) . insert ( vtable_key , r_origins) ;
108+ debug ! ( "writeback::resolve_vtable_map_entry(vtable_key ={}, vtables={:?})" ,
109+ vtable_key , r_origins. repr( fcx. tcx( ) ) ) ;
111110 }
112111 None => { }
113112 }
114113
115114 fn resolve_origins ( fcx : & FnCtxt , sp : Span ,
116115 vtbls : vtable_res ) -> vtable_res {
117- @vtbls. map ( |os| @os. map ( |o| resolve_origin ( fcx, sp, o) ) )
118- }
119-
120- fn resolve_origin ( fcx : & FnCtxt ,
121- sp : Span ,
122- origin : & vtable_origin ) -> vtable_origin {
123- match origin {
124- & vtable_static( def_id, ref tys, origins) => {
125- let r_tys = resolve_type_vars_in_types ( fcx,
126- sp,
127- tys. as_slice ( ) ) ;
128- let r_origins = resolve_origins ( fcx, sp, origins) ;
129- vtable_static ( def_id, r_tys, r_origins)
130- }
131- & vtable_param( n, b) => {
132- vtable_param ( n, b)
116+ @vtbls. map ( |os| @os. map ( |origin| {
117+ match origin {
118+ & vtable_static( def_id, ref tys, origins) => {
119+ let r_tys = resolve_type_vars_in_types ( fcx,
120+ sp,
121+ tys. as_slice ( ) ) ;
122+ let r_origins = resolve_origins ( fcx, sp, origins) ;
123+ vtable_static ( def_id, r_tys, r_origins)
124+ }
125+ & vtable_param( n, b) => {
126+ vtable_param ( n, b)
127+ }
133128 }
134- }
129+ } ) )
135130 }
136131}
137132
@@ -183,6 +178,7 @@ fn resolve_type_vars_for_node(wbcx: &mut WbCtxt, sp: Span, id: ast::NodeId)
183178 for autoderef in range ( 0 , adj. autoderefs ) {
184179 let method_call = MethodCall :: autoderef ( id, autoderef as u32 ) ;
185180 resolve_method_map_entry ( wbcx, sp, method_call) ;
181+ resolve_vtable_map_entry ( wbcx. fcx , sp, method_call) ;
186182 }
187183
188184 let fixup_region = |r| {
@@ -273,7 +269,7 @@ fn visit_expr(e: &ast::Expr, wbcx: &mut WbCtxt) {
273269
274270 resolve_type_vars_for_node ( wbcx, e. span , e. id ) ;
275271 resolve_method_map_entry ( wbcx, e. span , MethodCall :: expr ( e. id ) ) ;
276- resolve_vtable_map_entry ( wbcx. fcx , e. span , e. id ) ;
272+ resolve_vtable_map_entry ( wbcx. fcx , e. span , MethodCall :: expr ( e. id ) ) ;
277273
278274 match e. node {
279275 ast:: ExprFnBlock ( ref decl, _) | ast:: ExprProc ( ref decl, _) => {
0 commit comments