Skip to content

Commit c601709

Browse files
committed
[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
1 parent 0bd6747 commit c601709

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

lib/AST/ProtocolConformance.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,8 @@ NormalProtocolConformance::populateSignatureConformances() {
578578

579579
// Allocate the buffer of conformance requirements.
580580
auto &ctx = self->getProtocol()->getASTContext();
581-
buffer = ctx.AllocateUninitialized<ProtocolConformanceRef>(numConformanceRequirements);
581+
buffer = ctx.AllocateUninitialized<ProtocolConformanceRef>(
582+
numConformanceRequirements);
582583

583584
// Skip over any non-conformance requirements in the requirement
584585
// signature.
@@ -600,11 +601,20 @@ NormalProtocolConformance::populateSignatureConformances() {
600601
other.owning = false;
601602
}
602603

604+
~Writer() {
605+
if (!owning)
606+
return;
607+
while (!requirementSignature.empty())
608+
(*this)(ProtocolConformanceRef::forInvalid());
609+
}
610+
603611
void operator()(ProtocolConformanceRef conformance){
604612
// Make sure we have the right conformance.
605613
assert(!requirementSignature.empty() && "Too many conformances?");
606-
assert(conformance.getRequirement() ==
607-
requirementSignature.front().getSecondType()->castTo<ProtocolType>()->getDecl());
614+
assert(conformance.isInvalid() ||
615+
conformance.getRequirement() ==
616+
requirementSignature.front().getSecondType()
617+
->castTo<ProtocolType>()->getDecl());
608618
assert((!conformance.isConcrete() ||
609619
!conformance.getConcrete()->getType()->hasArchetype()) &&
610620
"signature conformances must use interface types");
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: %target-swift-ide-test -code-completion -code-completion-token=COMPLETE -source-filename=%s
2+
3+
protocol ProviderP {
4+
associatedtype Data
5+
}
6+
7+
protocol BaseP {}
8+
protocol DerivedP : BaseP {
9+
associatedtype Provider: ProviderP
10+
11+
func testing(_: Provider.Data)
12+
}
13+
14+
struct Concrete : DerivedP {
15+
#^COMPLETE^#
16+
}

0 commit comments

Comments
 (0)