@@ -40,7 +40,6 @@ use rustc_data_structures::sync::Lrc;
40
40
use syntax:: ast;
41
41
use syntax:: attr;
42
42
use syntax_pos:: { Span , DUMMY_SP } ;
43
- use rustc:: hir:: intravisit:: { Visitor , NestedVisitorMap } ;
44
43
45
44
pub fn provide ( providers : & mut Providers ) {
46
45
* providers = Providers {
@@ -169,12 +168,7 @@ impl<'a, 'gcx> CheckCrateVisitor<'a, 'gcx> {
169
168
}
170
169
}
171
170
172
- impl < ' a , ' tcx > Visitor < ' tcx > for CheckCrateVisitor < ' a , ' tcx > {
173
- fn nested_visit_map < ' this > ( & ' this mut self ) -> NestedVisitorMap < ' this , ' tcx > {
174
- // note that we *do* visit nested bodies, because we override `visit_nested_body` below
175
- NestedVisitorMap :: None
176
- }
177
-
171
+ impl < ' a , ' tcx > CheckCrateVisitor < ' a , ' tcx > {
178
172
fn visit_nested_body ( & mut self , body_id : hir:: BodyId ) {
179
173
let item_id = self . tcx . hir . body_owner ( body_id) ;
180
174
let item_def_id = self . tcx . hir . local_def_id ( item_id) ;
@@ -206,8 +200,7 @@ impl<'a, 'tcx> Visitor<'tcx> for CheckCrateVisitor<'a, 'tcx> {
206
200
euv:: ExprUseVisitor :: new ( self , tcx, param_env, & region_scope_tree, self . tables , None )
207
201
. consume_body ( body) ;
208
202
209
- self . visit_body ( body) ;
210
-
203
+ self . visit_expr ( & body. value ) ;
211
204
self . in_fn = outer_in_fn;
212
205
self . tables = outer_tables;
213
206
self . param_env = outer_param_env;
@@ -216,27 +209,29 @@ impl<'a, 'tcx> Visitor<'tcx> for CheckCrateVisitor<'a, 'tcx> {
216
209
217
210
fn visit_stmt ( & mut self , stmt : & ' tcx hir:: Stmt ) {
218
211
match stmt. node {
219
- hir:: StmtDecl ( ref decl, node_id) => {
220
- self . visit_id ( node_id) ;
221
- self . visit_decl ( decl) ;
212
+ hir:: StmtDecl ( ref decl, _node_id) => {
222
213
match & decl. node {
223
214
hir:: DeclLocal ( local) => {
224
215
self . promotable = false ;
225
-
226
216
if self . remove_mut_rvalue_borrow ( & local. pat ) {
227
217
if let Some ( init) = & local. init {
228
218
self . mut_rvalue_borrows . insert ( init. id ) ;
229
219
}
230
220
}
221
+
222
+ match local. init {
223
+ Some ( ref expr) => self . visit_expr ( & expr) ,
224
+ None => { } ,
225
+ }
231
226
}
232
227
// Item statements are allowed
233
228
hir:: DeclItem ( _) => { }
234
229
}
235
230
}
236
- hir:: StmtExpr ( ref box_expr, node_id ) |
237
- hir:: StmtSemi ( ref box_expr, node_id ) => {
231
+ hir:: StmtExpr ( ref box_expr, _node_id ) |
232
+ hir:: StmtSemi ( ref box_expr, _node_id ) => {
238
233
self . visit_expr ( box_expr) ;
239
- self . visit_id ( node_id ) ;
234
+ self . promotable = false ;
240
235
}
241
236
}
242
237
}
@@ -293,12 +288,18 @@ fn check_expr<'a, 'tcx>(
293
288
v. promotable = false ;
294
289
}
295
290
hir:: ExprUnary ( op, ref expr) => {
296
- v. visit_expr ( expr) ;
291
+ if v. tables . is_method_call ( e) {
292
+ v. promotable = false ;
293
+ }
297
294
if op == hir:: UnDeref {
298
295
v. promotable = false ;
299
296
}
297
+ v. visit_expr ( expr) ;
300
298
}
301
299
hir:: ExprBinary ( op, ref lhs, ref rhs) => {
300
+ if v. tables . is_method_call ( e) {
301
+ v. promotable = false ;
302
+ }
302
303
v. visit_expr ( lhs) ;
303
304
v. visit_expr ( rhs) ;
304
305
match v. tables . node_id_to_type ( lhs. hir_id ) . sty {
@@ -324,7 +325,6 @@ fn check_expr<'a, 'tcx>(
324
325
}
325
326
}
326
327
hir:: ExprPath ( ref qpath) => {
327
- v. visit_qpath ( qpath, e. id , e. span ) ;
328
328
let def = v. tables . qpath_def ( qpath, e. hir_id ) ;
329
329
match def {
330
330
Def :: VariantCtor ( ..) | Def :: StructCtor ( ..) |
@@ -450,11 +450,8 @@ fn check_expr<'a, 'tcx>(
450
450
451
451
hir:: ExprLit ( _) => { }
452
452
453
- hir:: ExprAddrOf ( ref _mutability, ref expr) => {
454
- v. visit_expr ( expr) ;
455
- }
456
-
457
- hir:: ExprRepeat ( ref expr, ref _anon_cast) => {
453
+ hir:: ExprAddrOf ( _, ref expr) |
454
+ hir:: ExprRepeat ( ref expr, _) => {
458
455
v. visit_expr ( expr) ;
459
456
}
460
457
@@ -520,14 +517,10 @@ fn check_expr<'a, 'tcx>(
520
517
521
518
v. visit_expr ( expr) ;
522
519
for index in hirvec_arm. iter ( ) {
523
- match * index {
524
- ref arm => {
525
- v. visit_expr ( & * arm. body ) ;
526
- match arm. guard {
527
- Some ( ref expr) => v. visit_expr ( & expr) ,
528
- None => { } ,
529
- }
530
- }
520
+ v. visit_expr ( & * index. body ) ;
521
+ match index. guard {
522
+ Some ( ref expr) => v. visit_expr ( & expr) ,
523
+ None => { } ,
531
524
}
532
525
}
533
526
v. promotable = false ;
0 commit comments