@@ -7,16 +7,19 @@ use rustc_data_structures::fx::FxHashMap;
7
7
use rustc_data_structures:: sorted_map:: SortedIndexMultiMap ;
8
8
use rustc_errors:: ErrorGuaranteed ;
9
9
use rustc_hir as hir;
10
+ use rustc_hir:: def:: DefKind ;
10
11
use rustc_hir:: def_id:: { DefId , LocalDefId } ;
11
- use rustc_hir:: { GeneratorKind , ImplicitSelfKind , Node } ;
12
+ use rustc_hir:: { GeneratorKind , Node } ;
12
13
use rustc_index:: vec:: { Idx , IndexVec } ;
13
14
use rustc_infer:: infer:: { InferCtxt , TyCtxtInferExt } ;
14
15
use rustc_middle:: hir:: place:: PlaceBase as HirPlaceBase ;
15
16
use rustc_middle:: middle:: region;
16
17
use rustc_middle:: mir:: interpret:: ConstValue ;
17
18
use rustc_middle:: mir:: interpret:: Scalar ;
18
19
use rustc_middle:: mir:: * ;
19
- use rustc_middle:: thir:: { BindingMode , Expr , ExprId , LintLevel , LocalVarId , Param , PatKind , Thir } ;
20
+ use rustc_middle:: thir:: {
21
+ self , BindingMode , Expr , ExprId , LintLevel , LocalVarId , Param , ParamId , PatKind , Thir ,
22
+ } ;
20
23
use rustc_middle:: ty:: { self , Ty , TyCtxt , TypeVisitable , TypeckResults } ;
21
24
use rustc_span:: symbol:: sym;
22
25
use rustc_span:: Span ;
@@ -97,26 +100,6 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam<LocalDefId>) -> Body<'_
97
100
///////////////////////////////////////////////////////////////////////////
98
101
// BuildMir -- walks a crate, looking for fn items and methods to build MIR from
99
102
100
- fn liberated_closure_env_ty (
101
- tcx : TyCtxt < ' _ > ,
102
- closure_expr_id : hir:: HirId ,
103
- body_id : hir:: BodyId ,
104
- ) -> Ty < ' _ > {
105
- let closure_ty = tcx. typeck_body ( body_id) . node_type ( closure_expr_id) ;
106
-
107
- let ty:: Closure ( closure_def_id, closure_substs) = * closure_ty. kind ( ) else {
108
- bug ! ( "closure expr does not have closure type: {:?}" , closure_ty) ;
109
- } ;
110
-
111
- let bound_vars =
112
- tcx. mk_bound_variable_kinds ( std:: iter:: once ( ty:: BoundVariableKind :: Region ( ty:: BrEnv ) ) ) ;
113
- let br =
114
- ty:: BoundRegion { var : ty:: BoundVar :: from_usize ( bound_vars. len ( ) - 1 ) , kind : ty:: BrEnv } ;
115
- let env_region = ty:: ReLateBound ( ty:: INNERMOST , br) ;
116
- let closure_env_ty = tcx. closure_env_ty ( closure_def_id, closure_substs, env_region) . unwrap ( ) ;
117
- tcx. erase_late_bound_regions ( ty:: Binder :: bind_with_vars ( closure_env_ty, bound_vars) )
118
- }
119
-
120
103
#[ derive( Debug , PartialEq , Eq ) ]
121
104
enum BlockFrame {
122
105
/// Evaluation is currently within a statement.
@@ -446,13 +429,6 @@ macro_rules! unpack {
446
429
///////////////////////////////////////////////////////////////////////////
447
430
/// the main entry point for building MIR for a function
448
431
449
- struct ArgInfo < ' thir , ' tcx > (
450
- Ty < ' tcx > ,
451
- Option < Span > ,
452
- Option < & ' thir Param < ' tcx > > ,
453
- Option < ImplicitSelfKind > ,
454
- ) ;
455
-
456
432
fn construct_fn < ' tcx > (
457
433
tcx : TyCtxt < ' tcx > ,
458
434
fn_def : ty:: WithOptConstParam < LocalDefId > ,
@@ -483,50 +459,28 @@ fn construct_fn<'tcx>(
483
459
hir:: Unsafety :: Unsafe => Safety :: FnUnsafe ,
484
460
} ;
485
461
486
- let body = tcx. hir ( ) . body ( body_id) ;
487
- let ty = tcx. type_of ( fn_def. did ) ;
488
462
let mut abi = fn_sig. abi ;
489
- let implicit_argument = match ty. kind ( ) {
490
- ty:: Closure ( ..) => {
491
- // HACK(eddyb) Avoid having RustCall on closures,
492
- // as it adds unnecessary (and wrong) auto-tupling.
493
- abi = Abi :: Rust ;
494
- vec ! [ ArgInfo ( liberated_closure_env_ty( tcx, fn_id, body_id) , None , None , None ) ]
495
- }
496
- ty:: Generator ( ..) => {
497
- let gen_ty = typeck_results. node_type ( fn_id) ;
498
-
499
- // The resume argument may be missing, in that case we need to provide it here.
500
- // It will always be `()` in this case.
501
- if body. params . is_empty ( ) {
502
- vec ! [ ArgInfo ( gen_ty, None , None , None ) , ArgInfo ( tcx. mk_unit( ) , None , None , None ) ]
503
- } else {
504
- vec ! [ ArgInfo ( gen_ty, None , None , None ) ]
505
- }
506
- }
507
- _ => vec ! [ ] ,
508
- } ;
509
-
510
- let explicit_arguments =
511
- thir. params . iter ( ) . map ( |arg| ArgInfo ( arg. ty , arg. ty_span , Some ( & arg) , arg. self_kind ) ) ;
463
+ if let DefKind :: Closure = tcx. def_kind ( fn_def. did ) {
464
+ // HACK(eddyb) Avoid having RustCall on closures,
465
+ // as it adds unnecessary (and wrong) auto-tupling.
466
+ abi = Abi :: Rust ;
467
+ }
512
468
513
- let arguments = implicit_argument . into_iter ( ) . chain ( explicit_arguments ) ;
469
+ let arguments = & thir . params ;
514
470
515
471
let ( yield_ty, return_ty) = if generator_kind. is_some ( ) {
516
- let gen_ty = typeck_results . node_type ( fn_id ) ;
472
+ let gen_ty = arguments [ thir :: UPVAR_ENV_PARAM ] . ty ;
517
473
let gen_sig = match gen_ty. kind ( ) {
518
474
ty:: Generator ( _, gen_substs, ..) => gen_substs. as_generator ( ) . sig ( ) ,
519
475
_ => {
520
- span_bug ! ( span, "generator w/o generator type: {:?}" , ty )
476
+ span_bug ! ( span, "generator w/o generator type: {:?}" , gen_ty )
521
477
}
522
478
} ;
523
479
( Some ( gen_sig. yield_ty ) , gen_sig. return_ty )
524
480
} else {
525
481
( None , fn_sig. output ( ) )
526
482
} ;
527
483
528
- let arguments: Vec < _ > = arguments. collect ( ) ;
529
-
530
484
let mut body = tcx. infer_ctxt ( ) . enter ( |infcx| {
531
485
let mut builder = Builder :: new (
532
486
thir,
@@ -542,9 +496,9 @@ fn construct_fn<'tcx>(
542
496
) ;
543
497
544
498
let call_site_scope =
545
- region:: Scope { id : body . value . hir_id . local_id , data : region:: ScopeData :: CallSite } ;
499
+ region:: Scope { id : body_id . hir_id . local_id , data : region:: ScopeData :: CallSite } ;
546
500
let arg_scope =
547
- region:: Scope { id : body . value . hir_id . local_id , data : region:: ScopeData :: Arguments } ;
501
+ region:: Scope { id : body_id . hir_id . local_id , data : region:: ScopeData :: Arguments } ;
548
502
let source_info = builder. source_info ( span) ;
549
503
let call_site_s = ( call_site_scope, source_info) ;
550
504
unpack ! ( builder. in_scope( call_site_s, LintLevel :: Inherited , |builder| {
@@ -560,7 +514,7 @@ fn construct_fn<'tcx>(
560
514
builder. args_and_body(
561
515
START_BLOCK ,
562
516
fn_def. did,
563
- & arguments,
517
+ arguments,
564
518
arg_scope,
565
519
& thir[ expr] ,
566
520
)
@@ -819,18 +773,19 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
819
773
& mut self ,
820
774
mut block : BasicBlock ,
821
775
fn_def_id : LocalDefId ,
822
- arguments : & [ ArgInfo < ' _ , ' tcx > ] ,
776
+ arguments : & IndexVec < ParamId , Param < ' tcx > > ,
823
777
argument_scope : region:: Scope ,
824
778
expr : & Expr < ' tcx > ,
825
779
) -> BlockAnd < ( ) > {
826
780
// Allocate locals for the function arguments
827
- for & ArgInfo ( ty , _ , arg_opt , _ ) in arguments. iter ( ) {
781
+ for param in arguments. iter ( ) {
828
782
let source_info =
829
- SourceInfo :: outermost ( arg_opt. map_or ( self . fn_span , |arg| arg. pat . span ) ) ;
830
- let arg_local = self . local_decls . push ( LocalDecl :: with_source_info ( ty, source_info) ) ;
783
+ SourceInfo :: outermost ( param. pat . as_ref ( ) . map_or ( self . fn_span , |pat| pat. span ) ) ;
784
+ let arg_local =
785
+ self . local_decls . push ( LocalDecl :: with_source_info ( param. ty , source_info) ) ;
831
786
832
787
// If this is a simple binding pattern, give debuginfo a nice name.
833
- if let Some ( arg ) = arg_opt && let Some ( name) = arg . pat . simple_ident ( ) {
788
+ if let Some ( ref pat ) = param . pat && let Some ( name) = pat. simple_ident ( ) {
834
789
self . var_debug_info . push ( VarDebugInfo {
835
790
name,
836
791
source_info,
@@ -905,27 +860,28 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
905
860
906
861
let mut scope = None ;
907
862
// Bind the argument patterns
908
- for ( index, arg_info ) in arguments. iter ( ) . enumerate ( ) {
863
+ for ( index, param ) in arguments. iter ( ) . enumerate ( ) {
909
864
// Function arguments always get the first Local indices after the return place
910
865
let local = Local :: new ( index + 1 ) ;
911
866
let place = Place :: from ( local) ;
912
- let & ArgInfo ( _, opt_ty_info, arg_opt, ref self_binding) = arg_info;
913
867
914
868
// Make sure we drop (parts of) the argument even when not matched on.
915
869
self . schedule_drop (
916
- arg_opt . as_ref ( ) . map_or ( expr. span , |arg| arg . pat . span ) ,
870
+ param . pat . as_ref ( ) . map_or ( expr. span , |pat| pat. span ) ,
917
871
argument_scope,
918
872
local,
919
873
DropKind :: Value ,
920
874
) ;
921
875
922
- let Some ( arg ) = arg_opt else {
876
+ let Some ( ref pat ) = param . pat else {
923
877
continue ;
924
878
} ;
925
879
let original_source_scope = self . source_scope ;
926
- let span = arg. pat . span ;
927
- self . set_correct_source_scope_for_arg ( arg. hir_id , original_source_scope, span) ;
928
- match arg. pat . kind {
880
+ let span = pat. span ;
881
+ if let Some ( arg_hir_id) = param. hir_id {
882
+ self . set_correct_source_scope_for_arg ( arg_hir_id, original_source_scope, span) ;
883
+ }
884
+ match pat. kind {
929
885
// Don't introduce extra copies for simple bindings
930
886
PatKind :: Binding {
931
887
mutability,
@@ -936,16 +892,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
936
892
} => {
937
893
self . local_decls [ local] . mutability = mutability;
938
894
self . local_decls [ local] . source_info . scope = self . source_scope ;
939
- self . local_decls [ local] . local_info = if let Some ( kind) = self_binding {
895
+ self . local_decls [ local] . local_info = if let Some ( kind) = param . self_kind {
940
896
Some ( Box :: new ( LocalInfo :: User ( ClearCrossCrate :: Set (
941
- BindingForm :: ImplicitSelf ( * kind) ,
897
+ BindingForm :: ImplicitSelf ( kind) ,
942
898
) ) ) )
943
899
} else {
944
900
let binding_mode = ty:: BindingMode :: BindByValue ( mutability) ;
945
901
Some ( Box :: new ( LocalInfo :: User ( ClearCrossCrate :: Set ( BindingForm :: Var (
946
902
VarBindingForm {
947
903
binding_mode,
948
- opt_ty_info,
904
+ opt_ty_info : param . ty_span ,
949
905
opt_match_place : Some ( ( None , span) ) ,
950
906
pat_span : span,
951
907
} ,
@@ -957,12 +913,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
957
913
scope = self . declare_bindings (
958
914
scope,
959
915
expr. span ,
960
- & arg . pat ,
916
+ & pat,
961
917
matches:: ArmHasGuard ( false ) ,
962
918
Some ( ( Some ( & place) , span) ) ,
963
919
) ;
964
920
let place_builder = PlaceBuilder :: from ( local) ;
965
- unpack ! ( block = self . place_into_pattern( block, & arg . pat, place_builder, false ) ) ;
921
+ unpack ! ( block = self . place_into_pattern( block, & pat, place_builder, false ) ) ;
966
922
}
967
923
}
968
924
self . source_scope = original_source_scope;
0 commit comments