@@ -716,18 +716,20 @@ class DeclAndTypePrinter::Implementation
716716 .printSwiftABIFunctionSignatureAsCxxFunction (
717717 AFD, methodTy,
718718 /* selfTypeDeclContext=*/ typeDeclContext);
719+ if (!funcABI)
720+ return ;
719721 owningPrinter.prologueOS << cFuncPrologueOS.str ();
720722
721723 DeclAndTypeClangFunctionPrinter declPrinter (os, owningPrinter.prologueOS ,
722724 owningPrinter.typeMapping ,
723725 owningPrinter.interopContext );
724726 if (auto *accessor = dyn_cast<AccessorDecl>(AFD)) {
725727 declPrinter.printCxxPropertyAccessorMethod (
726- typeDeclContext, accessor, funcABI. getSymbolName (), resultTy,
728+ typeDeclContext, accessor, funcABI-> getSymbolName (), resultTy,
727729 /* isDefinition=*/ false );
728730 } else {
729731 declPrinter.printCxxMethod (typeDeclContext, AFD,
730- funcABI. getSymbolName (), resultTy,
732+ funcABI-> getSymbolName (), resultTy,
731733 /* isDefinition=*/ false );
732734 }
733735
@@ -739,11 +741,12 @@ class DeclAndTypePrinter::Implementation
739741 if (auto *accessor = dyn_cast<AccessorDecl>(AFD)) {
740742
741743 defPrinter.printCxxPropertyAccessorMethod (
742- typeDeclContext, accessor, funcABI. getSymbolName (), resultTy,
744+ typeDeclContext, accessor, funcABI-> getSymbolName (), resultTy,
743745 /* isDefinition=*/ true );
744746 } else {
745- defPrinter.printCxxMethod (typeDeclContext, AFD, funcABI.getSymbolName (),
746- resultTy, /* isDefinition=*/ true );
747+ defPrinter.printCxxMethod (typeDeclContext, AFD,
748+ funcABI->getSymbolName (), resultTy,
749+ /* isDefinition=*/ true );
747750 }
748751
749752 // FIXME: SWIFT_WARN_UNUSED_RESULT
@@ -1074,7 +1077,8 @@ class DeclAndTypePrinter::Implementation
10741077 }
10751078
10761079 // Print out the extern C Swift ABI function signature.
1077- FuncionSwiftABIInformation printSwiftABIFunctionSignatureAsCxxFunction (
1080+ Optional<FuncionSwiftABIInformation>
1081+ printSwiftABIFunctionSignatureAsCxxFunction (
10781082 AbstractFunctionDecl *FD, Optional<FunctionType *> givenFuncType = None,
10791083 Optional<NominalTypeDecl *> selfTypeDeclContext = None) {
10801084 assert (outputLang == OutputLanguageMode::Cxx);
@@ -1094,13 +1098,16 @@ class DeclAndTypePrinter::Implementation
10941098 auto resultTy =
10951099 getForeignResultType (FD, funcTy, asyncConvention, errorConvention);
10961100
1101+ std::string cRepresentationString;
1102+ llvm::raw_string_ostream cRepresentationOS (cRepresentationString);
1103+
10971104 FuncionSwiftABIInformation funcABI (FD);
10981105
1099- os << " SWIFT_EXTERN " ;
1106+ cRepresentationOS << " SWIFT_EXTERN " ;
11001107
1101- DeclAndTypeClangFunctionPrinter funcPrinter (os, owningPrinter. prologueOS ,
1102- owningPrinter.typeMapping ,
1103- owningPrinter.interopContext );
1108+ DeclAndTypeClangFunctionPrinter funcPrinter (
1109+ cRepresentationOS, owningPrinter. prologueOS , owningPrinter.typeMapping ,
1110+ owningPrinter.interopContext );
11041111 auto ABIparams = owningPrinter.interopContext .getIrABIDetails ()
11051112 .getFunctionABIAdditionalParams (FD);
11061113 llvm::SmallVector<DeclAndTypeClangFunctionPrinter::AdditionalParam, 2 >
@@ -1116,10 +1123,16 @@ class DeclAndTypePrinter::Implementation
11161123 if (!selfTypeDeclContext && !ABIparams.empty ())
11171124 convertABIAdditionalParams (FD, resultTy, ABIparams, additionalParams);
11181125
1119- funcPrinter.printFunctionSignature (
1126+ auto representation = funcPrinter.printFunctionSignature (
11201127 FD, funcABI.getSymbolName (), resultTy,
11211128 DeclAndTypeClangFunctionPrinter::FunctionSignatureKind::CFunctionProto,
11221129 additionalParams);
1130+ if (representation.isUnsupported ()) {
1131+ // FIXME: Emit remark about unemitted declaration.
1132+ return None;
1133+ }
1134+
1135+ os << cRepresentationOS.str ();
11231136 // Swift functions can't throw exceptions, we can only
11241137 // throw them from C++ when emitting C++ inline thunks for the Swift
11251138 // functions.
@@ -1402,8 +1415,10 @@ class DeclAndTypePrinter::Implementation
14021415 llvm::raw_string_ostream cFuncPrologueOS (cFuncDecl);
14031416 auto funcABI = Implementation (cFuncPrologueOS, owningPrinter, outputLang)
14041417 .printSwiftABIFunctionSignatureAsCxxFunction (FD);
1418+ if (!funcABI)
1419+ return ;
14051420 owningPrinter.prologueOS << cFuncPrologueOS.str ();
1406- printAbstractFunctionAsCxxFunctionThunk (FD, funcABI);
1421+ printAbstractFunctionAsCxxFunctionThunk (FD, * funcABI);
14071422 return ;
14081423 }
14091424 if (FD->getDeclContext ()->isTypeContext ())
0 commit comments