@@ -543,25 +543,29 @@ class DeclAndTypePrinter::Implementation
543543 std::tie (objectType, optKind) = getObjectTypeAndOptionality (
544544 paramType->getNominalOrBoundGenericNominal (), paramType);
545545 auto objectTypeDecl = objectType->getNominalOrBoundGenericNominal ();
546+ assert (objectTypeDecl != nullptr || paramType->isOptional ());
546547
547- if (auto knownCxxType =
548- owningPrinter.typeMapping .getKnownCxxTypeInfo (
549- objectTypeDecl)) {
548+ if (objectTypeDecl &&
549+ owningPrinter.typeMapping .getKnownCxxTypeInfo (objectTypeDecl)) {
550550 outOfLineOS << " " << types[paramType] << " result;\n " ;
551551 outOfLineOS << " "
552552 " memcpy(&result, payloadFromDestruction, "
553553 " sizeof(result));\n " ;
554554 outOfLineOS << " return result;\n " ;
555555 } else {
556+ bool isOptional = false ;
557+ if (!objectTypeDecl) {
558+ objectTypeDecl = paramType->getNominalOrBoundGenericNominal ();
559+ isOptional = true ;
560+ }
556561 outOfLineOS << " return swift::" ;
557562 outOfLineOS << cxx_synthesis::getCxxImplNamespaceName ();
558563 outOfLineOS << " ::implClassFor<" ;
559- outOfLineSyntaxPrinter.printModuleNamespaceQualifiersIfNeeded (
560- objectTypeDecl-> getModuleContext () ,
564+ outOfLineSyntaxPrinter.printNominalTypeReference (
565+ objectTypeDecl,
561566 elementDecl->getParentEnum ()->getModuleContext ());
562- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
563567 outOfLineOS << " >::type" ;
564- if (isa<ClassDecl>(objectTypeDecl)) {
568+ if (!isOptional && isa<ClassDecl>(objectTypeDecl)) {
565569 outOfLineOS << " ::makeRetained(*reinterpret_cast<void "
566570 " **>(payloadFromDestruction));\n " ;
567571 } else {
@@ -570,10 +574,9 @@ class DeclAndTypePrinter::Implementation
570574 outOfLineOS << " swift::"
571575 << cxx_synthesis::getCxxImplNamespaceName ();
572576 outOfLineOS << " ::implClassFor<" ;
573- outOfLineSyntaxPrinter.printModuleNamespaceQualifiersIfNeeded (
574- objectTypeDecl-> getModuleContext () ,
577+ outOfLineSyntaxPrinter.printNominalTypeReference (
578+ objectTypeDecl,
575579 elementDecl->getParentEnum ()->getModuleContext ());
576- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
577580 outOfLineOS << " >::type" ;
578581 outOfLineOS << " ::initializeWithTake(result, "
579582 " payloadFromDestruction);\n " ;
@@ -707,14 +710,15 @@ class DeclAndTypePrinter::Implementation
707710 ED, paramType);
708711 auto objectTypeDecl =
709712 objectType->getNominalOrBoundGenericNominal ();
710- assert (objectTypeDecl != nullptr );
713+ assert (objectTypeDecl != nullptr || paramType-> isOptional () );
711714
712- if (owningPrinter.typeMapping .getKnownCxxTypeInfo (
715+ if (objectTypeDecl &&
716+ owningPrinter.typeMapping .getKnownCxxTypeInfo (
713717 objectTypeDecl)) {
714718 outOfLineOS
715719 << " memcpy(result._getOpaquePointer(), &val, "
716720 " sizeof(val));\n " ;
717- } else if (isa <ClassDecl>(objectTypeDecl)) {
721+ } else if (isa_and_nonnull <ClassDecl>(objectTypeDecl)) {
718722 outOfLineOS
719723 << " auto op = swift::"
720724 << cxx_synthesis::getCxxImplNamespaceName ()
@@ -725,46 +729,31 @@ class DeclAndTypePrinter::Implementation
725729 objectTypeDecl =
726730 paramType->getNominalOrBoundGenericNominal ();
727731 outOfLineOS << " alignas(" ;
728- outOfLineSyntaxPrinter
729- .printModuleNamespaceQualifiersIfNeeded (
730- objectTypeDecl->getModuleContext (),
731- ED->getModuleContext ());
732- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
732+ outOfLineSyntaxPrinter.printNominalTypeReference (
733+ objectTypeDecl, ED->getModuleContext ());
733734 outOfLineOS << " ) unsigned char buffer[sizeof(" ;
734- outOfLineSyntaxPrinter
735- .printModuleNamespaceQualifiersIfNeeded (
736- objectTypeDecl->getModuleContext (),
737- ED->getModuleContext ());
738- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
735+ outOfLineSyntaxPrinter.printNominalTypeReference (
736+ objectTypeDecl, ED->getModuleContext ());
739737 outOfLineOS << " )];\n " ;
740738 outOfLineOS << " auto *valCopy = new(buffer) " ;
741- outOfLineSyntaxPrinter
742- .printModuleNamespaceQualifiersIfNeeded (
743- objectTypeDecl->getModuleContext (),
744- ED->getModuleContext ());
745- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
739+ outOfLineSyntaxPrinter.printNominalTypeReference (
740+ objectTypeDecl, ED->getModuleContext ());
746741 outOfLineOS << " (val);\n " ;
747742 outOfLineOS << " " ;
748743 outOfLineOS << cxx_synthesis::getCxxSwiftNamespaceName ()
749744 << " ::" ;
750745 outOfLineOS << cxx_synthesis::getCxxImplNamespaceName ();
751746 outOfLineOS << " ::implClassFor<" ;
752- outOfLineSyntaxPrinter
753- .printModuleNamespaceQualifiersIfNeeded (
754- objectTypeDecl->getModuleContext (),
755- ED->getModuleContext ());
756- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
747+ outOfLineSyntaxPrinter.printNominalTypeReference (
748+ objectTypeDecl, ED->getModuleContext ());
757749 outOfLineOS << " >::type::initializeWithTake(result._"
758750 " getOpaquePointer(), " ;
759751 outOfLineOS << cxx_synthesis::getCxxSwiftNamespaceName ()
760752 << " ::" ;
761753 outOfLineOS << cxx_synthesis::getCxxImplNamespaceName ();
762754 outOfLineOS << " ::implClassFor<" ;
763- outOfLineSyntaxPrinter
764- .printModuleNamespaceQualifiersIfNeeded (
765- objectTypeDecl->getModuleContext (),
766- ED->getModuleContext ());
767- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
755+ outOfLineSyntaxPrinter.printNominalTypeReference (
756+ objectTypeDecl, ED->getModuleContext ());
768757 outOfLineOS << " >::type::getOpaquePointer(*valCopy)" ;
769758 outOfLineOS << " );\n " ;
770759 }
@@ -2912,9 +2901,6 @@ static bool isEnumExposableToCxx(const ValueDecl *VD,
29122901 if (auto *params = elementDecl->getParameterList ()) {
29132902 for (const auto *param : *params) {
29142903 auto paramType = param->getInterfaceType ();
2915- // TODO: properly support exporting these optionals. rdar://131112273
2916- if (paramType->isOptional () && paramType->getOptionalObjectType ()->isTypeParameter ())
2917- return false ;
29182904 if (DeclAndTypeClangFunctionPrinter::getTypeRepresentation (
29192905 printer.getTypeMapping (), printer.getInteropContext (),
29202906 printer, enumDecl->getModuleContext (), paramType)
0 commit comments