Skip to content

Commit f73d722

Browse files
committed
[CSDiagnostics] Teach generic parameter restoration logic about pack expansions
Just like in any other position, let's restore unresolved type variables that represent generic parameters to their generic parameter type when they are found in a pack expansion pattern type.
1 parent c51685c commit f73d722

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

lib/Sema/CSDiagnostics.h

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,20 +99,34 @@ class FailureDiagnostic {
9999
/// Resolve type variables present in the raw type, if any.
100100
Type resolveType(Type rawType, bool reconstituteSugar = false,
101101
bool wantRValue = true) const {
102-
auto &cs = getConstraintSystem();
103-
104102
if (rawType->hasTypeVariable() || rawType->hasPlaceholder()) {
105-
rawType = rawType.transform([&](Type type) {
103+
rawType = rawType.transform([&](Type type) -> Type {
106104
if (auto *typeVar = type->getAs<TypeVariableType>()) {
107105
auto resolvedType = S.simplifyType(typeVar);
106+
107+
if (!resolvedType->hasUnresolvedType())
108+
return resolvedType;
109+
110+
// If type variable was simplified to an unresolved pack expansion
111+
// type, let's examine its original pattern type because it could
112+
// contain type variables replaceable with their generic parameter
113+
// types.
114+
if (auto *expansion = resolvedType->getAs<PackExpansionType>()) {
115+
auto *locator = typeVar->getImpl().getLocator();
116+
auto *openedExpansionTy =
117+
locator->castLastElementTo<LocatorPathElt::PackExpansionType>()
118+
.getOpenedType();
119+
auto patternType = resolveType(openedExpansionTy->getPatternType());
120+
return PackExpansionType::get(patternType,
121+
expansion->getCountType());
122+
}
123+
108124
Type GP = typeVar->getImpl().getGenericParameter();
109-
return resolvedType->is<UnresolvedType>() && GP
110-
? GP
111-
: resolvedType;
125+
return resolvedType->is<UnresolvedType>() && GP ? GP : resolvedType;
112126
}
113127

114128
return type->isPlaceholder()
115-
? Type(cs.getASTContext().TheUnresolvedType)
129+
? Type(type->getASTContext().TheUnresolvedType)
116130
: type;
117131
});
118132
}

0 commit comments

Comments
 (0)