Skip to content

Commit fb05ede

Browse files
committed
Runtime: Don't attempt to round-trip mangled names for private types.
By design, we don't want private or function-nested types to be accessible by mangled name, since they don't have stable identities, and they could inadvertently become ABI if someone serialized a mangled string and expected to deserialize it into a type. Fixes rdar://problem/39826794 .
1 parent 0f6f349 commit fb05ede

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4196,6 +4196,16 @@ bool Metadata::satisfiesClassConstraint() const {
41964196
}
41974197

41984198
#if !NDEBUG
4199+
static bool referencesAnonymousContext(Demangle::Node *node) {
4200+
if (node->getKind() == Demangle::Node::Kind::AnonymousContext)
4201+
return true;
4202+
for (unsigned i = 0, e = node->getNumChildren(); i < e; ++i)
4203+
if (referencesAnonymousContext(node->getChild(i)))
4204+
return true;
4205+
4206+
return false;
4207+
}
4208+
41994209
void swift::verifyMangledNameRoundtrip(const Metadata *metadata) {
42004210
// Enable verification when a special environment variable is set.
42014211
// Some metatypes crash when going through the mangler or demangler. A
@@ -4211,12 +4221,17 @@ void swift::verifyMangledNameRoundtrip(const Metadata *metadata) {
42114221

42124222
Demangle::Demangler Dem;
42134223
auto node = _swift_buildDemanglingForMetadata(metadata, Dem);
4224+
// If the mangled node involves types in an AnonymousContext, then by design,
4225+
// it cannot be looked up by name.
4226+
if (referencesAnonymousContext(node))
4227+
return;
4228+
42144229
auto mangledName = Demangle::mangleNode(node);
42154230
auto result = _getTypeByMangledName(mangledName,
42164231
[](unsigned, unsigned){ return nullptr; });
42174232
if (metadata != result)
42184233
swift::warning(RuntimeErrorFlagNone,
4219-
"Metadata mangled name failed to roundtrip: %p -> %s -> %p",
4234+
"Metadata mangled name failed to roundtrip: %p -> %s -> %p\n",
42204235
metadata, mangledName.c_str(), (const Metadata *)result);
42214236
}
42224237
#endif

0 commit comments

Comments
 (0)