@@ -61,34 +61,36 @@ class TypeVariableRefFinder : public ASTWalker {
61
61
62
62
private:
63
63
void inferVariables (Type type) {
64
- auto *typeVar = type->getWithoutSpecifierType ()->getAs <TypeVariableType>();
65
- if (!typeVar)
66
- return ;
67
-
64
+ type = type->getWithoutSpecifierType ();
68
65
// Record the type variable itself because it has to
69
66
// be in scope even when already bound.
70
- ReferencedVars.insert (typeVar);
71
-
72
- // It is possible that contextual type of a parameter/result
73
- // has been assigned to e.g. an anonymous or named argument
74
- // early, to facilitate closure type checking. Such a
75
- // type can have type variables inside e.g.
76
- //
77
- // func test<T>(_: (UnsafePointer<T>) -> Void) {}
78
- //
79
- // test { ptr in
80
- // ...
81
- // }
82
- //
83
- // Type variable representing `ptr` in the body of
84
- // this closure would be bound to `UnsafePointer<$T>`
85
- // in this case, where `$T` is a type variable for a
86
- // generic parameter `T`.
87
- auto simplifiedTy = CS.getFixedTypeRecursive (typeVar, /* wantRValue=*/ false );
67
+ if (auto *typeVar = type->getAs <TypeVariableType>()) {
68
+ ReferencedVars.insert (typeVar);
69
+
70
+ // It is possible that contextual type of a parameter/result
71
+ // has been assigned to e.g. an anonymous or named argument
72
+ // early, to facilitate closure type checking. Such a
73
+ // type can have type variables inside e.g.
74
+ //
75
+ // func test<T>(_: (UnsafePointer<T>) -> Void) {}
76
+ //
77
+ // test { ptr in
78
+ // ...
79
+ // }
80
+ //
81
+ // Type variable representing `ptr` in the body of
82
+ // this closure would be bound to `UnsafePointer<$T>`
83
+ // in this case, where `$T` is a type variable for a
84
+ // generic parameter `T`.
85
+ type = CS.getFixedTypeRecursive (typeVar, /* wantRValue=*/ false );
86
+
87
+ if (type->isEqual (typeVar))
88
+ return ;
89
+ }
88
90
89
- if (!simplifiedTy-> isEqual (typeVar) && simplifiedTy ->hasTypeVariable ()) {
91
+ if (type ->hasTypeVariable ()) {
90
92
SmallPtrSet<TypeVariableType *, 4 > typeVars;
91
- simplifiedTy ->getTypeVariables (typeVars);
93
+ type ->getTypeVariables (typeVars);
92
94
ReferencedVars.insert (typeVars.begin (), typeVars.end ());
93
95
}
94
96
}
@@ -113,8 +115,16 @@ class UnresolvedClosureParameterCollector : public ASTWalker {
113
115
auto *decl = DRE->getDecl ();
114
116
if (isa<ParamDecl>(decl)) {
115
117
if (auto type = CS.getTypeIfAvailable (decl)) {
116
- if (auto *typeVar = type->getAs <TypeVariableType>())
118
+ if (auto *typeVar = type->getAs <TypeVariableType>()) {
117
119
Vars.insert (typeVar);
120
+ } else if (type->hasTypeVariable ()) {
121
+ // Parameter or result type could be only partially
122
+ // resolved e.g. `{ (x: X) -> Void in ... }` where
123
+ // `X` is a generic type.
124
+ SmallPtrSet<TypeVariableType *, 4 > typeVars;
125
+ type->getTypeVariables (typeVars);
126
+ Vars.insert (typeVars.begin (), typeVars.end ());
127
+ }
118
128
}
119
129
}
120
130
}
0 commit comments