@@ -161,6 +161,14 @@ class RequirementBuilder {
161
161
162
162
} // end namespace
163
163
164
+ static Type replaceTypeParametersWithErrorTypes (Type type) {
165
+ return type.transformRec ([](Type t) -> Optional<Type> {
166
+ if (t->isTypeParameter ())
167
+ return ErrorType::get (t->getASTContext ());
168
+ return None;
169
+ });
170
+ }
171
+
164
172
void RequirementBuilder::addRequirementRules (ArrayRef<unsigned > rules) {
165
173
// Convert a rewrite rule into a requirement.
166
174
auto createRequirementFromRule = [&](const Rule &rule) {
@@ -192,6 +200,8 @@ void RequirementBuilder::addRequirementRules(ArrayRef<unsigned> rules) {
192
200
prop->getConcreteType (),
193
201
prop->getSubstitutions (),
194
202
GenericParams, MutableTerm ());
203
+ if (rule.isRecursive ())
204
+ superclassType = replaceTypeParametersWithErrorTypes (superclassType);
195
205
196
206
if (ReconstituteSugar)
197
207
superclassType = superclassType->reconstituteSugar (/* recursive=*/ true );
@@ -213,6 +223,8 @@ void RequirementBuilder::addRequirementRules(ArrayRef<unsigned> rules) {
213
223
prop->getConcreteType (),
214
224
prop->getSubstitutions (),
215
225
GenericParams, MutableTerm ());
226
+ if (rule.isRecursive ())
227
+ concreteType = replaceTypeParametersWithErrorTypes (concreteType);
216
228
217
229
if (ReconstituteSugar)
218
230
concreteType = concreteType->reconstituteSugar (/* recursive=*/ true );
@@ -283,6 +295,8 @@ void RequirementBuilder::addTypeAliasRules(ArrayRef<unsigned> rules) {
283
295
prop->getConcreteType (),
284
296
prop->getSubstitutions (),
285
297
GenericParams, MutableTerm ());
298
+ if (rule.isRecursive ())
299
+ concreteType = replaceTypeParametersWithErrorTypes (concreteType);
286
300
287
301
if (ReconstituteSugar)
288
302
concreteType = concreteType->reconstituteSugar (/* recursive=*/ true );
0 commit comments