[cxx-interop] Fix lookup of class template instantiations #58543
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
To fix a crash during deserialization, we need to store the mangled names of C++ class template instantiations in the lookup table.
For example,
std::string
will be serialized as__CxxTemplateInstNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
, and when another instance of the Swift compiler will later attempt to deserialize a decl referencing this instantiation, it will query theSwiftLookupTable
for a decl with this name. If this instantiation is not referenced from the module that is currently being compiled, Swift will not instantiatestd::string
during typechecking, and the mangled name will be missing fromSwiftLookupTable
, leading to a deserialization failure. This happens when compiling with cross-module optimization enabled, and the current module does not referencestd::string
, but one of its dependencies does.