@@ -4481,10 +4481,12 @@ llvm::Error DeclDeserializer::deserializeDeclCommon() {
4481
4481
4482
4482
Expected<Type> deserialized = MF.getTypeChecked (typeID);
4483
4483
if (!deserialized) {
4484
- if (deserialized.errorIsA <XRefNonLoadedModuleError>()) {
4484
+ if (deserialized.errorIsA <XRefNonLoadedModuleError>() ||
4485
+ MF.allowCompilerErrors ()) {
4485
4486
// A custom attribute defined behind an implementation-only import
4486
4487
// is safe to drop when it can't be deserialized.
4487
- // rdar://problem/56599179
4488
+ // rdar://problem/56599179. When allowing errors we're doing a best
4489
+ // effort to create a module, so ignore in that case as well.
4488
4490
consumeError (deserialized.takeError ());
4489
4491
skipAttr = true ;
4490
4492
} else
@@ -6244,9 +6246,15 @@ ModuleFile::loadAllConformances(const Decl *D, uint64_t contextData,
6244
6246
if (!conformance) {
6245
6247
auto unconsumedError =
6246
6248
consumeErrorIfXRefNonLoadedModule (conformance.takeError ());
6247
- if (unconsumedError)
6248
- fatal (std::move (unconsumedError));
6249
- return ;
6249
+ if (unconsumedError) {
6250
+ // Ignore if allowing errors, it's just doing a best effort to produce
6251
+ // *some* module anyway.
6252
+ if (allowCompilerErrors ())
6253
+ consumeError (std::move (unconsumedError));
6254
+ else
6255
+ fatal (std::move (unconsumedError));
6256
+ }
6257
+ continue ;
6250
6258
}
6251
6259
6252
6260
if (conformance.get ().isConcrete ())
@@ -6367,8 +6375,17 @@ void ModuleFile::finishNormalConformance(NormalProtocolConformance *conformance,
6367
6375
" serialized conformances do not match requirement signature" ,
6368
6376
llvm::inconvertibleErrorCode ()));
6369
6377
}
6370
- while (conformanceCount--)
6371
- reqConformances.push_back (readConformance (DeclTypeCursor));
6378
+ while (conformanceCount--) {
6379
+ auto conformance = readConformanceChecked (DeclTypeCursor);
6380
+ if (conformance) {
6381
+ reqConformances.push_back (conformance.get ());
6382
+ } else if (allowCompilerErrors ()) {
6383
+ consumeError (conformance.takeError ());
6384
+ reqConformances.push_back (ProtocolConformanceRef::forInvalid ());
6385
+ } else {
6386
+ fatal (conformance.takeError ());
6387
+ }
6388
+ }
6372
6389
}
6373
6390
conformance->setSignatureConformances (reqConformances);
6374
6391
@@ -6481,8 +6498,11 @@ void ModuleFile::finishNormalConformance(NormalProtocolConformance *conformance,
6481
6498
if (!witnessSubstitutions) {
6482
6499
// Missing module errors are most likely caused by an
6483
6500
// implementation-only import hiding types and decls.
6484
- // rdar://problem/52837313
6485
- if (witnessSubstitutions.errorIsA <XRefNonLoadedModuleError>()) {
6501
+ // rdar://problem/52837313. Ignore completely if allowing
6502
+ // errors - we're just doing a best effort to create the
6503
+ // module in that case.
6504
+ if (witnessSubstitutions.errorIsA <XRefNonLoadedModuleError>() ||
6505
+ allowCompilerErrors ()) {
6486
6506
consumeError (witnessSubstitutions.takeError ());
6487
6507
isOpaque = true ;
6488
6508
}
0 commit comments