@@ -10,19 +10,33 @@ use crate::move_paths::{HasMoveData, MoveData};
1010use crate :: move_paths:: { LookupResult , MovePathIndex } ;
1111use crate :: MoveDataParamEnv ;
1212use crate :: { Analysis , JoinSemiLattice , ResultsCursor } ;
13+ use rustc_ast:: MetaItem ;
14+ use rustc_hir:: def_id:: DefId ;
1315use rustc_index:: bit_set:: ChunkedBitSet ;
1416use rustc_middle:: mir:: MirPass ;
1517use rustc_middle:: mir:: { self , Body , Local , Location } ;
1618use rustc_middle:: ty:: { self , Ty , TyCtxt } ;
17- use rustc_span:: symbol:: sym;
19+ use rustc_span:: symbol:: { sym, Symbol } ;
1820use rustc_span:: Span ;
1921
2022pub struct SanityCheck ;
2123
24+ pub fn has_rustc_mir_with ( tcx : TyCtxt < ' _ > , def_id : DefId , name : Symbol ) -> Option < MetaItem > {
25+ for attr in tcx. get_attrs ( def_id, sym:: rustc_mir) {
26+ let items = attr. meta_item_list ( ) ;
27+ for item in items. iter ( ) . flat_map ( |l| l. iter ( ) ) {
28+ match item. meta_item ( ) {
29+ Some ( mi) if mi. has_name ( name) => return Some ( mi. clone ( ) ) ,
30+ _ => continue ,
31+ }
32+ }
33+ }
34+ None
35+ }
36+
2237// FIXME: This should be a `MirLint`, but it needs to be moved back to `rustc_mir_transform` first.
2338impl < ' tcx > MirPass < ' tcx > for SanityCheck {
2439 fn run_pass ( & self , tcx : TyCtxt < ' tcx > , body : & mut Body < ' tcx > ) {
25- use crate :: has_rustc_mir_with;
2640 let def_id = body. source . def_id ( ) ;
2741 if !tcx. has_attr ( def_id, sym:: rustc_mir) {
2842 debug ! ( "skipping rustc_peek::SanityCheck on {}" , tcx. def_path_str( def_id) ) ;
0 commit comments