1515
1616use std:: iter:: FromIterator ;
1717use std:: vec:: Vec ;
18- use rustc:: dep_graph:: { DepNode , label_strs} ;
18+ use rustc:: dep_graph:: { CompletedDepGraph , ReconstructedDepGraph , DepNode , label_strs} ;
1919use rustc:: hir;
2020use rustc:: hir:: { ItemKind as HirItem , ImplItemKind , TraitItemKind } ;
2121use rustc:: hir:: Node as HirNode ;
@@ -206,16 +206,21 @@ impl Assertion {
206206 }
207207}
208208
209- pub fn check_dirty_clean_annotations < ' tcx > ( tcx : TyCtxt < ' tcx > ) {
209+ pub fn check_dirty_clean_annotations (
210+ tcx : TyCtxt < ' _ > ,
211+ dep_graph : & CompletedDepGraph ,
212+ ) {
210213 // can't add `#[rustc_dirty]` etc without opting in to this feature
211214 if !tcx. features ( ) . rustc_attrs {
212215 return ;
213216 }
214217
215218 tcx. dep_graph . with_ignore ( || {
219+ let graph = ReconstructedDepGraph :: new ( dep_graph) ;
216220 let krate = tcx. hir ( ) . krate ( ) ;
217221 let mut dirty_clean_visitor = DirtyCleanVisitor {
218222 tcx,
223+ graph,
219224 checked_attrs : Default :: default ( ) ,
220225 } ;
221226 krate. visit_all_item_likes ( & mut dirty_clean_visitor) ;
@@ -236,6 +241,7 @@ pub fn check_dirty_clean_annotations<'tcx>(tcx: TyCtxt<'tcx>) {
236241
237242struct DirtyCleanVisitor < ' tcx > {
238243 tcx : TyCtxt < ' tcx > ,
244+ graph : ReconstructedDepGraph ,
239245 checked_attrs : FxHashSet < ast:: AttrId > ,
240246}
241247
@@ -459,7 +465,7 @@ impl DirtyCleanVisitor<'tcx> {
459465 } )
460466 }
461467
462- fn _dep_node_str ( & self , dep_node : & DepNode ) -> String {
468+ fn dep_node_str ( & self , dep_node : & DepNode ) -> String {
463469 if let Some ( def_id) = dep_node. extract_def_id ( self . tcx ) {
464470 format ! ( "{:?}({})" ,
465471 dep_node. kind,
@@ -469,34 +475,32 @@ impl DirtyCleanVisitor<'tcx> {
469475 }
470476 }
471477
472- fn assert_dirty ( & self , _item_span : Span , dep_node : DepNode ) {
478+ fn assert_dirty ( & self , item_span : Span , dep_node : DepNode ) {
473479 debug ! ( "assert_dirty({:?})" , dep_node) ;
474- panic ! ( )
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);
480+ let dep_node_index = self . graph . dep_node_index_of ( & dep_node) ;
481+ let current_fingerprint = self . graph . fingerprint_of ( dep_node_index) ;
477482 let prev_fingerprint = self . tcx . dep_graph . prev_fingerprint_of ( & dep_node) ;
478483
479484 if Some ( current_fingerprint) == prev_fingerprint {
480485 let dep_node_str = self . dep_node_str ( & dep_node) ;
481486 self . tcx . sess . span_err (
482487 item_span,
483488 & format ! ( "`{}` should be dirty but is not" , dep_node_str) ) ;
484- }*/
489+ }
485490 }
486491
487- fn assert_clean ( & self , _item_span : Span , dep_node : DepNode ) {
492+ fn assert_clean ( & self , item_span : Span , dep_node : DepNode ) {
488493 debug ! ( "assert_clean({:?})" , dep_node) ;
489- panic ! ( )
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);
494+ let dep_node_index = self . graph . dep_node_index_of ( & dep_node) ;
495+ let current_fingerprint = self . graph . fingerprint_of ( dep_node_index) ;
492496 let prev_fingerprint = self . tcx . dep_graph . prev_fingerprint_of ( & dep_node) ;
493497
494498 if Some ( current_fingerprint) != prev_fingerprint {
495499 let dep_node_str = self . dep_node_str ( & dep_node) ;
496500 self . tcx . sess . span_err (
497501 item_span,
498502 & format ! ( "`{}` should be clean but is not" , dep_node_str) ) ;
499- }*/
503+ }
500504 }
501505
502506 fn check_item ( & mut self , item_id : hir:: HirId , item_span : Span ) {
0 commit comments