Skip to content

Commit 2a18ea7

Browse files
authored
Merge pull request #19817 from rintaro/rdar43625800
[AST] Record invalid conformance for unsatisfied conformance requirement
2 parents 2d1e976 + c601709 commit 2a18ea7

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)