Skip to content

Commit cb4826e

Browse files
committed
Fix TypeSystemSwiftTypeRef::GetTypeInfo() results for bound generic enums.
rdar://problem/70734497 (cherry picked from commit 2e21a9e)
1 parent cbb8ce9 commit cb4826e

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,21 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetDemangleTreeForPrinting(
720720
return canonical;
721721
}
722722

723+
/// Determine wether this demangle tree contains an unresolved type alias.
724+
static bool ContainsGenericTypeParameter(swift::Demangle::NodePointer node) {
725+
if (!node)
726+
return false;
727+
728+
if (node->getKind() == swift::Demangle::Node::Kind::DependentGenericParamType)
729+
return true;
730+
731+
for (swift::Demangle::NodePointer child : *node)
732+
if (ContainsGenericTypeParameter(child))
733+
return true;
734+
735+
return false;
736+
}
737+
723738
/// Collect TypeInfo flags from a demangle tree. For most attributes
724739
/// this can stop scanning at the outmost type, however in order to
725740
/// determine whether a node is generic or not, it needs to visit all
@@ -770,7 +785,6 @@ static uint32_t collectTypeInfo(SwiftASTContext *module_holder,
770785
}
771786
else
772787
switch (node->getKind()) {
773-
774788
case Node::Kind::SugaredOptional:
775789
swift_flags |= eTypeIsGeneric | eTypeIsBound | eTypeHasChildren |
776790
eTypeHasValue | eTypeIsEnumeration;
@@ -841,8 +855,7 @@ static uint32_t collectTypeInfo(SwiftASTContext *module_holder,
841855
if (node->getNumChildren() != 2)
842856
break;
843857
// Bug-for-bug compatibility.
844-
if (!(collectTypeInfo(module_holder, dem, node->getChild(1)) &
845-
eTypeIsGenericTypeParam))
858+
if (!ContainsGenericTypeParameter(node->getChild(1)))
846859
swift_flags |= eTypeHasValue | eTypeHasChildren;
847860
auto module = node->getChild(0);
848861
if (module->hasText() &&

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,35 @@ TEST_F(TestTypeSystemSwiftTypeRef, GetTypeInfo) {
208208
ASSERT_EQ(p.GetTypeInfo() & (eTypeIsFloat | eTypeIsScalar),
209209
eTypeIsFloat | eTypeIsScalar);
210210
}
211+
{
212+
NodePointer n = b.GlobalType(b.Node(
213+
Node::Kind::BoundGenericEnum,
214+
b.Node(Node::Kind::Type,
215+
b.Node(Node::Kind::Enum,
216+
b.Node(Node::Kind::Module, swift::STDLIB_NAME),
217+
b.Node(Node::Kind::Identifier, "Optional"))),
218+
b.Node(
219+
Node::Kind::TypeList,
220+
b.Node(
221+
Node::Kind::Type,
222+
b.Node(
223+
Node::Kind::BoundGenericStructure,
224+
b.Node(
225+
Node::Kind::Type,
226+
b.Node(Node::Kind::Structure,
227+
b.Node(Node::Kind::Module, swift::STDLIB_NAME),
228+
b.Node(Node::Kind::Identifier,
229+
"UnsafeMutablePointer"))),
230+
b.Node(Node::Kind::TypeList,
231+
b.Node(Node::Kind::Type,
232+
b.Node(Node::Kind::DependentGenericParamType,
233+
b.NodeWithIndex(Node::Kind::Index, 0),
234+
b.NodeWithIndex(Node::Kind::Index,
235+
0)))))))));
236+
CompilerType p = GetCompilerType(b.Mangle(n));
237+
ASSERT_EQ(p.GetTypeInfo(), (eTypeIsEnumeration | eTypeIsSwift |
238+
eTypeIsGeneric | eTypeIsBound));
239+
}
211240
}
212241

213242
TEST_F(TestTypeSystemSwiftTypeRef, Pointer) {

0 commit comments

Comments
 (0)