@@ -608,7 +608,7 @@ class DeclAndTypePrinter::Implementation
608608 }
609609
610610 Type getForeignResultType (AbstractFunctionDecl *AFD,
611- FunctionType *methodTy,
611+ AnyFunctionType *methodTy,
612612 Optional<ForeignAsyncConvention> asyncConvention,
613613 Optional<ForeignErrorConvention> errorConvention) {
614614 // A foreign error convention can affect the result type as seen in
@@ -950,7 +950,7 @@ class DeclAndTypePrinter::Implementation
950950 }
951951
952952 // / Print C or C++ trailing attributes for a function declaration.
953- void printFunctionClangAttributes (FuncDecl *FD, FunctionType *funcTy) {
953+ void printFunctionClangAttributes (FuncDecl *FD, AnyFunctionType *funcTy) {
954954 if (funcTy->getResult ()->isUninhabited ()) {
955955 os << " SWIFT_NORETURN" ;
956956 } else if (!funcTy->getResult ()->isVoid () &&
@@ -1010,15 +1010,21 @@ class DeclAndTypePrinter::Implementation
10101010 llvm::SmallVector<DeclAndTypeClangFunctionPrinter::AdditionalParam, 2 >
10111011 ¶ms) {
10121012 for (auto param : ABIparams) {
1013- if (param.role ==
1014- IRABIDetailsProvider::ABIAdditionalParam::ABIParameterRole::Self)
1013+ if (param.role == IRABIDetailsProvider::ABIAdditionalParam::
1014+ ABIParameterRole::GenericRequirementRole)
1015+ params.push_back ({DeclAndTypeClangFunctionPrinter::AdditionalParam::
1016+ Role::GenericRequirement,
1017+ resultTy->getASTContext ().getOpaquePointerType (),
1018+ /* isIndirect=*/ false , param.genericRequirement });
1019+ else if (param.role ==
1020+ IRABIDetailsProvider::ABIAdditionalParam::ABIParameterRole::Self)
10151021 params.push_back (
10161022 {DeclAndTypeClangFunctionPrinter::AdditionalParam::Role::Self,
10171023 resultTy->getASTContext ().getOpaquePointerType (),
10181024 /* isIndirect=*/
10191025 isa<FuncDecl>(FD) ? cast<FuncDecl>(FD)->isMutating () : false });
1020- if (param.role ==
1021- IRABIDetailsProvider::ABIAdditionalParam:: ABIParameterRole::Error)
1026+ else if (param.role == IRABIDetailsProvider::ABIAdditionalParam::
1027+ ABIParameterRole::Error)
10221028 params.push_back (
10231029 {DeclAndTypeClangFunctionPrinter::AdditionalParam::Role::Error,
10241030 resultTy->getASTContext ().getOpaquePointerType ()});
@@ -1034,12 +1040,15 @@ class DeclAndTypePrinter::Implementation
10341040 FD->getForeignAsyncConvention ();
10351041 Optional<ForeignErrorConvention> errorConvention =
10361042 FD->getForeignErrorConvention ();
1037- assert (!FD->getGenericSignature () &&
1038- " top-level generic functions not supported here" );
10391043 // FIXME (Alex): Make type adjustments for C++.
1040- auto funcTy = givenFuncType
1041- ? *givenFuncType
1042- : FD->getInterfaceType ()->castTo <FunctionType>();
1044+ AnyFunctionType *funcTy;
1045+ if (givenFuncType || FD->getInterfaceType ()->is <FunctionType>()) {
1046+ funcTy = givenFuncType ? *givenFuncType
1047+ : FD->getInterfaceType ()->castTo <FunctionType>();
1048+ } else {
1049+ funcTy = FD->getInterfaceType ()->castTo <GenericFunctionType>();
1050+ }
1051+
10431052 auto resultTy =
10441053 getForeignResultType (FD, funcTy, asyncConvention, errorConvention);
10451054
@@ -1061,7 +1070,8 @@ class DeclAndTypePrinter::Implementation
10611070 /* isIndirect=*/
10621071 isa<FuncDecl>(FD) ? cast<FuncDecl>(FD)->isMutating () : false });
10631072 }
1064- if (funcTy->isThrowing () && !ABIparams.empty ())
1073+ // FIXME: Fix the method 'self' parameter.
1074+ if (!selfTypeDeclContext && !ABIparams.empty ())
10651075 convertABIAdditionalParams (FD, resultTy, ABIparams, additionalParams);
10661076
10671077 funcPrinter.printFunctionSignature (
@@ -1098,26 +1108,25 @@ class DeclAndTypePrinter::Implementation
10981108 FD->getForeignAsyncConvention ();
10991109 Optional<ForeignErrorConvention> errorConvention =
11001110 FD->getForeignErrorConvention ();
1101- assert (!FD->getGenericSignature () &&
1102- " top-level generic functions not supported here" );
1103- auto funcTy = FD->getInterfaceType ()->castTo <FunctionType>();
1111+ auto funcTy = FD->getInterfaceType ()->castTo <AnyFunctionType>();
11041112 auto resultTy =
11051113 getForeignResultType (FD, funcTy, asyncConvention, errorConvention);
11061114
1107- os << " inline " ;
11081115 DeclAndTypeClangFunctionPrinter funcPrinter (os, owningPrinter.prologueOS ,
11091116 owningPrinter.typeMapping ,
11101117 owningPrinter.interopContext );
11111118 llvm::SmallVector<DeclAndTypeClangFunctionPrinter::AdditionalParam, 2 >
11121119 additionalParams;
11131120 auto ABIparams = owningPrinter.interopContext .getIrABIDetails ()
11141121 .getFunctionABIAdditionalParams (FD);
1115- if (funcTy-> isThrowing () && !ABIparams.empty ())
1122+ if (!ABIparams.empty ())
11161123 convertABIAdditionalParams (FD, resultTy, ABIparams, additionalParams);
1117-
1124+ DeclAndTypeClangFunctionPrinter::FunctionSignatureModifiers modifiers;
1125+ modifiers.isInline = true ;
11181126 funcPrinter.printFunctionSignature (
11191127 FD, FD->getName ().getBaseIdentifier ().get (), resultTy,
1120- DeclAndTypeClangFunctionPrinter::FunctionSignatureKind::CxxInlineThunk);
1128+ DeclAndTypeClangFunctionPrinter::FunctionSignatureKind::CxxInlineThunk,
1129+ {}, modifiers);
11211130 // FIXME: Support throwing exceptions for Swift errors.
11221131 if (!funcTy->isThrowing ())
11231132 os << " noexcept" ;
@@ -1126,7 +1135,7 @@ class DeclAndTypePrinter::Implementation
11261135 os << " {\n " ;
11271136 funcPrinter.printCxxThunkBody (
11281137 funcABI.getSymbolName (), FD->getModuleContext (), resultTy,
1129- FD->getParameters (), additionalParams, funcTy->isThrowing ());
1138+ FD->getParameters (), additionalParams, funcTy->isThrowing (), funcTy );
11301139 os << " }\n " ;
11311140 }
11321141
0 commit comments