Sema: Hook up layout constraints to the solver

There were various problems with layout constraints either
being ignored or handled incorrectly. Now that I've exercised
this support with an upcoming patch, there are some fixes
here.

Also, introduce a new ExistentialLayout::getLayoutConstriant()
which returns a value for existentials which are class-constrained
but don't have a superclass or any class-constrained protocols;
an example would be AnyObject, or AnyObject & P for some
non-class protocol P.

NFC for now, since these layout-constrained existentials cannot
be constructed yet.
This commit is contained in:
Slava Pestov
2017-04-13 01:27:44 -07:00
parent d58f049608
commit db58e02cb2
14 changed files with 96 additions and 68 deletions

View File

@@ -2564,8 +2564,12 @@ ConstraintResult GenericSignatureBuilder::addTypeRequirement(
bool anyErrors = false;
auto layout = constraintType->getExistentialLayout();
assert((!layout.requiresClass || layout.requiresClassImplied) &&
"explicit AnyObject not yet supported");
if (auto layoutConstraint = layout.getLayoutConstraint()) {
if (isErrorResult(addLayoutRequirementDirect(subjectPA,
layoutConstraint,
resolvedSource)))
anyErrors = true;
}
if (layout.superclass) {
if (isErrorResult(addSuperclassRequirementDirect(subjectPA,