@@ -297,6 +297,26 @@ namespace {
297
297
}
298
298
};
299
299
const char XRefError::ID = ' \0 ' ;
300
+
301
+ class OverrideError : public llvm ::ErrorInfo<OverrideError> {
302
+ friend ErrorInfo;
303
+ static const char ID;
304
+
305
+ DeclName name;
306
+ public:
307
+ explicit OverrideError (DeclName name) : name(name) {}
308
+
309
+ void log (raw_ostream &OS) const override {
310
+ OS << " could not find '" << name << " ' in parent class" ;
311
+ }
312
+
313
+ std::error_code convertToErrorCode () const override {
314
+ // This is a deprecated part of llvm::Error, so we just return a very
315
+ // generic value.
316
+ return {EINVAL, std::generic_category ()};
317
+ }
318
+ };
319
+ const char OverrideError::ID = ' \0 ' ;
300
320
} // end anonymous namespace
301
321
302
322
@@ -1220,9 +1240,23 @@ bool ModuleFile::readMembers(SmallVectorImpl<Decl *> &Members) {
1220
1240
1221
1241
Members.reserve (rawMemberIDs.size ());
1222
1242
for (DeclID rawID : rawMemberIDs) {
1223
- Decl *D = getDecl (rawID);
1224
- assert (D && " unable to deserialize next member" );
1225
- Members.push_back (D);
1243
+ Expected<Decl *> D = getDeclChecked (rawID);
1244
+ if (!D) {
1245
+ if (!getContext ().LangOpts .EnableDeserializationRecovery )
1246
+ fatal (D.takeError ());
1247
+
1248
+ // Silently drop the member if there was a problem.
1249
+ // FIXME: This isn't sound for protocols; we need to at least record that
1250
+ // it happened.
1251
+ llvm::handleAllErrors (D.takeError (),
1252
+ [](const OverrideError &) { /* expected */ },
1253
+ [&](std::unique_ptr<llvm::ErrorInfoBase> unhandled){
1254
+ fatal (std::move (unhandled));
1255
+ });
1256
+ continue ;
1257
+ }
1258
+ assert (D.get () && " unchecked error deserializing next member" );
1259
+ Members.push_back (D.get ());
1226
1260
}
1227
1261
1228
1262
return false ;
@@ -2916,12 +2950,31 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2916
2950
overriddenID, accessorStorageDeclID,
2917
2951
hasCompoundName, rawAddressorKind,
2918
2952
rawAccessLevel, nameIDs);
2919
-
2953
+
2920
2954
// Resolve the name ids.
2921
2955
SmallVector<Identifier, 2 > names;
2922
2956
for (auto nameID : nameIDs)
2923
2957
names.push_back (getIdentifier (nameID));
2924
2958
2959
+ DeclName name;
2960
+ if (!names.empty ()) {
2961
+ if (hasCompoundName)
2962
+ name = DeclName (ctx, names[0 ],
2963
+ llvm::makeArrayRef (names.begin () + 1 , names.end ()));
2964
+ else
2965
+ name = DeclName (names[0 ]);
2966
+ }
2967
+
2968
+ Expected<Decl *> overridden = getDeclChecked (overriddenID);
2969
+ if (!overridden) {
2970
+ llvm::handleAllErrors (overridden.takeError (),
2971
+ [](const XRefError &) { /* expected */ },
2972
+ [&](std::unique_ptr<llvm::ErrorInfoBase> unhandled){
2973
+ fatal (std::move (unhandled));
2974
+ });
2975
+ return llvm::make_error<OverrideError>(name);
2976
+ }
2977
+
2925
2978
auto DC = getDeclContext (contextID);
2926
2979
if (declOrOffset.isComplete ())
2927
2980
return declOrOffset;
@@ -2940,14 +2993,6 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2940
2993
if (declOrOffset.isComplete ())
2941
2994
return declOrOffset;
2942
2995
2943
- DeclName name;
2944
- if (!names.empty ()) {
2945
- if (hasCompoundName)
2946
- name = DeclName (ctx, names[0 ],
2947
- llvm::makeArrayRef (names.begin () + 1 , names.end ()));
2948
- else
2949
- name = DeclName (names[0 ]);
2950
- }
2951
2996
auto fn = FuncDecl::createDeserialized (
2952
2997
ctx, /* StaticLoc=*/ SourceLoc (), staticSpelling.getValue (),
2953
2998
/* FuncLoc=*/ SourceLoc (), name, /* NameLoc=*/ SourceLoc (),
@@ -3004,8 +3049,8 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3004
3049
if (auto errorConvention = maybeReadForeignErrorConvention ())
3005
3050
fn->setForeignErrorConvention (*errorConvention);
3006
3051
3007
- if (auto overridden = cast_or_null<FuncDecl>(getDecl (overriddenID ))) {
3008
- fn->setOverriddenDecl (overridden );
3052
+ if (auto overriddenFunc = cast_or_null<FuncDecl>(overridden. get ( ))) {
3053
+ fn->setOverriddenDecl (overriddenFunc );
3009
3054
AddAttribute (new (ctx) OverrideAttr (SourceLoc ()));
3010
3055
}
3011
3056
0 commit comments