@@ -181,6 +181,16 @@ struct LazyGenericEnvironment {
181
181
}
182
182
};
183
183
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
+ }
184
194
class Verifier : public ASTWalker {
185
195
PointerUnion<ModuleDecl *, SourceFile *> M;
186
196
ASTContext &Ctx;
@@ -841,7 +851,7 @@ class Verifier : public ASTWalker {
841
851
}
842
852
}
843
853
844
- if (auto Overridden = D-> getOverriddenDecl ( )) {
854
+ if (auto Overridden = getOverriddenDeclIfAvailable (D )) {
845
855
if (D->getDeclContext () == Overridden->getDeclContext ()) {
846
856
PrettyStackTraceDecl debugStack (" verifying overridden" , D);
847
857
Out << " cannot override a decl in the same DeclContext" ;
@@ -2207,38 +2217,40 @@ class Verifier : public ASTWalker {
2207
2217
}
2208
2218
2209
2219
// Make sure we consistently set accessor overrides.
2210
- if (auto *baseASD = ASD-> getOverriddenDecl ( )) {
2220
+ if (auto *baseASD = getOverriddenDeclIfAvailable (ASD )) {
2211
2221
if (ASD->getGetter () && baseASD->getGetter ())
2212
- assert (ASD->getGetter ()-> getOverriddenDecl ( ) ==
2213
- baseASD->getGetter () &&
2222
+ assert (getOverriddenDeclIfAvailable ( ASD->getGetter ()) ==
2223
+ baseASD->getGetter () &&
2214
2224
" Storage overrides but getter does not" );
2215
2225
if (ASD->getSetter () && baseASD->getSetter () &&
2216
2226
baseASD->isSetterAccessibleFrom (ASD->getDeclContext ()))
2217
- assert (ASD->getSetter ()-> getOverriddenDecl ( ) ==
2218
- baseASD->getSetter () &&
2227
+ assert (getOverriddenDeclIfAvailable ( ASD->getSetter ()) ==
2228
+ baseASD->getSetter () &&
2219
2229
" Storage overrides but setter does not" );
2220
2230
if (ASD->getMaterializeForSetFunc () &&
2221
2231
baseASD->getMaterializeForSetFunc () &&
2222
2232
baseASD->isSetterAccessibleFrom (ASD->getDeclContext ())) {
2223
2233
if (baseASD->getMaterializeForSetFunc ()->hasForcedStaticDispatch ()) {
2224
- assert (ASD->getMaterializeForSetFunc ()->getOverriddenDecl () == nullptr
2234
+ assert (getOverriddenDeclIfAvailable (ASD->getMaterializeForSetFunc ())
2235
+ == nullptr
2225
2236
&& " Forced static dispatch materializeForSet should not be "
2226
2237
" overridden" );
2227
2238
} else {
2228
- assert (ASD->getMaterializeForSetFunc ()-> getOverriddenDecl () ==
2229
- baseASD->getMaterializeForSetFunc () &&
2239
+ assert (getOverriddenDeclIfAvailable ( ASD->getMaterializeForSetFunc ())
2240
+ == baseASD->getMaterializeForSetFunc () &&
2230
2241
" Storage override but materializeForSet does not" );
2231
2242
}
2232
2243
}
2233
2244
} else {
2234
2245
if (ASD->getGetter ())
2235
- assert (!ASD->getGetter ()-> getOverriddenDecl ( ) &&
2246
+ assert (!getOverriddenDeclIfAvailable ( ASD->getGetter ()) &&
2236
2247
" Storage does not override but getter does" );
2237
2248
if (ASD->getSetter ())
2238
- assert (!ASD->getSetter ()-> getOverriddenDecl ( ) &&
2249
+ assert (!getOverriddenDeclIfAvailable ( ASD->getSetter ()) &&
2239
2250
" Storage does not override but setter does" );
2240
2251
if (ASD->getMaterializeForSetFunc ())
2241
- assert (!ASD->getMaterializeForSetFunc ()->getOverriddenDecl () &&
2252
+ assert (!getOverriddenDeclIfAvailable (
2253
+ ASD->getMaterializeForSetFunc ()) &&
2242
2254
" Storage does not override but materializeForSet does" );
2243
2255
}
2244
2256
0 commit comments