[ASTMangler] Mangle nested imported error structs correctly #24804
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.
Error structs synthesized by ClangImporter can be renamed using
SWIFT_NAME()
to syntactically appear anywhere in the type hierarchy with any name, but they should always be mangled as__C_Synthesized.related decl ‘e’ of <clang enum name>
. Unfortunately, whenSWIFT_NAME()
was used to nest the error struct inside another type, an ASTMangler bug would cause it to be mangled as<parent type>.related decl ‘e’ of <clang enum name>
, and an ASTDemangler bug would also require a valid parent type. This created a mismatch between the compiler’s and runtime’s manglings which caused crashes when you tried to match the imported error struct in acatch
.This PR corrects the compiler bugs so that it generates the mangling the runtime expects. This is theoretically ABI-breaking, but as far as I can determine nobody has shipped the incorrectly mangled names, presumably because they crash when you try to use them.
Fixes rdar://problem/48040880.
(This PR does not affect the mangling of error types written in Swift, only ones imported from Clang.)