@@ -24,6 +24,7 @@ use rustc::hir::itemlikevisit::ItemLikeVisitor;
2424use rustc:: hir:: intravisit;
2525use rustc:: ich:: { ATTR_DIRTY , ATTR_CLEAN } ;
2626use rustc:: ty:: TyCtxt ;
27+ use rustc_data_structures:: fingerprint:: Fingerprint ;
2728use rustc_data_structures:: fx:: FxHashSet ;
2829use syntax:: ast:: { self , Attribute , NestedMetaItem } ;
2930use syntax:: symbol:: { Symbol , sym} ;
@@ -71,6 +72,7 @@ const BASE_IMPL: &[&str] = &[
7172/// code, i.e., functions+methods
7273const BASE_MIR : & [ & str ] = & [
7374 label_strs:: optimized_mir,
75+ label_strs:: promoted_mir,
7476 label_strs:: mir_built,
7577] ;
7678
@@ -472,26 +474,39 @@ impl DirtyCleanVisitor<'tcx> {
472474 fn assert_dirty ( & self , item_span : Span , dep_node : DepNode ) {
473475 debug ! ( "assert_dirty({:?})" , dep_node) ;
474476
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) ;
477478 let prev_fingerprint = self . tcx . dep_graph . prev_fingerprint_of ( & dep_node) ;
478479
479- if Some ( current_fingerprint) == prev_fingerprint {
480+ if current_fingerprint == prev_fingerprint {
480481 let dep_node_str = self . dep_node_str ( & dep_node) ;
481482 self . tcx . sess . span_err (
482483 item_span,
483484 & format ! ( "`{}` should be dirty but is not" , dep_node_str) ) ;
484485 }
485486 }
486487
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+
487497 fn assert_clean ( & self , item_span : Span , dep_node : DepNode ) {
488498 debug ! ( "assert_clean({:?})" , dep_node) ;
489499
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) ;
492501 let prev_fingerprint = self . tcx . dep_graph . prev_fingerprint_of ( & dep_node) ;
493502
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 {
495510 let dep_node_str = self . dep_node_str ( & dep_node) ;
496511 self . tcx . sess . span_err (
497512 item_span,
0 commit comments