@@ -606,14 +606,14 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
606
606
ty:: EarlyBinder :: bind ( callee_body. clone ( ) ) ,
607
607
) else {
608
608
debug ! ( "failed to normalize callee body" ) ;
609
- return Err ( "implementation limitation" ) ;
609
+ return Err ( "implementation limitation -- could not normalize callee body " ) ;
610
610
} ;
611
611
612
612
// Normally, this shouldn't be required, but trait normalization failure can create a
613
613
// validation ICE.
614
614
if !validate_types ( tcx, inliner. typing_env ( ) , & callee_body, & caller_body) . is_empty ( ) {
615
615
debug ! ( "failed to validate callee body" ) ;
616
- return Err ( "implementation limitation" ) ;
616
+ return Err ( "implementation limitation -- callee body failed validation " ) ;
617
617
}
618
618
619
619
// Check call signature compatibility.
@@ -622,15 +622,13 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
622
622
let output_type = callee_body. return_ty ( ) ;
623
623
if !util:: sub_types ( tcx, inliner. typing_env ( ) , output_type, destination_ty) {
624
624
trace ! ( ?output_type, ?destination_ty) ;
625
- debug ! ( "failed to normalize return type" ) ;
626
- return Err ( "implementation limitation" ) ;
625
+ return Err ( "implementation limitation -- return type mismatch" ) ;
627
626
}
628
627
if callsite. fn_sig . abi ( ) == ExternAbi :: RustCall {
629
- // FIXME: Don't inline user-written `extern "rust-call"` functions,
630
- // since this is generally perf-negative on rustc, and we hope that
631
- // LLVM will inline these functions instead.
632
- if callee_body. spread_arg . is_some ( ) {
633
- return Err ( "user-written rust-call functions" ) ;
628
+ match callsite. callee . def {
629
+ InstanceKind :: Item ( def_id) if tcx. is_closure_like ( def_id) => { }
630
+ InstanceKind :: FnPtrShim ( ..) | InstanceKind :: ClosureOnceShim { .. } => { }
631
+ _ => return Err ( "not inlining non-builtin call" ) ,
634
632
}
635
633
636
634
let ( self_arg, arg_tuple) = match & args[ ..] {
@@ -642,12 +640,17 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
642
640
let self_arg_ty = self_arg. map ( |self_arg| self_arg. node . ty ( & caller_body. local_decls , tcx) ) ;
643
641
644
642
let arg_tuple_ty = arg_tuple. node . ty ( & caller_body. local_decls , tcx) ;
645
- let ty:: Tuple ( arg_tuple_tys) = * arg_tuple_ty. kind ( ) else {
646
- bug ! ( "Closure arguments are not passed as a tuple" ) ;
643
+ let arg_tys = if callee_body. spread_arg . is_some ( ) {
644
+ std:: slice:: from_ref ( & arg_tuple_ty)
645
+ } else {
646
+ let ty:: Tuple ( arg_tuple_tys) = * arg_tuple_ty. kind ( ) else {
647
+ bug ! ( "Closure arguments are not passed as a tuple" ) ;
648
+ } ;
649
+ arg_tuple_tys. as_slice ( )
647
650
} ;
648
651
649
652
for ( arg_ty, input) in
650
- self_arg_ty. into_iter ( ) . chain ( arg_tuple_tys ) . zip ( callee_body. args_iter ( ) )
653
+ self_arg_ty. into_iter ( ) . chain ( arg_tys . iter ( ) . copied ( ) ) . zip ( callee_body. args_iter ( ) )
651
654
{
652
655
let input_type = callee_body. local_decls [ input] . ty ;
653
656
if !util:: sub_types ( tcx, inliner. typing_env ( ) , input_type, arg_ty) {
@@ -663,7 +666,7 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
663
666
if !util:: sub_types ( tcx, inliner. typing_env ( ) , input_type, arg_ty) {
664
667
trace ! ( ?arg_ty, ?input_type) ;
665
668
debug ! ( "failed to normalize argument type" ) ;
666
- return Err ( "implementation limitation" ) ;
669
+ return Err ( "implementation limitation -- arg mismatch " ) ;
667
670
}
668
671
}
669
672
}
@@ -693,13 +696,13 @@ fn check_mir_is_available<'tcx, I: Inliner<'tcx>>(
693
696
// won't cause cycles on this.
694
697
if !inliner. tcx ( ) . is_mir_available ( callee_def_id) {
695
698
debug ! ( "item MIR unavailable" ) ;
696
- return Err ( "implementation limitation" ) ;
699
+ return Err ( "implementation limitation -- MIR unavailable " ) ;
697
700
}
698
701
}
699
702
// These have no own callable MIR.
700
703
InstanceKind :: Intrinsic ( _) | InstanceKind :: Virtual ( ..) => {
701
704
debug ! ( "instance without MIR (intrinsic / virtual)" ) ;
702
- return Err ( "implementation limitation" ) ;
705
+ return Err ( "implementation limitation -- cannot inline intrinsic " ) ;
703
706
}
704
707
705
708
// FIXME(#127030): `ConstParamHasTy` has bad interactions with
@@ -709,7 +712,7 @@ fn check_mir_is_available<'tcx, I: Inliner<'tcx>>(
709
712
// substituted.
710
713
InstanceKind :: DropGlue ( _, Some ( ty) ) if ty. has_type_flags ( TypeFlags :: HAS_CT_PARAM ) => {
711
714
debug ! ( "still needs substitution" ) ;
712
- return Err ( "implementation limitation" ) ;
715
+ return Err ( "implementation limitation -- HACK for dropping polymorphic type " ) ;
713
716
}
714
717
715
718
// This cannot result in an immediate cycle since the callee MIR is a shim, which does
@@ -1060,8 +1063,7 @@ fn make_call_args<'tcx, I: Inliner<'tcx>>(
1060
1063
1061
1064
closure_ref_arg. chain ( tuple_tmp_args) . collect ( )
1062
1065
} else {
1063
- // FIXME(edition_2024): switch back to a normal method call.
1064
- <_ >:: into_iter ( args)
1066
+ args. into_iter ( )
1065
1067
. map ( |a| create_temp_if_necessary ( inliner, a. node , callsite, caller_body, return_block) )
1066
1068
. collect ( )
1067
1069
}
0 commit comments