Skip to content

Commit d53ecfc

Browse files
committed
Merge commit '4a3eec76be08' from swift/release/6.1 into stable/20240723
Conflicts: lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h
2 parents 4518ebe + 4a3eec7 commit d53ecfc

File tree

5 files changed

+62
-15
lines changed

5 files changed

+62
-15
lines changed

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

+20-15
Original file line numberDiff line numberDiff line change
@@ -944,13 +944,6 @@ IsClangImportedType(NodePointer node,
944944
}
945945
}
946946

947-
/// Resolve a type alias node and return a demangle tree for the
948-
/// resolved type. If the type alias resolves to a Clang type, return
949-
/// a Clang CompilerType.
950-
///
951-
/// \param prefer_clang_types if this is true, type aliases in the
952-
/// __C module are resolved as Clang types.
953-
///
954947
std::pair<swift::Demangle::NodePointer, CompilerType>
955948
TypeSystemSwiftTypeRef::ResolveTypeAlias(swift::Demangle::Demangler &dem,
956949
swift::Demangle::NodePointer node,
@@ -1203,7 +1196,7 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
12031196
Node::Kind::Structure, "Array");
12041197
}
12051198
case Node::Kind::SugaredDictionary:
1206-
// FIXME: This isnt covered by any test.
1199+
// FIXME: This isn't covered by any test.
12071200
assert(node->getNumChildren() == 2);
12081201
if (node->getNumChildren() != 2)
12091202
return node;
@@ -1217,15 +1210,27 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
12171210

12181211
case Node::Kind::BoundGenericTypeAlias:
12191212
case Node::Kind::TypeAlias: {
1220-
auto node_clangtype = ResolveTypeAlias(dem, node, flavor);
1221-
if (CompilerType clang_type = node_clangtype.second) {
1222-
if (auto result = GetClangTypeNode(clang_type, dem))
1223-
return result;
1224-
else
1213+
// Safeguard against cyclic aliases.
1214+
for (unsigned alias_depth = 0; alias_depth < 64; ++alias_depth) {
1215+
auto node_clangtype = ResolveTypeAlias(dem, node, flavor);
1216+
if (CompilerType clang_type = node_clangtype.second) {
1217+
if (auto result = GetClangTypeNode(clang_type, dem))
1218+
return result;
1219+
// Failed to convert that clang type into a demangle node.
1220+
return node;
1221+
}
1222+
if (!node_clangtype.first)
1223+
return node;
1224+
if (node_clangtype.first == node)
12251225
return node;
1226+
node = node_clangtype.first;
1227+
if (node->getKind() != Node::Kind::BoundGenericTypeAlias &&
1228+
node->getKind() != Node::Kind::TypeAlias)
1229+
// Resolve any type aliases in the resolved type.
1230+
return GetCanonicalNode(dem, node, flavor);
1231+
// This type alias resolved to another type alias.
12261232
}
1227-
if (node_clangtype.first)
1228-
return node_clangtype.first;
1233+
// Hit the safeguard limit.
12291234
return node;
12301235
}
12311236
default:

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

+13
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,19 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
502502
CompilerType LookupClangForwardType(llvm::StringRef name,
503503
llvm::ArrayRef<CompilerContext> decl_context);
504504

505+
/// Recursively resolves all type aliases.
506+
swift::Demangle::NodePointer
507+
ResolveAllTypeAliases(swift::Demangle::Demangler &dem,
508+
swift::Demangle::NodePointer node,
509+
swift::Mangle::ManglingFlavor flavor);
510+
511+
/// Resolve a type alias node and return a demangle tree for the
512+
/// resolved type. If the type alias resolves to a Clang type, return
513+
/// a Clang CompilerType.
514+
///
515+
/// \param prefer_clang_types if this is true, type aliases in the
516+
/// __C module are resolved as Clang types.
517+
///
505518
std::pair<swift::Demangle::NodePointer, CompilerType> ResolveTypeAlias(
506519
swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
507520
swift::Mangle::ManglingFlavor flavor, bool prefer_clang_types = false);
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,14 @@
1+
from lldbsuite.test.lldbtest import *
2+
from lldbsuite.test.decorators import *
3+
import lldbsuite.test.lldbutil as lldbutil
4+
5+
class TestSwiftTypeAliasRecurtsive(TestBase):
6+
@swiftTest
7+
def test(self):
8+
"""Test that type aliases of type aliases can be resolved"""
9+
self.build()
10+
self.runCmd("settings set symbols.swift-validate-typesystem false")
11+
self.expect("log enable lldb types")
12+
target, process, _, _ = lldbutil.run_to_source_breakpoint(
13+
self, "break here", lldb.SBFileSpec("main.swift"))
14+
self.expect("frame variable cls", substrs=["ClassAlias?", "0x"])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
open class MyClass<A, B> {}
2+
public typealias LocalAlias = Bool
3+
let anchor : LocalAlias = true
4+
public typealias ClassAlias = MyClass<LocalAlias, Bool>
5+
class Repro {
6+
let field: ClassAlias?
7+
init(cls: ClassAlias?) {
8+
self.field = cls // break here
9+
}
10+
}
11+
12+
Repro(cls: ClassAlias())

0 commit comments

Comments
 (0)