@@ -95,6 +95,7 @@ void ClangValueTypePrinter::forwardDeclType(raw_ostream &os,
95
95
}
96
96
97
97
static void addCppExtensionsToStdlibType (const NominalTypeDecl *typeDecl,
98
+ raw_ostream &os,
98
99
ClangSyntaxPrinter &printer,
99
100
raw_ostream &cPrologueOS) {
100
101
if (typeDecl == typeDecl->getASTContext ().getStringDecl ()) {
@@ -135,6 +136,9 @@ static void addCppExtensionsToStdlibType(const NominalTypeDecl *typeDecl,
135
136
" $sSS10FoundationE36_"
136
137
" unconditionallyBridgeFromObjectiveCySSSo8NSStringCSgFZ("
137
138
" void * _Nullable) SWIFT_NOEXCEPT SWIFT_CALL;\n " ;
139
+ cPrologueOS << " SWIFT_EXTERN swift_interop_stub_Swift_String "
140
+ " $sSS7cStringSSSPys4Int8VG_tcfC("
141
+ " const char * _Nonnull) SWIFT_NOEXCEPT SWIFT_CALL;\n " ;
138
142
printer.printObjCBlock ([](raw_ostream &os) {
139
143
os << " " ;
140
144
ClangSyntaxPrinter (os).printInlineForThunk ();
@@ -155,6 +159,14 @@ static void addCppExtensionsToStdlibType(const NominalTypeDecl *typeDecl,
155
159
os << " return result;\n " ;
156
160
os << " }\n " ;
157
161
});
162
+ os << " #ifndef SWIFT_CXX_INTEROP_HIDE_STL_OVERLAY\n " ;
163
+ ClangSyntaxPrinter (os).printInlineForThunk ();
164
+ os << " String(const std::string &str) noexcept {\n " ;
165
+ os << " auto res = "
166
+ " _impl::$sSS7cStringSSSPys4Int8VG_tcfC(str.c_str());\n " ;
167
+ os << " memcpy(_getOpaquePointer(), &res, sizeof(res));\n " ;
168
+ os << " }\n " ;
169
+ os << " #endif\n " ;
158
170
} else if (typeDecl == typeDecl->getASTContext ().getOptionalDecl ()) {
159
171
// Add additional methods for the `Optional` declaration.
160
172
printer.printDefine (" SWIFT_CXX_INTEROP_OPTIONAL_MIXIN" );
@@ -295,7 +307,7 @@ void ClangValueTypePrinter::printValueTypeDecl(
295
307
296
308
bodyPrinter ();
297
309
if (typeDecl->isStdlibDecl ())
298
- addCppExtensionsToStdlibType (typeDecl, printer, cPrologueOS);
310
+ addCppExtensionsToStdlibType (typeDecl, os, printer, cPrologueOS);
299
311
300
312
os << " private:\n " ;
301
313
0 commit comments