@@ -660,14 +660,45 @@ fn construct_const<'a, 'tcx>(
660
660
builder. finish ( )
661
661
}
662
662
663
+ /// Construct MIR for a item that has had errors in type checking.
664
+ ///
665
+ /// This is required because we may still want to run MIR passes on an item
666
+ /// with type errors, but normal MIR construction can't handle that in general.
663
667
fn construct_error < ' a , ' tcx > ( hir : Cx < ' a , ' tcx > , body_id : hir:: BodyId ) -> Body < ' tcx > {
664
- let owner_id = hir. tcx ( ) . hir ( ) . body_owner ( body_id) ;
665
- let span = hir. tcx ( ) . hir ( ) . span ( owner_id) ;
666
- let ty = hir. tcx ( ) . types . err ;
667
- let mut builder = Builder :: new ( hir, span, 0 , Safety :: Safe , ty, span, None ) ;
668
+ let tcx = hir. tcx ( ) ;
669
+ let owner_id = tcx. hir ( ) . body_owner ( body_id) ;
670
+ let span = tcx. hir ( ) . span ( owner_id) ;
671
+ let ty = tcx. types . err ;
672
+ let num_params = match hir. body_owner_kind {
673
+ hir:: BodyOwnerKind :: Fn => tcx. hir ( ) . fn_decl_by_hir_id ( owner_id) . unwrap ( ) . inputs . len ( ) ,
674
+ hir:: BodyOwnerKind :: Closure => {
675
+ // The implicit self parameter adds another local in MIR.
676
+ 1 + tcx. hir ( ) . fn_decl_by_hir_id ( owner_id) . unwrap ( ) . inputs . len ( )
677
+ }
678
+ hir:: BodyOwnerKind :: Const => 0 ,
679
+ hir:: BodyOwnerKind :: Static ( _) => 0 ,
680
+ } ;
681
+ let mut builder = Builder :: new ( hir, span, num_params, Safety :: Safe , ty, span, None ) ;
668
682
let source_info = builder. source_info ( span) ;
683
+ // Some MIR passes will expect the number of parameters to match the
684
+ // function declaration.
685
+ for _ in 0 ..num_params {
686
+ builder. local_decls . push ( LocalDecl {
687
+ mutability : Mutability :: Mut ,
688
+ ty,
689
+ user_ty : UserTypeProjections :: none ( ) ,
690
+ source_info,
691
+ internal : false ,
692
+ local_info : LocalInfo :: Other ,
693
+ is_block_tail : None ,
694
+ } ) ;
695
+ }
669
696
builder. cfg . terminate ( START_BLOCK , source_info, TerminatorKind :: Unreachable ) ;
670
- builder. finish ( )
697
+ let mut body = builder. finish ( ) ;
698
+ if tcx. hir ( ) . body ( body_id) . generator_kind . is_some ( ) {
699
+ body. yield_ty = Some ( ty) ;
700
+ }
701
+ body
671
702
}
672
703
673
704
impl < ' a , ' tcx > Builder < ' a , ' tcx > {
0 commit comments