Skip to content

Commit c8807f7

Browse files
committed
[lldb] Add missing recursion when desugaring a type
The type canonicalization would early-exit when desugaring of an outer node was successful, which means that GetCanonicalNode() would behave like DemangleCanonicalOutermostType() for types like sugared Optionals. rdar://149273756
1 parent bc3f984 commit c8807f7

File tree

6 files changed

+86
-3
lines changed

6 files changed

+86
-3
lines changed

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -1295,9 +1295,7 @@ TypeSystemSwiftTypeRef::GetCanonicalNode(swift::Demangle::Demangler &dem,
12951295
// SomeAlias<WhatSomeOtherAliasResolvesTo> because it tries to
12961296
// preserve all sugar.
12971297
using namespace swift::Demangle;
1298-
NodePointer transformed = Canonicalize(dem, node, flavor);
1299-
if (node != transformed)
1300-
return transformed;
1298+
node = Canonicalize(dem, node, flavor);
13011299

13021300
llvm::SmallVector<NodePointer, 2> children;
13031301
bool changed = false;

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

+3
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
6767
/// \}
6868

6969
/// Provided only for unit tests.
70+
/// \{
71+
friend struct TestTypeSystemSwiftTypeRef;
7072
TypeSystemSwiftTypeRef();
73+
/// \}
7174
~TypeSystemSwiftTypeRef();
7275
TypeSystemSwiftTypeRef(Module &module);
7376
/// Get the corresponding SwiftASTContext, and create one if necessary.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SWIFT_SOURCES := main.swift
2+
3+
include Makefile.rules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import lldb
2+
from lldbsuite.test.lldbtest import *
3+
from lldbsuite.test.decorators import *
4+
import lldbsuite.test.lldbutil as lldbutil
5+
6+
class TestSwiftObjCOptionalDict(TestBase):
7+
@skipUnlessDarwin
8+
@swiftTest
9+
def test(self):
10+
self.build()
11+
lldbutil.run_to_source_breakpoint(
12+
self, 'break here', lldb.SBFileSpec('main.swift'))
13+
14+
# This should from DWRAF, without loading a Swift module.
15+
self.expect("settings set symbols.swift-typesystem-compiler-fallback false")
16+
d = self.frame().FindVariable("dict")
17+
lldbutil.check_variable(self, d, summary='0 key/value pairs', value='some')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Foundation
2+
func f() {
3+
var dict : [NSKeyValueChangeKey : Any]? = [:]
4+
print("break here")
5+
}
6+
7+
f()

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

+55
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ using namespace lldb;
2323
using namespace lldb_private;
2424
using namespace llvm;
2525

26+
namespace lldb_private {
2627
struct TestTypeSystemSwiftTypeRef : public testing::Test {
2728
std::shared_ptr<TypeSystemSwiftTypeRef> m_swift_ts;
2829

@@ -32,7 +33,13 @@ struct TestTypeSystemSwiftTypeRef : public testing::Test {
3233
ConstString internalized(mangled_name);
3334
return m_swift_ts->GetTypeFromMangledTypename(internalized);
3435
}
36+
swift::Demangle::NodePointer
37+
DemangleCanonicalOutermostType(swift::Demangle::Demangler &dem,
38+
lldb::opaque_compiler_type_t type) {
39+
return m_swift_ts->DemangleCanonicalOutermostType(dem, type);
40+
}
3541
};
42+
} // namespace lldb_private
3643

3744
/// Helper class to conveniently construct demangle tree hierarchies.
3845
class NodeBuilder {
@@ -79,6 +86,15 @@ class NodeBuilder {
7986
Node(Node::Kind::Module, swift::STDLIB_NAME),
8087
Node(Node::Kind::Identifier, swift::BUILTIN_TYPE_NAME_FLOAT)));
8188
}
89+
NodePointer DesugaredOptionalType(NodePointer type) {
90+
return Node(Node::Kind::Type,
91+
Node(Node::Kind::BoundGenericEnum,
92+
Node(Node::Kind::Type,
93+
Node(Node::Kind::Enum,
94+
Node(Node::Kind::Module, swift::STDLIB_NAME),
95+
Node(Node::Kind::Identifier, "Optional"))),
96+
Node(Node::Kind::TypeList, type)));
97+
}
8298
NodePointer GlobalTypeMangling(NodePointer type) {
8399
assert(type && type->getKind() == Node::Kind::Type);
84100
return Node(Node::Kind::Global, Node(Node::Kind::TypeMangling, type));
@@ -1025,3 +1041,42 @@ TEST_F(TestTypeSystemSwiftTypeRef, Error) {
10251041
ASSERT_TRUE(m_swift_ts->ContainsError(opaque));
10261042
}
10271043
}
1044+
1045+
TEST_F(TestTypeSystemSwiftTypeRef, Canonicalize) {
1046+
using namespace swift::Demangle;
1047+
Demangler dem;
1048+
NodeBuilder b(dem);
1049+
{
1050+
{
1051+
NodePointer n0 =
1052+
b.GlobalType(b.Node(Node::Kind::SugaredOptional, b.IntType()));
1053+
NodePointer n1 =
1054+
b.GlobalTypeMangling(b.DesugaredOptionalType(b.IntType()));
1055+
CompilerType sugared = GetCompilerType(b.Mangle(n0));
1056+
CompilerType desugared = GetCompilerType(b.Mangle(n1));
1057+
ASSERT_EQ(sugared.GetCanonicalType().GetMangledTypeName(),
1058+
desugared.GetMangledTypeName());
1059+
}
1060+
{
1061+
NodePointer n0 = b.GlobalType(
1062+
b.Node(Node::Kind::SugaredOptional,
1063+
b.Node(Node::Kind::Type,
1064+
b.Node(Node::Kind::SugaredOptional, b.IntType()))));
1065+
NodePointer n1 = b.GlobalTypeMangling(
1066+
b.DesugaredOptionalType(b.DesugaredOptionalType(b.IntType())));
1067+
CompilerType sugared = GetCompilerType(b.Mangle(n0));
1068+
CompilerType desugared = GetCompilerType(b.Mangle(n1));
1069+
ASSERT_EQ(sugared.GetCanonicalType().GetMangledTypeName(),
1070+
desugared.GetMangledTypeName());
1071+
1072+
NodePointer n2 = b.GlobalType(
1073+
DemangleCanonicalOutermostType(dem, sugared.GetOpaqueQualType()));
1074+
NodePointer n3 = b.GlobalTypeMangling(b.DesugaredOptionalType(
1075+
b.Node(Node::Kind::SugaredOptional, b.IntType())));
1076+
CompilerType single_desugared2 = GetCompilerType(b.Mangle(n2));
1077+
CompilerType single_desugared3 = GetCompilerType(b.Mangle(n3));
1078+
ASSERT_EQ(single_desugared2.GetMangledTypeName(),
1079+
single_desugared3.GetMangledTypeName());
1080+
}
1081+
}
1082+
}

0 commit comments

Comments
 (0)