[AST] Use invalid conformance for unsatisfied requirement

There is an invariant that SignatureConformances should have the same
size as the number of conformance requirements in the signature.
Previously, since unsatisfied requirements weren't reflected in it,
that caused a crash.

rdar://problem/43625800
This commit is contained in:
Rintaro Ishizaki
2018-10-10 17:21:18 +09:00
parent 0bd6747285
commit c6017095c3
2 changed files with 29 additions and 3 deletions

View File

@@ -578,7 +578,8 @@ NormalProtocolConformance::populateSignatureConformances() {
// Allocate the buffer of conformance requirements.
auto &ctx = self->getProtocol()->getASTContext();
buffer = ctx.AllocateUninitialized<ProtocolConformanceRef>(numConformanceRequirements);
buffer = ctx.AllocateUninitialized<ProtocolConformanceRef>(
numConformanceRequirements);
// Skip over any non-conformance requirements in the requirement
// signature.
@@ -600,11 +601,20 @@ NormalProtocolConformance::populateSignatureConformances() {
other.owning = false;
}
~Writer() {
if (!owning)
return;
while (!requirementSignature.empty())
(*this)(ProtocolConformanceRef::forInvalid());
}
void operator()(ProtocolConformanceRef conformance){
// Make sure we have the right conformance.
assert(!requirementSignature.empty() && "Too many conformances?");
assert(conformance.getRequirement() ==
requirementSignature.front().getSecondType()->castTo<ProtocolType>()->getDecl());
assert(conformance.isInvalid() ||
conformance.getRequirement() ==
requirementSignature.front().getSecondType()
->castTo<ProtocolType>()->getDecl());
assert((!conformance.isConcrete() ||
!conformance.getConcrete()->getType()->hasArchetype()) &&
"signature conformances must use interface types");