@@ -4510,10 +4510,12 @@ llvm::Error DeclDeserializer::deserializeDeclCommon() {
4510
4510
4511
4511
Expected<Type> deserialized = MF.getTypeChecked (typeID);
4512
4512
if (!deserialized) {
4513
- if (deserialized.errorIsA <XRefNonLoadedModuleError>()) {
4513
+ if (deserialized.errorIsA <XRefNonLoadedModuleError>() ||
4514
+ MF.allowCompilerErrors ()) {
4514
4515
// A custom attribute defined behind an implementation-only import
4515
4516
// is safe to drop when it can't be deserialized.
4516
- // rdar://problem/56599179
4517
+ // rdar://problem/56599179. When allowing errors we're doing a best
4518
+ // effort to create a module, so ignore in that case as well.
4517
4519
consumeError (deserialized.takeError ());
4518
4520
skipAttr = true ;
4519
4521
} else
@@ -6258,9 +6260,15 @@ ModuleFile::loadAllConformances(const Decl *D, uint64_t contextData,
6258
6260
if (!conformance) {
6259
6261
auto unconsumedError =
6260
6262
consumeErrorIfXRefNonLoadedModule (conformance.takeError ());
6261
- if (unconsumedError)
6262
- fatal (std::move (unconsumedError));
6263
- return ;
6263
+ if (unconsumedError) {
6264
+ // Ignore if allowing errors, it's just doing a best effort to produce
6265
+ // *some* module anyway.
6266
+ if (allowCompilerErrors ())
6267
+ consumeError (std::move (unconsumedError));
6268
+ else
6269
+ fatal (std::move (unconsumedError));
6270
+ }
6271
+ continue ;
6264
6272
}
6265
6273
6266
6274
if (conformance.get ().isConcrete ())
@@ -6381,8 +6389,17 @@ void ModuleFile::finishNormalConformance(NormalProtocolConformance *conformance,
6381
6389
" serialized conformances do not match requirement signature" ,
6382
6390
llvm::inconvertibleErrorCode ()));
6383
6391
}
6384
- while (conformanceCount--)
6385
- reqConformances.push_back (readConformance (DeclTypeCursor));
6392
+ while (conformanceCount--) {
6393
+ auto conformance = readConformanceChecked (DeclTypeCursor);
6394
+ if (conformance) {
6395
+ reqConformances.push_back (conformance.get ());
6396
+ } else if (allowCompilerErrors ()) {
6397
+ consumeError (conformance.takeError ());
6398
+ reqConformances.push_back (ProtocolConformanceRef::forInvalid ());
6399
+ } else {
6400
+ fatal (conformance.takeError ());
6401
+ }
6402
+ }
6386
6403
}
6387
6404
conformance->setSignatureConformances (reqConformances);
6388
6405
@@ -6495,8 +6512,11 @@ void ModuleFile::finishNormalConformance(NormalProtocolConformance *conformance,
6495
6512
if (!witnessSubstitutions) {
6496
6513
// Missing module errors are most likely caused by an
6497
6514
// implementation-only import hiding types and decls.
6498
- // rdar://problem/52837313
6499
- if (witnessSubstitutions.errorIsA <XRefNonLoadedModuleError>()) {
6515
+ // rdar://problem/52837313. Ignore completely if allowing
6516
+ // errors - we're just doing a best effort to create the
6517
+ // module in that case.
6518
+ if (witnessSubstitutions.errorIsA <XRefNonLoadedModuleError>() ||
6519
+ allowCompilerErrors ()) {
6500
6520
consumeError (witnessSubstitutions.takeError ());
6501
6521
isOpaque = true ;
6502
6522
}
0 commit comments