Skip to content

Commit e2c2235

Browse files
committed
Fix node order when we demangle opaque types.
When we formed a mangled name key to look up opaque return type decls during interface parsing, we were accidentally including the `Global` demangle node inside the `OpaqueReturnTypeOf` node, which ended up including the `$s` prefix in the mangling. Other type reconstruction clients like lldb which provided well-formed mangling trees did not include the Global node, causing the prefix to get left off and lookups to fail. Fix Sema to remove the Global node before looking up the opaque type, and have type reconstruction consistently apply the prefix to the lookup key.
1 parent ca7d777 commit e2c2235

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

lib/AST/ASTDemangler.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,14 @@ Type ASTBuilder::resolveOpaqueType(NodePointer opaqueDescriptor,
255255
unsigned ordinal) {
256256
if (opaqueDescriptor->getKind() == Node::Kind::OpaqueReturnTypeOf) {
257257
auto definingDecl = opaqueDescriptor->getChild(0);
258-
auto mangledName = mangleNode(definingDecl);
258+
auto definingGlobal = Factory.createNode(Node::Kind::Global);
259+
definingGlobal->addChild(definingDecl, Factory);
260+
auto mangledName = mangleNode(definingGlobal);
261+
259262
auto moduleNode = findModuleNode(definingDecl);
260263
if (!moduleNode)
261264
return Type();
262-
auto parentModule = findModule(findModuleNode(definingDecl));
265+
auto parentModule = findModule(moduleNode);
263266
if (!parentModule)
264267
return Type();
265268

lib/Sema/TypeCheckType.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2459,6 +2459,8 @@ Type TypeResolver::resolveOpaqueReturnType(TypeRepr *repr,
24592459
auto definingDeclNode = demangle.demangleSymbol(mangledName);
24602460
if (!definingDeclNode)
24612461
return Type();
2462+
if (definingDeclNode->getKind() == Node::Kind::Global)
2463+
definingDeclNode = definingDeclNode->getChild(0);
24622464
ASTBuilder builder(Context);
24632465
builder.Resolver = resolution.Resolver;
24642466
auto opaqueNode =

0 commit comments

Comments
 (0)