Skip to content

Commit 7d33a85

Browse files
authored
Merge pull request #60583 from hyp/eng/unsupported-noooo
[interop][SwiftToCxx] do not emit unsupported function signatures yet
2 parents 5bfef4f + d4a7f86 commit 7d33a85

File tree

6 files changed

+169
-78
lines changed

6 files changed

+169
-78
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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())

lib/PrintAsClang/ModuleContentsWriter.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -388,11 +388,12 @@ class ModuleWriter {
388388
if ((superclass = CD->getSuperclassDecl())) {
389389
allRequirementsSatisfied &= require(superclass);
390390
}
391-
for (auto proto : CD->getLocalProtocols(
392-
ConformanceLookupKind::OnlyExplicit))
393-
if (printer.shouldInclude(proto))
394-
allRequirementsSatisfied &= require(proto);
395-
391+
if (outputLangMode != OutputLanguageMode::Cxx) {
392+
for (auto proto :
393+
CD->getLocalProtocols(ConformanceLookupKind::OnlyExplicit))
394+
if (printer.shouldInclude(proto))
395+
allRequirementsSatisfied &= require(proto);
396+
}
396397
if (!allRequirementsSatisfied)
397398
return false;
398399

0 commit comments

Comments
 (0)