Skip to content

Commit 42407bb

Browse files
committed
RequirementMachine: Convert recursive requirements into ErrorTypes
1 parent 3432a1f commit 42407bb

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

lib/AST/RequirementMachine/RequirementBuilder.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,14 @@ class RequirementBuilder {
161161

162162
} // end namespace
163163

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+
164172
void RequirementBuilder::addRequirementRules(ArrayRef<unsigned> rules) {
165173
// Convert a rewrite rule into a requirement.
166174
auto createRequirementFromRule = [&](const Rule &rule) {
@@ -192,6 +200,8 @@ void RequirementBuilder::addRequirementRules(ArrayRef<unsigned> rules) {
192200
prop->getConcreteType(),
193201
prop->getSubstitutions(),
194202
GenericParams, MutableTerm());
203+
if (rule.isRecursive())
204+
superclassType = replaceTypeParametersWithErrorTypes(superclassType);
195205

196206
if (ReconstituteSugar)
197207
superclassType = superclassType->reconstituteSugar(/*recursive=*/true);
@@ -213,6 +223,8 @@ void RequirementBuilder::addRequirementRules(ArrayRef<unsigned> rules) {
213223
prop->getConcreteType(),
214224
prop->getSubstitutions(),
215225
GenericParams, MutableTerm());
226+
if (rule.isRecursive())
227+
concreteType = replaceTypeParametersWithErrorTypes(concreteType);
216228

217229
if (ReconstituteSugar)
218230
concreteType = concreteType->reconstituteSugar(/*recursive=*/true);
@@ -283,6 +295,8 @@ void RequirementBuilder::addTypeAliasRules(ArrayRef<unsigned> rules) {
283295
prop->getConcreteType(),
284296
prop->getSubstitutions(),
285297
GenericParams, MutableTerm());
298+
if (rule.isRecursive())
299+
concreteType = replaceTypeParametersWithErrorTypes(concreteType);
286300

287301
if (ReconstituteSugar)
288302
concreteType = concreteType->reconstituteSugar(/*recursive=*/true);

0 commit comments

Comments
 (0)