@@ -944,13 +944,6 @@ IsClangImportedType(NodePointer node,
944
944
}
945
945
}
946
946
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
- // /
954
947
std::pair<swift::Demangle::NodePointer, CompilerType>
955
948
TypeSystemSwiftTypeRef::ResolveTypeAlias (swift::Demangle::Demangler &dem,
956
949
swift::Demangle::NodePointer node,
@@ -1203,7 +1196,7 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
1203
1196
Node::Kind::Structure, " Array" );
1204
1197
}
1205
1198
case Node::Kind::SugaredDictionary:
1206
- // FIXME: This isnt covered by any test.
1199
+ // FIXME: This isn't covered by any test.
1207
1200
assert (node->getNumChildren () == 2 );
1208
1201
if (node->getNumChildren () != 2 )
1209
1202
return node;
@@ -1217,15 +1210,27 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
1217
1210
1218
1211
case Node::Kind::BoundGenericTypeAlias:
1219
1212
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)
1225
1225
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.
1226
1232
}
1227
- if (node_clangtype.first )
1228
- return node_clangtype.first ;
1233
+ // Hit the safeguard limit.
1229
1234
return node;
1230
1235
}
1231
1236
default :
0 commit comments