Skip to content

Commit e7cd0a1

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 7f76ed6 commit e7cd0a1

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
@@ -2481,6 +2481,8 @@ Type TypeResolver::resolveOpaqueReturnType(TypeRepr *repr,
24812481
auto definingDeclNode = demangle.demangleSymbol(mangledName);
24822482
if (!definingDeclNode)
24832483
return Type();
2484+
if (definingDeclNode->getKind() == Node::Kind::Global)
2485+
definingDeclNode = definingDeclNode->getChild(0);
24842486
ASTBuilder builder(Context);
24852487
builder.Resolver = resolution.Resolver;
24862488
auto opaqueNode =

0 commit comments

Comments
 (0)