1
1
use crate :: cfg:: * ;
2
2
use crate :: middle:: region;
3
3
use rustc_data_structures:: graph:: implementation as graph;
4
- use syntax:: ptr:: P ;
5
4
use crate :: ty:: { self , TyCtxt } ;
6
5
6
+ use crate :: hir:: ptr:: P ;
7
7
use crate :: hir:: { self , PatKind } ;
8
8
use crate :: hir:: def_id:: DefId ;
9
9
@@ -66,7 +66,7 @@ pub fn construct<'tcx>(tcx: TyCtxt<'tcx>, body: &hir::Body) -> CFG {
66
66
}
67
67
68
68
impl < ' a , ' tcx > CFGBuilder < ' a , ' tcx > {
69
- fn block ( & mut self , blk : & hir:: Block , pred : CFGIndex ) -> CFGIndex {
69
+ fn block ( & mut self , blk : & hir:: Block < ' _ > , pred : CFGIndex ) -> CFGIndex {
70
70
if blk. targeted_by_break {
71
71
let expr_exit = self . add_ast_node ( blk. hir_id . local_id , & [ ] ) ;
72
72
@@ -97,7 +97,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
97
97
}
98
98
}
99
99
100
- fn stmt ( & mut self , stmt : & hir:: Stmt , pred : CFGIndex ) -> CFGIndex {
100
+ fn stmt ( & mut self , stmt : & hir:: Stmt < ' _ > , pred : CFGIndex ) -> CFGIndex {
101
101
let exit = match stmt. node {
102
102
hir:: StmtKind :: Local ( ref local) => {
103
103
let init_exit = self . opt_expr ( & local. init , pred) ;
@@ -114,7 +114,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
114
114
self . add_ast_node ( stmt. hir_id . local_id , & [ exit] )
115
115
}
116
116
117
- fn pat ( & mut self , pat : & hir:: Pat , pred : CFGIndex ) -> CFGIndex {
117
+ fn pat ( & mut self , pat : & hir:: Pat < ' _ > , pred : CFGIndex ) -> CFGIndex {
118
118
match pat. node {
119
119
PatKind :: Binding ( .., None ) |
120
120
PatKind :: Path ( _) |
@@ -149,16 +149,14 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
149
149
}
150
150
}
151
151
152
- fn pats_all < ' b , I : Iterator < Item =& ' b P < hir:: Pat > > > (
153
- & mut self ,
154
- pats : I ,
155
- pred : CFGIndex
156
- ) -> CFGIndex {
152
+ fn pats_all < ' b , ' h : ' b , I : Iterator < Item =& ' b P < ' h , hir:: Pat < ' h > > > > ( & mut self ,
153
+ pats : I ,
154
+ pred : CFGIndex ) -> CFGIndex {
157
155
//! Handles case where all of the patterns must match.
158
156
pats. fold ( pred, |pred, pat| self . pat ( & pat, pred) )
159
157
}
160
158
161
- fn expr ( & mut self , expr : & hir:: Expr , pred : CFGIndex ) -> CFGIndex {
159
+ fn expr ( & mut self , expr : & hir:: Expr < ' _ > , pred : CFGIndex ) -> CFGIndex {
162
160
match expr. node {
163
161
hir:: ExprKind :: Block ( ref blk, _) => {
164
162
let blk_exit = self . block ( & blk, pred) ;
@@ -297,7 +295,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
297
295
298
296
hir:: ExprKind :: Index ( ref l, ref r) |
299
297
hir:: ExprKind :: Binary ( _, ref l, ref r) if self . tables . is_method_call ( expr) => {
300
- self . call ( expr, pred, & l, Some ( & * * r) . into_iter ( ) )
298
+ self . call ( expr, pred, & l, Some ( & * * * r) . into_iter ( ) )
301
299
}
302
300
303
301
hir:: ExprKind :: Unary ( _, ref e) if self . tables . is_method_call ( expr) => {
@@ -309,18 +307,18 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
309
307
}
310
308
311
309
hir:: ExprKind :: Struct ( _, ref fields, ref base) => {
312
- let field_cfg = self . straightline ( expr, pred, fields. iter ( ) . map ( |f| & * f. expr ) ) ;
310
+ let field_cfg = self . straightline ( expr, pred, fields. iter ( ) . map ( |f| & * * f. expr ) ) ;
313
311
self . opt_expr ( base, field_cfg)
314
312
}
315
313
316
314
hir:: ExprKind :: Assign ( ref l, ref r) |
317
315
hir:: ExprKind :: AssignOp ( _, ref l, ref r) => {
318
- self . straightline ( expr, pred, [ r, l] . iter ( ) . map ( |& e| & * * e) )
316
+ self . straightline ( expr, pred, [ r, l] . iter ( ) . map ( |& e| & * * * e) )
319
317
}
320
318
321
319
hir:: ExprKind :: Index ( ref l, ref r) |
322
320
hir:: ExprKind :: Binary ( _, ref l, ref r) => { // N.B., && and || handled earlier
323
- self . straightline ( expr, pred, [ l, r] . iter ( ) . map ( |& e| & * * e) )
321
+ self . straightline ( expr, pred, [ l, r] . iter ( ) . map ( |& e| & * * * e) )
324
322
}
325
323
326
324
hir:: ExprKind :: Box ( ref e) |
@@ -332,7 +330,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
332
330
hir:: ExprKind :: Field ( ref e, _) |
333
331
hir:: ExprKind :: Yield ( ref e) |
334
332
hir:: ExprKind :: Repeat ( ref e, _) => {
335
- self . straightline ( expr, pred, Some ( & * * e) . into_iter ( ) )
333
+ self . straightline ( expr, pred, Some ( & * * * e) . into_iter ( ) )
336
334
}
337
335
338
336
hir:: ExprKind :: InlineAsm ( _, ref outputs, ref inputs) => {
@@ -350,10 +348,10 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
350
348
}
351
349
}
352
350
353
- fn call < ' b , I : Iterator < Item =& ' b hir:: Expr > > ( & mut self ,
354
- call_expr : & hir:: Expr ,
351
+ fn call < ' b , ' h : ' b , I : Iterator < Item =& ' b hir:: Expr < ' h > > > ( & mut self ,
352
+ call_expr : & hir:: Expr < ' _ > ,
355
353
pred : CFGIndex ,
356
- func_or_rcvr : & hir:: Expr ,
354
+ func_or_rcvr : & hir:: Expr < ' _ > ,
357
355
args : I ) -> CFGIndex {
358
356
let func_or_rcvr_exit = self . expr ( func_or_rcvr, pred) ;
359
357
let ret = self . straightline ( call_expr, func_or_rcvr_exit, args) ;
@@ -365,22 +363,22 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
365
363
}
366
364
}
367
365
368
- fn exprs < ' b , I : Iterator < Item =& ' b hir:: Expr > > ( & mut self ,
366
+ fn exprs < ' b , ' h : ' b , I : Iterator < Item =& ' b hir:: Expr < ' h > > > ( & mut self ,
369
367
exprs : I ,
370
368
pred : CFGIndex ) -> CFGIndex {
371
369
//! Constructs graph for `exprs` evaluated in order
372
370
exprs. fold ( pred, |p, e| self . expr ( e, p) )
373
371
}
374
372
375
373
fn opt_expr ( & mut self ,
376
- opt_expr : & Option < P < hir:: Expr > > ,
374
+ opt_expr : & Option < P < ' _ , hir:: Expr < ' _ > > > ,
377
375
pred : CFGIndex ) -> CFGIndex {
378
376
//! Constructs graph for `opt_expr` evaluated, if Some
379
377
opt_expr. iter ( ) . fold ( pred, |p, e| self . expr ( & e, p) )
380
378
}
381
379
382
- fn straightline < ' b , I : Iterator < Item =& ' b hir:: Expr > > ( & mut self ,
383
- expr : & hir:: Expr ,
380
+ fn straightline < ' b , ' h : ' b , I : Iterator < Item =& ' b hir:: Expr < ' h > > > ( & mut self ,
381
+ expr : & hir:: Expr < ' _ > ,
384
382
pred : CFGIndex ,
385
383
subexprs : I ) -> CFGIndex {
386
384
//! Handles case of an expression that evaluates `subexprs` in order
@@ -389,8 +387,8 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
389
387
self . add_ast_node ( expr. hir_id . local_id , & [ subexprs_exit] )
390
388
}
391
389
392
- fn match_ ( & mut self , id : hir:: ItemLocalId , discr : & hir:: Expr ,
393
- arms : & [ hir:: Arm ] , pred : CFGIndex ) -> CFGIndex {
390
+ fn match_ ( & mut self , id : hir:: ItemLocalId , discr : & hir:: Expr < ' _ > ,
391
+ arms : & [ hir:: Arm < ' _ > ] , pred : CFGIndex ) -> CFGIndex {
394
392
// The CFG for match expression is quite complex, so no ASCII
395
393
// art for it (yet).
396
394
//
@@ -495,7 +493,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
495
493
}
496
494
497
495
fn add_exiting_edge ( & mut self ,
498
- from_expr : & hir:: Expr ,
496
+ from_expr : & hir:: Expr < ' _ > ,
499
497
from_index : CFGIndex ,
500
498
target_scope : region:: Scope ,
501
499
to_index : CFGIndex ) {
@@ -513,7 +511,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
513
511
}
514
512
515
513
fn add_returning_edge ( & mut self ,
516
- _from_expr : & hir:: Expr ,
514
+ _from_expr : & hir:: Expr < ' _ > ,
517
515
from_index : CFGIndex ) {
518
516
let data = CFGEdgeData {
519
517
exiting_scopes : self . loop_scopes . iter ( )
@@ -525,7 +523,7 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
525
523
}
526
524
527
525
fn find_scope_edge ( & self ,
528
- expr : & hir:: Expr ,
526
+ expr : & hir:: Expr < ' _ > ,
529
527
destination : hir:: Destination ,
530
528
scope_cf_kind : ScopeCfKind ) -> ( region:: Scope , CFGIndex ) {
531
529
0 commit comments