@@ -24,6 +24,7 @@ use rustc::hir::itemlikevisit::ItemLikeVisitor;
24
24
use rustc:: hir:: intravisit;
25
25
use rustc:: ich:: { ATTR_DIRTY , ATTR_CLEAN } ;
26
26
use rustc:: ty:: TyCtxt ;
27
+ use rustc_data_structures:: fingerprint:: Fingerprint ;
27
28
use rustc_data_structures:: fx:: FxHashSet ;
28
29
use syntax:: ast:: { self , Attribute , NestedMetaItem } ;
29
30
use syntax:: symbol:: { Symbol , sym} ;
@@ -71,6 +72,7 @@ const BASE_IMPL: &[&str] = &[
71
72
/// code, i.e., functions+methods
72
73
const BASE_MIR : & [ & str ] = & [
73
74
label_strs:: optimized_mir,
75
+ label_strs:: promoted_mir,
74
76
label_strs:: mir_built,
75
77
] ;
76
78
@@ -472,26 +474,39 @@ impl DirtyCleanVisitor<'tcx> {
472
474
fn assert_dirty ( & self , item_span : Span , dep_node : DepNode ) {
473
475
debug ! ( "assert_dirty({:?})" , dep_node) ;
474
476
475
- let dep_node_index = self . tcx . dep_graph . dep_node_index_of ( & dep_node) ;
476
- let current_fingerprint = self . tcx . dep_graph . fingerprint_of ( dep_node_index) ;
477
+ let current_fingerprint = self . get_fingerprint ( & dep_node) ;
477
478
let prev_fingerprint = self . tcx . dep_graph . prev_fingerprint_of ( & dep_node) ;
478
479
479
- if Some ( current_fingerprint) == prev_fingerprint {
480
+ if current_fingerprint == prev_fingerprint {
480
481
let dep_node_str = self . dep_node_str ( & dep_node) ;
481
482
self . tcx . sess . span_err (
482
483
item_span,
483
484
& format ! ( "`{}` should be dirty but is not" , dep_node_str) ) ;
484
485
}
485
486
}
486
487
488
+ fn get_fingerprint ( & self , dep_node : & DepNode ) -> Option < Fingerprint > {
489
+ if self . tcx . dep_graph . dep_node_exists ( dep_node) {
490
+ let dep_node_index = self . tcx . dep_graph . dep_node_index_of ( dep_node) ;
491
+ Some ( self . tcx . dep_graph . fingerprint_of ( dep_node_index) )
492
+ } else {
493
+ None
494
+ }
495
+ }
496
+
487
497
fn assert_clean ( & self , item_span : Span , dep_node : DepNode ) {
488
498
debug ! ( "assert_clean({:?})" , dep_node) ;
489
499
490
- let dep_node_index = self . tcx . dep_graph . dep_node_index_of ( & dep_node) ;
491
- let current_fingerprint = self . tcx . dep_graph . fingerprint_of ( dep_node_index) ;
500
+ let current_fingerprint = self . get_fingerprint ( & dep_node) ;
492
501
let prev_fingerprint = self . tcx . dep_graph . prev_fingerprint_of ( & dep_node) ;
493
502
494
- if Some ( current_fingerprint) != prev_fingerprint {
503
+ // if the node wasn't previously evaluated and now is (or vice versa),
504
+ // then the node isn't actually clean or dirty.
505
+ if ( current_fingerprint == None ) ^ ( prev_fingerprint == None ) {
506
+ return ;
507
+ }
508
+
509
+ if current_fingerprint != prev_fingerprint {
495
510
let dep_node_str = self . dep_node_str ( & dep_node) ;
496
511
self . tcx . sess . span_err (
497
512
item_span,
0 commit comments