@@ -606,14 +606,14 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
606606 ty:: EarlyBinder :: bind ( callee_body. clone ( ) ) ,
607607 ) else {
608608 debug ! ( "failed to normalize callee body" ) ;
609- return Err ( "implementation limitation" ) ;
609+ return Err ( "implementation limitation -- could not normalize callee body " ) ;
610610 } ;
611611
612612 // Normally, this shouldn't be required, but trait normalization failure can create a
613613 // validation ICE.
614614 if !validate_types ( tcx, inliner. typing_env ( ) , & callee_body, & caller_body) . is_empty ( ) {
615615 debug ! ( "failed to validate callee body" ) ;
616- return Err ( "implementation limitation" ) ;
616+ return Err ( "implementation limitation -- callee body failed validation " ) ;
617617 }
618618
619619 // Check call signature compatibility.
@@ -622,17 +622,9 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
622622 let output_type = callee_body. return_ty ( ) ;
623623 if !util:: sub_types ( tcx, inliner. typing_env ( ) , output_type, destination_ty) {
624624 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" ) ;
627626 }
628627 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" ) ;
634- }
635-
636628 let ( self_arg, arg_tuple) = match & args[ ..] {
637629 [ arg_tuple] => ( None , arg_tuple) ,
638630 [ self_arg, arg_tuple] => ( Some ( self_arg) , arg_tuple) ,
@@ -642,12 +634,17 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
642634 let self_arg_ty = self_arg. map ( |self_arg| self_arg. node . ty ( & caller_body. local_decls , tcx) ) ;
643635
644636 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" ) ;
637+ let arg_tys = if callee_body. spread_arg . is_some ( ) {
638+ std:: slice:: from_ref ( & arg_tuple_ty)
639+ } else {
640+ let ty:: Tuple ( arg_tuple_tys) = * arg_tuple_ty. kind ( ) else {
641+ bug ! ( "Closure arguments are not passed as a tuple" ) ;
642+ } ;
643+ arg_tuple_tys. as_slice ( )
647644 } ;
648645
649646 for ( arg_ty, input) in
650- self_arg_ty. into_iter ( ) . chain ( arg_tuple_tys ) . zip ( callee_body. args_iter ( ) )
647+ self_arg_ty. into_iter ( ) . chain ( arg_tys . iter ( ) . copied ( ) ) . zip ( callee_body. args_iter ( ) )
651648 {
652649 let input_type = callee_body. local_decls [ input] . ty ;
653650 if !util:: sub_types ( tcx, inliner. typing_env ( ) , input_type, arg_ty) {
@@ -663,7 +660,7 @@ fn try_inlining<'tcx, I: Inliner<'tcx>>(
663660 if !util:: sub_types ( tcx, inliner. typing_env ( ) , input_type, arg_ty) {
664661 trace ! ( ?arg_ty, ?input_type) ;
665662 debug ! ( "failed to normalize argument type" ) ;
666- return Err ( "implementation limitation" ) ;
663+ return Err ( "implementation limitation -- arg mismatch " ) ;
667664 }
668665 }
669666 }
@@ -693,13 +690,13 @@ fn check_mir_is_available<'tcx, I: Inliner<'tcx>>(
693690 // won't cause cycles on this.
694691 if !inliner. tcx ( ) . is_mir_available ( callee_def_id) {
695692 debug ! ( "item MIR unavailable" ) ;
696- return Err ( "implementation limitation" ) ;
693+ return Err ( "implementation limitation -- MIR unavailable " ) ;
697694 }
698695 }
699696 // These have no own callable MIR.
700697 InstanceKind :: Intrinsic ( _) | InstanceKind :: Virtual ( ..) => {
701698 debug ! ( "instance without MIR (intrinsic / virtual)" ) ;
702- return Err ( "implementation limitation" ) ;
699+ return Err ( "implementation limitation -- cannot inline intrinsic " ) ;
703700 }
704701
705702 // FIXME(#127030): `ConstParamHasTy` has bad interactions with
@@ -709,7 +706,7 @@ fn check_mir_is_available<'tcx, I: Inliner<'tcx>>(
709706 // substituted.
710707 InstanceKind :: DropGlue ( _, Some ( ty) ) if ty. has_type_flags ( TypeFlags :: HAS_CT_PARAM ) => {
711708 debug ! ( "still needs substitution" ) ;
712- return Err ( "implementation limitation" ) ;
709+ return Err ( "implementation limitation -- HACK for dropping polymorphic type " ) ;
713710 }
714711
715712 // This cannot result in an immediate cycle since the callee MIR is a shim, which does
@@ -1060,8 +1057,7 @@ fn make_call_args<'tcx, I: Inliner<'tcx>>(
10601057
10611058 closure_ref_arg. chain ( tuple_tmp_args) . collect ( )
10621059 } else {
1063- // FIXME(edition_2024): switch back to a normal method call.
1064- <_ >:: into_iter ( args)
1060+ args. into_iter ( )
10651061 . map ( |a| create_temp_if_necessary ( inliner, a. node , callsite, caller_body, return_block) )
10661062 . collect ( )
10671063 }
0 commit comments