Skip to content

Commit c133437

Browse files
committed
[Serialization] Recover from opaque type related failures
Fixes rdar://60291019
1 parent 4e0038f commit c133437

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,10 @@ ModuleFile::readConformanceChecked(llvm::BitstreamCursor &Cursor,
527527
"reading specialized conformance for",
528528
conformingType);
529529

530-
auto subMap = getSubstitutionMap(substitutionMapID);
530+
auto subMapOrError = getSubstitutionMapChecked(substitutionMapID);
531+
if (!subMapOrError)
532+
return subMapOrError.takeError();
533+
auto subMap = subMapOrError.get();
531534

532535
ProtocolConformanceRef genericConformance =
533536
readConformance(Cursor, genericEnv);
@@ -651,7 +654,11 @@ Expected<NormalProtocolConformance *> ModuleFile::readNormalConformanceChecked(
651654
rawIDs);
652655

653656
ASTContext &ctx = getContext();
654-
DeclContext *dc = getDeclContext(contextID);
657+
auto doOrError = getDeclContextChecked(contextID);
658+
if (!doOrError)
659+
return doOrError.takeError();
660+
DeclContext *dc = doOrError.get();
661+
655662
assert(!isa<ClangModuleUnit>(dc->getModuleScopeContext())
656663
&& "should not have serialized a conformance from a clang module");
657664
Type conformingType = dc->getDeclaredInterfaceType();
@@ -1077,7 +1084,10 @@ ModuleFile::getSubstitutionMapChecked(serialization::SubstitutionMapID id) {
10771084
conformances.reserve(numConformances);
10781085
for (unsigned i : range(numConformances)) {
10791086
(void)i;
1080-
conformances.push_back(readConformance(DeclTypeCursor));
1087+
auto conformanceOrError = readConformanceChecked(DeclTypeCursor);
1088+
if (!conformanceOrError)
1089+
return conformanceOrError.takeError();
1090+
conformances.push_back(conformanceOrError.get());
10811091
}
10821092

10831093
// Form the substitution map and record it.
@@ -2780,7 +2790,10 @@ class DeclDeserializer {
27802790
var->setIsSetterMutating(isSetterMutating);
27812791
declOrOffset = var;
27822792

2783-
Type interfaceType = MF.getType(interfaceTypeID);
2793+
auto interfaceTypeOrError = MF.getTypeChecked(interfaceTypeID);
2794+
if (!interfaceTypeOrError)
2795+
return interfaceTypeOrError.takeError();
2796+
Type interfaceType = interfaceTypeOrError.get();
27842797
var->setInterfaceType(interfaceType);
27852798
var->setImplicitlyUnwrappedOptional(isIUO);
27862799

@@ -3203,9 +3216,12 @@ class DeclDeserializer {
32033216
auto genericSig = MF.getGenericSignature(genericSigID);
32043217
if (genericSig)
32053218
opaqueDecl->setGenericSignature(genericSig);
3206-
if (underlyingTypeID)
3207-
opaqueDecl->setUnderlyingTypeSubstitutions(
3208-
MF.getSubstitutionMap(underlyingTypeID));
3219+
if (underlyingTypeID) {
3220+
auto subMapOrError = MF.getSubstitutionMapChecked(underlyingTypeID);
3221+
if (!subMapOrError)
3222+
return subMapOrError.takeError();
3223+
opaqueDecl->setUnderlyingTypeSubstitutions(subMapOrError.get());
3224+
}
32093225
SubstitutionMap subs;
32103226
if (genericSig) {
32113227
subs = genericSig->getIdentitySubstitutionMap();
@@ -5044,7 +5060,11 @@ class TypeDeserializer {
50445060
decls_block::OpaqueArchetypeTypeLayout::readRecord(scratch,
50455061
opaqueDeclID, subsID);
50465062

5047-
auto opaqueDecl = cast<OpaqueTypeDecl>(MF.getDecl(opaqueDeclID));
5063+
auto opaqueTypeOrError = MF.getDeclChecked(opaqueDeclID);
5064+
if (!opaqueTypeOrError)
5065+
return opaqueTypeOrError.takeError();
5066+
5067+
auto opaqueDecl = cast<OpaqueTypeDecl>(opaqueTypeOrError.get());
50485068
auto subs = MF.getSubstitutionMap(subsID);
50495069

50505070
return OpaqueTypeArchetypeType::get(opaqueDecl, subs);

0 commit comments

Comments
 (0)