@@ -545,25 +545,29 @@ class DeclAndTypePrinter::Implementation
545545 std::tie (objectType, optKind) = getObjectTypeAndOptionality (
546546 paramType->getNominalOrBoundGenericNominal (), paramType);
547547 auto objectTypeDecl = objectType->getNominalOrBoundGenericNominal ();
548+ assert (objectTypeDecl != nullptr || paramType->isOptional ());
548549
549- if (auto knownCxxType =
550- owningPrinter.typeMapping .getKnownCxxTypeInfo (
551- objectTypeDecl)) {
550+ if (objectTypeDecl &&
551+ owningPrinter.typeMapping .getKnownCxxTypeInfo (objectTypeDecl)) {
552552 outOfLineOS << " " << types[paramType] << " result;\n " ;
553553 outOfLineOS << " "
554554 " memcpy(&result, payloadFromDestruction, "
555555 " sizeof(result));\n " ;
556556 outOfLineOS << " return result;\n " ;
557557 } else {
558+ bool isOptional = false ;
559+ if (!objectTypeDecl) {
560+ objectTypeDecl = paramType->getNominalOrBoundGenericNominal ();
561+ isOptional = true ;
562+ }
558563 outOfLineOS << " return swift::" ;
559564 outOfLineOS << cxx_synthesis::getCxxImplNamespaceName ();
560565 outOfLineOS << " ::implClassFor<" ;
561- outOfLineSyntaxPrinter.printModuleNamespaceQualifiersIfNeeded (
562- objectTypeDecl-> getModuleContext () ,
566+ outOfLineSyntaxPrinter.printNominalTypeReference (
567+ objectTypeDecl,
563568 elementDecl->getParentEnum ()->getModuleContext ());
564- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
565569 outOfLineOS << " >::type" ;
566- if (isa<ClassDecl>(objectTypeDecl)) {
570+ if (!isOptional && isa<ClassDecl>(objectTypeDecl)) {
567571 outOfLineOS << " ::makeRetained(*reinterpret_cast<void "
568572 " **>(payloadFromDestruction));\n " ;
569573 } else {
@@ -572,10 +576,9 @@ class DeclAndTypePrinter::Implementation
572576 outOfLineOS << " swift::"
573577 << cxx_synthesis::getCxxImplNamespaceName ();
574578 outOfLineOS << " ::implClassFor<" ;
575- outOfLineSyntaxPrinter.printModuleNamespaceQualifiersIfNeeded (
576- objectTypeDecl-> getModuleContext () ,
579+ outOfLineSyntaxPrinter.printNominalTypeReference (
580+ objectTypeDecl,
577581 elementDecl->getParentEnum ()->getModuleContext ());
578- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
579582 outOfLineOS << " >::type" ;
580583 outOfLineOS << " ::initializeWithTake(result, "
581584 " payloadFromDestruction);\n " ;
@@ -709,14 +712,15 @@ class DeclAndTypePrinter::Implementation
709712 ED, paramType);
710713 auto objectTypeDecl =
711714 objectType->getNominalOrBoundGenericNominal ();
712- assert (objectTypeDecl != nullptr );
715+ assert (objectTypeDecl != nullptr || paramType-> isOptional () );
713716
714- if (owningPrinter.typeMapping .getKnownCxxTypeInfo (
717+ if (objectTypeDecl &&
718+ owningPrinter.typeMapping .getKnownCxxTypeInfo (
715719 objectTypeDecl)) {
716720 outOfLineOS
717721 << " memcpy(result._getOpaquePointer(), &val, "
718722 " sizeof(val));\n " ;
719- } else if (isa <ClassDecl>(objectTypeDecl)) {
723+ } else if (isa_and_nonnull <ClassDecl>(objectTypeDecl)) {
720724 outOfLineOS
721725 << " auto op = swift::"
722726 << cxx_synthesis::getCxxImplNamespaceName ()
@@ -727,46 +731,31 @@ class DeclAndTypePrinter::Implementation
727731 objectTypeDecl =
728732 paramType->getNominalOrBoundGenericNominal ();
729733 outOfLineOS << " alignas(" ;
730- outOfLineSyntaxPrinter
731- .printModuleNamespaceQualifiersIfNeeded (
732- objectTypeDecl->getModuleContext (),
733- ED->getModuleContext ());
734- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
734+ outOfLineSyntaxPrinter.printNominalTypeReference (
735+ objectTypeDecl, ED->getModuleContext ());
735736 outOfLineOS << " ) unsigned char buffer[sizeof(" ;
736- outOfLineSyntaxPrinter
737- .printModuleNamespaceQualifiersIfNeeded (
738- objectTypeDecl->getModuleContext (),
739- ED->getModuleContext ());
740- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
737+ outOfLineSyntaxPrinter.printNominalTypeReference (
738+ objectTypeDecl, ED->getModuleContext ());
741739 outOfLineOS << " )];\n " ;
742740 outOfLineOS << " auto *valCopy = new(buffer) " ;
743- outOfLineSyntaxPrinter
744- .printModuleNamespaceQualifiersIfNeeded (
745- objectTypeDecl->getModuleContext (),
746- ED->getModuleContext ());
747- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
741+ outOfLineSyntaxPrinter.printNominalTypeReference (
742+ objectTypeDecl, ED->getModuleContext ());
748743 outOfLineOS << " (val);\n " ;
749744 outOfLineOS << " " ;
750745 outOfLineOS << cxx_synthesis::getCxxSwiftNamespaceName ()
751746 << " ::" ;
752747 outOfLineOS << cxx_synthesis::getCxxImplNamespaceName ();
753748 outOfLineOS << " ::implClassFor<" ;
754- outOfLineSyntaxPrinter
755- .printModuleNamespaceQualifiersIfNeeded (
756- objectTypeDecl->getModuleContext (),
757- ED->getModuleContext ());
758- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
749+ outOfLineSyntaxPrinter.printNominalTypeReference (
750+ objectTypeDecl, ED->getModuleContext ());
759751 outOfLineOS << " >::type::initializeWithTake(result._"
760752 " getOpaquePointer(), " ;
761753 outOfLineOS << cxx_synthesis::getCxxSwiftNamespaceName ()
762754 << " ::" ;
763755 outOfLineOS << cxx_synthesis::getCxxImplNamespaceName ();
764756 outOfLineOS << " ::implClassFor<" ;
765- outOfLineSyntaxPrinter
766- .printModuleNamespaceQualifiersIfNeeded (
767- objectTypeDecl->getModuleContext (),
768- ED->getModuleContext ());
769- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
757+ outOfLineSyntaxPrinter.printNominalTypeReference (
758+ objectTypeDecl, ED->getModuleContext ());
770759 outOfLineOS << " >::type::getOpaquePointer(*valCopy)" ;
771760 outOfLineOS << " );\n " ;
772761 }
@@ -2914,9 +2903,6 @@ static bool isEnumExposableToCxx(const ValueDecl *VD,
29142903 if (auto *params = elementDecl->getParameterList ()) {
29152904 for (const auto *param : *params) {
29162905 auto paramType = param->getInterfaceType ();
2917- // TODO: properly support exporting these optionals. rdar://131112273
2918- if (paramType->isOptional () && paramType->getOptionalObjectType ()->isTypeParameter ())
2919- return false ;
29202906 if (DeclAndTypeClangFunctionPrinter::getTypeRepresentation (
29212907 printer.getTypeMapping (), printer.getInteropContext (),
29222908 printer, enumDecl->getModuleContext (), paramType)
0 commit comments