@@ -21,8 +21,7 @@ use middle::typeck::infer::{force_all, resolve_all, resolve_region};
21
21
use middle:: typeck:: infer:: resolve_type;
22
22
use middle:: typeck:: infer;
23
23
use 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} ;
26
25
use middle:: typeck:: write_substs_to_tcx;
27
26
use middle:: typeck:: write_ty_to_tcx;
28
27
use util:: ppaux;
@@ -100,38 +99,34 @@ fn resolve_method_map_entry(wbcx: &mut WbCtxt, sp: Span, method_call: MethodCall
100
99
}
101
100
}
102
101
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 ) {
104
103
// 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 ) {
106
105
Some ( origins) => {
107
106
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( ) ) ) ;
111
110
}
112
111
None => { }
113
112
}
114
113
115
114
fn resolve_origins ( fcx : & FnCtxt , sp : Span ,
116
115
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
+ }
133
128
}
134
- }
129
+ } ) )
135
130
}
136
131
}
137
132
@@ -183,6 +178,7 @@ fn resolve_type_vars_for_node(wbcx: &mut WbCtxt, sp: Span, id: ast::NodeId)
183
178
for autoderef in range ( 0 , adj. autoderefs ) {
184
179
let method_call = MethodCall :: autoderef ( id, autoderef as u32 ) ;
185
180
resolve_method_map_entry ( wbcx, sp, method_call) ;
181
+ resolve_vtable_map_entry ( wbcx. fcx , sp, method_call) ;
186
182
}
187
183
188
184
let fixup_region = |r| {
@@ -273,7 +269,7 @@ fn visit_expr(e: &ast::Expr, wbcx: &mut WbCtxt) {
273
269
274
270
resolve_type_vars_for_node ( wbcx, e. span , e. id ) ;
275
271
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 ) ) ;
277
273
278
274
match e. node {
279
275
ast:: ExprFnBlock ( ref decl, _) | ast:: ExprProc ( ref decl, _) => {
0 commit comments