Skip to content

Commit 58cb851

Browse files
committed
RequirementMachine: Relax some cross-checking assertions
getConcreteType() doesn't have to return a canonical type, and the GSB and RequirementMachine disagree on how canonical the result should be.
1 parent d3b6bff commit 58cb851

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

lib/AST/GenericSignature.cpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,22 +349,36 @@ GenericSignatureImpl::getLocalRequirements(Type depType) const {
349349
auto rqmResult = computeViaRQM();
350350
auto gsbResult = computeViaGSB();
351351

352-
auto typesEqual = [&](Type lhs, Type rhs) {
352+
auto typesEqual = [&](Type lhs, Type rhs, bool canonical) {
353353
if (!lhs || !rhs)
354354
return !lhs == !rhs;
355-
return lhs->isEqual(rhs);
355+
if (lhs->isEqual(rhs))
356+
return true;
357+
358+
if (canonical)
359+
return false;
360+
361+
if (getCanonicalTypeInContext(lhs) ==
362+
getCanonicalTypeInContext(rhs))
363+
return true;
364+
365+
return false;
356366
};
357367

358368
auto compare = [&]() {
359369
// If the types are concrete, we don't care about the rest.
360370
if (gsbResult.concreteType || rqmResult.concreteType) {
361-
if (!typesEqual(gsbResult.concreteType, rqmResult.concreteType))
371+
if (!typesEqual(gsbResult.concreteType,
372+
rqmResult.concreteType,
373+
false))
362374
return false;
363375

364376
return true;
365377
}
366378

367-
if (!typesEqual(gsbResult.anchor, rqmResult.anchor))
379+
if (!typesEqual(gsbResult.anchor,
380+
rqmResult.anchor,
381+
true))
368382
return false;
369383

370384
if (gsbResult.layout != rqmResult.layout)
@@ -378,6 +392,11 @@ GenericSignatureImpl::getLocalRequirements(Type depType) const {
378392
if (lhsProtos != rhsProtos)
379393
return false;
380394

395+
if (!typesEqual(gsbResult.superclass,
396+
rqmResult.superclass,
397+
false))
398+
return false;
399+
381400
return true;
382401
};
383402

@@ -770,7 +789,11 @@ Type GenericSignatureImpl::getConcreteType(Type type) const {
770789
auto check = [&]() {
771790
if (!gsbResult || !rqmResult)
772791
return !gsbResult == !rqmResult;
773-
return gsbResult->isEqual(rqmResult);
792+
if (gsbResult->isEqual(rqmResult))
793+
return true;
794+
795+
return (getCanonicalTypeInContext(gsbResult)
796+
== getCanonicalTypeInContext(rqmResult));
774797
};
775798

776799
if (!check()) {

0 commit comments

Comments
 (0)