diff --git a/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp b/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp index 49b6e762f0f9d..0dddcba618c10 100644 --- a/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp +++ b/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp @@ -172,6 +172,18 @@ SILCombiner::optimizeApplyOfConvertFunctionInst(FullApplySite AI, auto oldOpParamTypes = substConventions.getParameterSILTypes(context); auto newOpParamTypes = convertConventions.getParameterSILTypes(context); + // Currently we cannot deal with generic arguments/returns. Bail in this case. + for (auto newRetTy : newOpRetTypes) { + if (newRetTy.hasTypeParameter()) + return nullptr; + } + for (auto newParamTy : newOpParamTypes) { + if (newParamTy.hasTypeParameter()) + return nullptr; + } + if (newIndirectErrorResultType && newIndirectErrorResultType.hasTypeParameter()) + return nullptr; + llvm::SmallVector Args; llvm::SmallVector Borrows; auto convertOp = [&](SILValue Op, SILType OldOpType, SILType NewOpType, diff --git a/test/SILOptimizer/sil_combine_apply.sil b/test/SILOptimizer/sil_combine_apply.sil index f2596510f5ac7..38faa2c6bfa00 100644 --- a/test/SILOptimizer/sil_combine_apply.sil +++ b/test/SILOptimizer/sil_combine_apply.sil @@ -583,6 +583,24 @@ bb0: return %return : $() } +class GenC { +} + +sil @takeGenC : $@convention(thin) <τ_0_0> (@owned GenC<τ_0_0>) -> () + +// CHECK-LABEL: sil [ossa] @convert_function_with_generic_arg : +// CHECK: [[C:%.*]] = convert_function +// CHECK: apply [[C]] +// CHECK: } // end sil function 'convert_function_with_generic_arg' +sil [ossa] @convert_function_with_generic_arg : $@convention(thin) (@owned AnyObject) -> () { +bb0(%0 : @owned $AnyObject): + %2 = function_ref @takeGenC : $@convention(thin) <τ_0_0> (@owned GenC<τ_0_0>) -> () + %9 = convert_function %2 to $@convention(thin) (@owned AnyObject) -> () + %30 = apply %9(%0) : $@convention(thin) (@owned AnyObject) -> () + %r = tuple () + return %r +} + sil shared [transparent] [thunk] @genericClosure : $@convention(thin) (@in T) -> @out T { bb0(%0 : $*T, %1 : $*T): %12 = tuple ()