Skip to content

Commit f34e135

Browse files
committed
AST: Add verification for AvailabilityContext.
1 parent 27373ec commit f34e135

File tree

4 files changed

+25
-1
lines changed

4 files changed

+25
-1
lines changed

include/swift/AST/AvailabilityContext.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ class AvailabilityContext {
112112

113113
void print(llvm::raw_ostream &os) const;
114114
SWIFT_DEBUG_DUMP;
115+
116+
/// Returns true if all internal invariants are satisfied.
117+
bool verify(ASTContext &ctx) const;
115118
};
116119

117120
} // end namespace swift

include/swift/AST/AvailabilityContextStorage.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class AvailabilityContext::Info {
6161
bool isContainedIn(const Info &other) const;
6262

6363
void Profile(llvm::FoldingSetNodeID &ID) const;
64+
65+
/// Returns true if all internal invariants are satisfied.
66+
bool verify(ASTContext &ctx) const;
6467
};
6568

6669
/// As an implementation detail, the values that make up an `Availability`

lib/AST/AvailabilityContext.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,16 @@ void AvailabilityContext::Info::Profile(llvm::FoldingSetNodeID &ID) const {
155155
ID.AddBoolean(IsDeprecated);
156156
}
157157

158+
bool AvailabilityContext::Info::verify(ASTContext &ctx) const {
159+
// Unavailable domains must be sorted to ensure folding set node lookups yield
160+
// consistent results.
161+
if (!llvm::is_sorted(UnavailableDomains,
162+
StableAvailabilityDomainComparator()))
163+
return false;
164+
165+
return true;
166+
}
167+
158168
AvailabilityContext
159169
AvailabilityContext::forPlatformRange(const AvailabilityRange &range,
160170
ASTContext &ctx) {
@@ -278,3 +288,7 @@ void AvailabilityContext::print(llvm::raw_ostream &os) const {
278288
}
279289

280290
void AvailabilityContext::dump() const { print(llvm::errs()); }
291+
292+
bool AvailabilityContext::verify(ASTContext &ctx) const {
293+
return storage->info.verify(ctx);
294+
}

lib/AST/AvailabilityScope.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,11 @@ void AvailabilityScope::verify(const AvailabilityScope *parent,
581581
{{"child", this}, {"parent", parent}});
582582
}
583583

584-
if (!getAvailabilityContext().isContainedIn(parent->getAvailabilityContext()))
584+
auto context = getAvailabilityContext();
585+
if (!context.verify(ctx))
586+
verificationError(ctx, "context is invalid", {{"node", this}});
587+
588+
if (!context.isContainedIn(parent->getAvailabilityContext()))
585589
verificationError(ctx, "child availability range not contained",
586590
{{"child", this}, {"parent", parent}});
587591
}

0 commit comments

Comments
 (0)