@@ -522,18 +522,24 @@ class DeclAndTypePrinter::Implementation
522522 elementDecl->getParentEnum ()->getModuleContext ());
523523 outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
524524 outOfLineOS << " >::type" ;
525- outOfLineOS << " ::returnNewValue([&](char * _Nonnull result) {\n " ;
526- outOfLineOS << " swift::"
527- << cxx_synthesis::getCxxImplNamespaceName ();
528- outOfLineOS << " ::implClassFor<" ;
529- outOfLineSyntaxPrinter.printModuleNamespaceQualifiersIfNeeded (
530- objectTypeDecl->getModuleContext (),
531- elementDecl->getParentEnum ()->getModuleContext ());
532- outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
533- outOfLineOS << " >::type" ;
534- outOfLineOS
535- << " ::initializeWithTake(result, payloadFromDestruction);\n " ;
536- outOfLineOS << " });\n " ;
525+ if (isa<ClassDecl>(objectTypeDecl)) {
526+ outOfLineOS << " ::makeRetained(*reinterpret_cast<void "
527+ " **>(payloadFromDestruction));\n " ;
528+ } else {
529+ outOfLineOS
530+ << " ::returnNewValue([&](char * _Nonnull result) {\n " ;
531+ outOfLineOS << " swift::"
532+ << cxx_synthesis::getCxxImplNamespaceName ();
533+ outOfLineOS << " ::implClassFor<" ;
534+ outOfLineSyntaxPrinter.printModuleNamespaceQualifiersIfNeeded (
535+ objectTypeDecl->getModuleContext (),
536+ elementDecl->getParentEnum ()->getModuleContext ());
537+ outOfLineSyntaxPrinter.printBaseName (objectTypeDecl);
538+ outOfLineOS << " >::type" ;
539+ outOfLineOS << " ::initializeWithTake(result, "
540+ " payloadFromDestruction);\n " ;
541+ outOfLineOS << " });\n " ;
542+ }
537543 }
538544 },
539545 ED, ED->getModuleContext (), outOfLineOS);
@@ -666,6 +672,13 @@ class DeclAndTypePrinter::Implementation
666672 outOfLineOS
667673 << " memcpy(result._getOpaquePointer(), &val, "
668674 " sizeof(val));\n " ;
675+ } else if (isa<ClassDecl>(objectTypeDecl)) {
676+ outOfLineOS
677+ << " auto op = swift::"
678+ << cxx_synthesis::getCxxImplNamespaceName ()
679+ << " ::_impl_RefCountedClass::copyOpaquePointer(val);\n " ;
680+ outOfLineOS << " memcpy(result._getOpaquePointer(), "
681+ " &op, sizeof(op));\n " ;
669682 } else {
670683 objectTypeDecl =
671684 paramType->getNominalOrBoundGenericNominal ();
0 commit comments