Skip to content

Commit c40ac22

Browse files
committed
[AST Verifier] Don’t ask to compute overridden declarations.
Don’t ask to compute overridden declarations that haven’t already been computed.
1 parent 10f6195 commit c40ac22

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

lib/AST/ASTVerifier.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,16 @@ struct LazyGenericEnvironment {
181181
}
182182
};
183183

184+
namespace {
185+
/// Retrieve the "overridden" declaration of this declaration, but only if
186+
// it's already been computed.
187+
template<typename T>
188+
T *getOverriddenDeclIfAvailable(T *decl) {
189+
if (!decl->overriddenDeclsComputed()) return nullptr;
190+
191+
return cast_or_null<T>(decl->getOverriddenDecl());
192+
}
193+
}
184194
class Verifier : public ASTWalker {
185195
PointerUnion<ModuleDecl *, SourceFile *> M;
186196
ASTContext &Ctx;
@@ -841,7 +851,7 @@ class Verifier : public ASTWalker {
841851
}
842852
}
843853

844-
if (auto Overridden = D->getOverriddenDecl()) {
854+
if (auto Overridden = getOverriddenDeclIfAvailable(D)) {
845855
if (D->getDeclContext() == Overridden->getDeclContext()) {
846856
PrettyStackTraceDecl debugStack("verifying overridden", D);
847857
Out << "cannot override a decl in the same DeclContext";
@@ -2207,38 +2217,40 @@ class Verifier : public ASTWalker {
22072217
}
22082218

22092219
// Make sure we consistently set accessor overrides.
2210-
if (auto *baseASD = ASD->getOverriddenDecl()) {
2220+
if (auto *baseASD = getOverriddenDeclIfAvailable(ASD)) {
22112221
if (ASD->getGetter() && baseASD->getGetter())
2212-
assert(ASD->getGetter()->getOverriddenDecl() ==
2213-
baseASD->getGetter() &&
2222+
assert(getOverriddenDeclIfAvailable(ASD->getGetter()) ==
2223+
baseASD->getGetter() &&
22142224
"Storage overrides but getter does not");
22152225
if (ASD->getSetter() && baseASD->getSetter() &&
22162226
baseASD->isSetterAccessibleFrom(ASD->getDeclContext()))
2217-
assert(ASD->getSetter()->getOverriddenDecl() ==
2218-
baseASD->getSetter() &&
2227+
assert(getOverriddenDeclIfAvailable(ASD->getSetter()) ==
2228+
baseASD->getSetter() &&
22192229
"Storage overrides but setter does not");
22202230
if (ASD->getMaterializeForSetFunc() &&
22212231
baseASD->getMaterializeForSetFunc() &&
22222232
baseASD->isSetterAccessibleFrom(ASD->getDeclContext())) {
22232233
if (baseASD->getMaterializeForSetFunc()->hasForcedStaticDispatch()) {
2224-
assert(ASD->getMaterializeForSetFunc()->getOverriddenDecl() == nullptr
2234+
assert(getOverriddenDeclIfAvailable(ASD->getMaterializeForSetFunc())
2235+
== nullptr
22252236
&& "Forced static dispatch materializeForSet should not be "
22262237
"overridden");
22272238
} else {
2228-
assert(ASD->getMaterializeForSetFunc()->getOverriddenDecl() ==
2229-
baseASD->getMaterializeForSetFunc() &&
2239+
assert(getOverriddenDeclIfAvailable(ASD->getMaterializeForSetFunc())
2240+
== baseASD->getMaterializeForSetFunc() &&
22302241
"Storage override but materializeForSet does not");
22312242
}
22322243
}
22332244
} else {
22342245
if (ASD->getGetter())
2235-
assert(!ASD->getGetter()->getOverriddenDecl() &&
2246+
assert(!getOverriddenDeclIfAvailable(ASD->getGetter()) &&
22362247
"Storage does not override but getter does");
22372248
if (ASD->getSetter())
2238-
assert(!ASD->getSetter()->getOverriddenDecl() &&
2249+
assert(!getOverriddenDeclIfAvailable(ASD->getSetter()) &&
22392250
"Storage does not override but setter does");
22402251
if (ASD->getMaterializeForSetFunc())
2241-
assert(!ASD->getMaterializeForSetFunc()->getOverriddenDecl() &&
2252+
assert(!getOverriddenDeclIfAvailable(
2253+
ASD->getMaterializeForSetFunc()) &&
22422254
"Storage does not override but materializeForSet does");
22432255
}
22442256

0 commit comments

Comments
 (0)