Skip to content

Commit b432296

Browse files
authored
Sema: Fix a container-overflow issue found by asan. rdar://30901119
1 parent 69ae6cd commit b432296

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1804,6 +1804,11 @@ namespace {
18041804
GlobalMissingWitnesses.size() - LocalMissingWitnessesStartIndex);
18051805
}
18061806

1807+
void clearGlobalMissingWitnesses() {
1808+
GlobalMissingWitnesses.clear();
1809+
LocalMissingWitnessesStartIndex = GlobalMissingWitnesses.size();
1810+
}
1811+
18071812
public:
18081813
/// Call this to diagnose currently known missing witnesses.
18091814
void diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind);
@@ -2713,7 +2718,7 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind) {
27132718
switch (Kind) {
27142719
case MissingWitnessDiagnosisKind::ErrorFixIt: {
27152720
diagnoseOrDefer(LocalMissing[0], true, InsertFixitCallback);
2716-
GlobalMissingWitnesses.clear();
2721+
clearGlobalMissingWitnesses();
27172722
return;
27182723
}
27192724
case MissingWitnessDiagnosisKind::ErrorOnly: {
@@ -2723,7 +2728,7 @@ diagnoseMissingWitnesses(MissingWitnessDiagnosisKind Kind) {
27232728
}
27242729
case MissingWitnessDiagnosisKind::FixItOnly:
27252730
InsertFixitCallback(Conformance);
2726-
GlobalMissingWitnesses.clear();
2731+
clearGlobalMissingWitnesses();
27272732
return;
27282733
}
27292734
}
@@ -4868,8 +4873,6 @@ void ConformanceChecker::checkConformance(MissingWitnessDiagnosisKind Kind) {
48684873

48694874
// Diagnose missing type witnesses for now.
48704875
diagnoseMissingWitnesses(Kind);
4871-
// Diagnose missing value witnesses later.
4872-
SWIFT_DEFER { diagnoseMissingWitnesses(Kind); };
48734876

48744877
// Resolution attempts to have the witnesses be correct by construction, but
48754878
// this isn't guaranteed, so let's double check.
@@ -4889,6 +4892,9 @@ void ConformanceChecker::checkConformance(MissingWitnessDiagnosisKind Kind) {
48894892
return;
48904893
}
48914894

4895+
// Diagnose missing value witnesses later.
4896+
SWIFT_DEFER { diagnoseMissingWitnesses(Kind); };
4897+
48924898
// Ensure the associated type conformances are used.
48934899
addUsedConformances(Conformance);
48944900

0 commit comments

Comments
 (0)