@@ -300,6 +300,20 @@ pub struct ExprUseVisitor<'d,'t,'tcx:'t,TYPER:'t> {
300
300
mc : mc:: MemCategorizationContext < ' t , TYPER > ,
301
301
delegate : & ' d mut ( Delegate < ' tcx > +' d ) ,
302
302
param_env : & ' t ParameterEnvironment < ' tcx > ,
303
+ // If the TYPER results in an error, it's because the type check
304
+ // failed (or will fail, when the error is uncovered and reported
305
+ // during writeback). In this case, we just ignore this part of the
306
+ // code.
307
+ //
308
+ // Note that this macro appears similar to try!(), but, unlike try!(),
309
+ // it does not propagate the error.
310
+ macro_rules! return_if_err {
311
+ ( $inp: expr ) => (
312
+ match $inp {
313
+ Ok ( v ) => v ,
314
+ Err ( ( ) ) => return
315
+ }
316
+ )
303
317
}
304
318
305
319
/// Whether the elements of an overloaded operation are passed by value or by reference
@@ -332,7 +346,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
332
346
decl : & ast:: FnDecl ,
333
347
body : & ast:: Block ) {
334
348
for arg in decl. inputs . iter ( ) {
335
- let arg_ty = self . typer . node_ty ( arg. pat . id ) ;
349
+ let arg_ty = return_if_err ! ( self . typer. node_ty( arg. pat. id) ) ;
336
350
337
351
let fn_body_scope = region:: CodeExtent :: from_node_id ( body. id ) ;
338
352
let arg_cmt = self . mc . cat_rvalue (
@@ -369,7 +383,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
369
383
pub fn consume_expr ( & mut self , expr : & ast:: Expr ) {
370
384
debug ! ( "consume_expr(expr={})" , expr. repr( self . tcx( ) ) ) ;
371
385
372
- let cmt = self . mc . cat_expr ( expr) ;
386
+ let cmt = return_if_err ! ( self . mc. cat_expr( expr) ) ;
373
387
self . delegate_consume ( expr. id , expr. span , cmt) ;
374
388
self . walk_expr ( expr) ;
375
389
}
@@ -378,7 +392,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
378
392
assignment_expr : & ast:: Expr ,
379
393
expr : & ast:: Expr ,
380
394
mode : MutateMode ) {
381
- let cmt = self . mc . cat_expr ( expr) ;
395
+ let cmt = return_if_err ! ( self . mc. cat_expr( expr) ) ;
382
396
self . delegate . mutate ( assignment_expr. id , assignment_expr. span , cmt, mode) ;
383
397
self . walk_expr ( expr) ;
384
398
}
@@ -391,7 +405,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
391
405
debug ! ( "borrow_expr(expr={}, r={}, bk={})" ,
392
406
expr. repr( self . tcx( ) ) , r. repr( self . tcx( ) ) , bk. repr( self . tcx( ) ) ) ;
393
407
394
- let cmt = self . mc . cat_expr ( expr) ;
408
+ let cmt = return_if_err ! ( self . mc. cat_expr( expr) ) ;
395
409
self . delegate . borrow ( expr. id , expr. span , cmt, r, bk, cause) ;
396
410
397
411
// Note: Unlike consume, we can ignore ExprParen. cat_expr
@@ -491,7 +505,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
491
505
}
492
506
493
507
ast:: ExprMatch ( ref discr, ref arms, _) => {
494
- let discr_cmt = self . mc . cat_expr ( & * * discr) ;
508
+ let discr_cmt = return_if_err ! ( self . mc. cat_expr( & * * discr) ) ;
495
509
self . borrow_expr ( & * * discr, ty:: ReEmpty , ty:: ImmBorrow , MatchDiscriminant ) ;
496
510
497
511
// treatment of the discriminant is handled while walking the arms.
@@ -509,7 +523,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
509
523
ast:: ExprAddrOf ( m, ref base) => { // &base
510
524
// make sure that the thing we are pointing out stays valid
511
525
// for the lifetime `scope_r` of the resulting ptr:
512
- let expr_ty = ty :: expr_ty ( self . tcx ( ) , expr) ;
526
+ let expr_ty = return_if_err ! ( self . typer . node_ty ( expr. id ) ) ;
513
527
let r = ty:: ty_region ( self . tcx ( ) , expr. span , expr_ty) ;
514
528
let bk = ty:: BorrowKind :: from_mutbl ( m) ;
515
529
self . borrow_expr ( & * * base, r, bk, AddrOf ) ;
@@ -550,7 +564,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
550
564
551
565
// Fetch the type of the value that the iteration yields to
552
566
// produce the pattern's categorized mutable type.
553
- let pattern_type = self . typer . node_ty ( pat. id ) ;
567
+ let pattern_type = return_if_err ! ( self . typer. node_ty( pat. id) ) ;
554
568
let blk_scope = region:: CodeExtent :: from_node_id ( blk. id ) ;
555
569
let pat_cmt = self . mc . cat_rvalue ( pat. id ,
556
570
pat. span ,
@@ -638,7 +652,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
638
652
}
639
653
640
654
fn walk_callee ( & mut self , call : & ast:: Expr , callee : & ast:: Expr ) {
641
- let callee_ty = self . typer . expr_ty_adjusted ( callee) ;
655
+ let callee_ty = return_if_err ! ( self . typer. expr_ty_adjusted( callee) ) ;
642
656
debug ! ( "walk_callee: callee={} callee_ty={}" ,
643
657
callee. repr( self . tcx( ) ) , callee_ty. repr( self . tcx( ) ) ) ;
644
658
let call_scope = region:: CodeExtent :: from_node_id ( call. id ) ;
@@ -735,7 +749,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
735
749
// "assigns", which is handled by
736
750
// `walk_pat`:
737
751
self . walk_expr ( & * * expr) ;
738
- let init_cmt = self . mc . cat_expr ( & * * expr) ;
752
+ let init_cmt = return_if_err ! ( self . mc. cat_expr( & * * expr) ) ;
739
753
self . walk_irrefutable_pat ( init_cmt, & * local. pat ) ;
740
754
}
741
755
}
@@ -769,7 +783,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
769
783
None => { return ; }
770
784
} ;
771
785
772
- let with_cmt = self . mc . cat_expr ( & * with_expr) ;
786
+ let with_cmt = return_if_err ! ( self . mc. cat_expr( & * with_expr) ) ;
773
787
774
788
// Select just those fields of the `with`
775
789
// expression that will actually be used
@@ -824,7 +838,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
824
838
// rvalue.
825
839
debug ! ( "walk_adjustment(AutoAddEnv|AdjustReifyFnPointer)" ) ;
826
840
let cmt_unadjusted =
827
- self . mc . cat_expr_unadjusted ( expr) ;
841
+ return_if_err ! ( self . mc. cat_expr_unadjusted( expr) ) ;
828
842
self . delegate_consume ( expr. id , expr. span , cmt_unadjusted) ;
829
843
}
830
844
ty:: AdjustDerefRef ( ty:: AutoDerefRef {
@@ -858,7 +872,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
858
872
match self . typer . node_method_ty ( deref_id) {
859
873
None => { }
860
874
Some ( method_ty) => {
861
- let cmt = self . mc . cat_expr_autoderefd ( expr, i) ;
875
+ let cmt = return_if_err ! ( self . mc. cat_expr_autoderefd( expr, i) ) ;
862
876
let self_ty = ty:: ty_fn_args ( method_ty) [ 0 ] ;
863
877
let ( m, r) = match self_ty. sty {
864
878
ty:: ty_rptr( r, ref m) => ( m. mutbl , r) ,
@@ -888,14 +902,15 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
888
902
assert ! ( n == 1 , format!( "Expected exactly 1 deref with Uniq \
889
903
AutoRefs, found: {}", n) ) ;
890
904
let cmt_unadjusted =
891
- self . mc . cat_expr_unadjusted ( expr) ;
905
+ return_if_err ! ( self . mc. cat_expr_unadjusted( expr) ) ;
892
906
self . delegate_consume ( expr. id , expr. span , cmt_unadjusted) ;
893
907
return ;
894
908
}
895
909
_ => { }
896
910
}
897
911
898
- let cmt_derefd = self . mc . cat_expr_autoderefd ( expr, n) ;
912
+ let cmt_derefd = return_if_err ! (
913
+ self . mc. cat_expr_autoderefd( expr, n) ) ;
899
914
debug ! ( "walk_adjustment: cmt_derefd={}" ,
900
915
cmt_derefd. repr( self . tcx( ) ) ) ;
901
916
@@ -988,7 +1003,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
988
1003
mode : & mut TrackMatchMode < Span > ) {
989
1004
debug ! ( "determine_pat_move_mode cmt_discr={} pat={}" , cmt_discr. repr( self . tcx( ) ) ,
990
1005
pat. repr( self . tcx( ) ) ) ;
991
- self . mc . cat_pattern ( cmt_discr, pat, |_mc, cmt_pat, pat| {
1006
+ return_if_err ! ( self . mc. cat_pattern( cmt_discr, pat, |_mc, cmt_pat, pat| {
992
1007
let tcx = self . typer. tcx( ) ;
993
1008
let def_map = & self . typer. tcx( ) . def_map;
994
1009
if pat_util:: pat_is_binding( def_map, pat) {
@@ -1011,7 +1026,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1011
1026
}
1012
1027
}
1013
1028
}
1014
- } ) ;
1029
+ } ) ) ;
1015
1030
}
1016
1031
1017
1032
/// The core driver for walking a pattern; `match_mode` must be
@@ -1028,8 +1043,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1028
1043
let typer = self . typer ;
1029
1044
let def_map = & self . typer . tcx ( ) . def_map ;
1030
1045
let delegate = & mut self . delegate ;
1031
- let param_env = self . param_env ;
1032
- mc. cat_pattern ( cmt_discr. clone ( ) , pat, |mc, cmt_pat, pat| {
1046
+ return_if_err ! ( mc. cat_pattern( cmt_discr. clone( ) , pat, |mc, cmt_pat, pat| {
1033
1047
if pat_util:: pat_is_binding( def_map, pat) {
1034
1048
let tcx = typer. tcx( ) ;
1035
1049
@@ -1039,7 +1053,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1039
1053
match_mode) ;
1040
1054
1041
1055
// pat_ty: the type of the binding being produced.
1042
- let pat_ty = typer. node_ty ( pat. id ) ;
1056
+ let pat_ty = return_if_err! ( typer. node_ty( pat. id) ) ;
1043
1057
1044
1058
// Each match binding is effectively an assignment to the
1045
1059
// binding being produced.
@@ -1080,7 +1094,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1080
1094
// matched.
1081
1095
1082
1096
let ( slice_cmt, slice_mutbl, slice_r) =
1083
- mc. cat_slice_pattern ( cmt_pat, & * * slice_pat) ;
1097
+ return_if_err! ( mc. cat_slice_pattern( cmt_pat, & * * slice_pat) ) ;
1084
1098
1085
1099
// Note: We declare here that the borrow
1086
1100
// occurs upon entering the `[...]`
@@ -1110,13 +1124,13 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1110
1124
_ => { }
1111
1125
}
1112
1126
}
1113
- } ) ;
1127
+ } ) ) ;
1114
1128
1115
1129
// Do a second pass over the pattern, calling `matched_pat` on
1116
1130
// the interior nodes (enum variants and structs), as opposed
1117
1131
// to the above loop's visit of than the bindings that form
1118
1132
// the leaves of the pattern tree structure.
1119
- mc. cat_pattern ( cmt_discr, pat, |mc, cmt_pat, pat| {
1133
+ return_if_err ! ( mc. cat_pattern( cmt_discr, pat, |mc, cmt_pat, pat| {
1120
1134
let def_map = def_map. borrow( ) ;
1121
1135
let tcx = typer. tcx( ) ;
1122
1136
@@ -1197,7 +1211,7 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1197
1211
// cases either.
1198
1212
}
1199
1213
}
1200
- } ) ;
1214
+ } ) ) ;
1201
1215
}
1202
1216
1203
1217
fn walk_captures ( & mut self , closure_expr : & ast:: Expr ) {
@@ -1221,9 +1235,9 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1221
1235
freevars : & [ ty:: Freevar ] ) {
1222
1236
for freevar in freevars. iter ( ) {
1223
1237
let id_var = freevar. def . def_id ( ) . node ;
1224
- let cmt_var = self . cat_captured_var ( closure_expr. id ,
1225
- closure_expr. span ,
1226
- freevar. def ) ;
1238
+ let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1239
+ closure_expr. span,
1240
+ freevar. def) ) ;
1227
1241
1228
1242
// Lookup the kind of borrow the callee requires, as
1229
1243
// inferred by regionbk
@@ -1244,11 +1258,10 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1244
1258
closure_expr : & ast:: Expr ,
1245
1259
freevars : & [ ty:: Freevar ] ) {
1246
1260
for freevar in freevars. iter ( ) {
1247
- let cmt_var = self . cat_captured_var ( closure_expr. id ,
1248
- closure_expr. span ,
1249
- freevar. def ) ;
1250
- let mode = copy_or_move ( self . tcx ( ) , cmt_var. ty ,
1251
- self . param_env , CaptureMove ) ;
1261
+ let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1262
+ closure_expr. span,
1263
+ freevar. def) ) ;
1264
+ let mode = copy_or_move ( self . typer , & cmt_var, CaptureMove ) ;
1252
1265
self . delegate . consume ( closure_expr. id , freevar. span , cmt_var, mode) ;
1253
1266
}
1254
1267
}
@@ -1257,11 +1270,11 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1257
1270
closure_id : ast:: NodeId ,
1258
1271
closure_span : Span ,
1259
1272
upvar_def : def:: Def )
1260
- -> mc:: cmt < ' tcx > {
1273
+ -> mc:: McResult < mc :: cmt < ' tcx > > {
1261
1274
// Create the cmt for the variable being borrowed, from the
1262
1275
// caller's perspective
1263
1276
let var_id = upvar_def. def_id ( ) . node ;
1264
- let var_ty = self . typer . node_ty ( var_id) ;
1277
+ let var_ty = try! ( self . typer . node_ty ( var_id) ) ;
1265
1278
self . mc . cat_def ( closure_id, closure_span, var_ty, upvar_def)
1266
1279
}
1267
1280
}
0 commit comments