Skip to content

Commit 6c23def

Browse files
committed
Serialization: protect maybeReadGenericParams against errors
Update signature and implementation of `maybeReadGenericParams` to pass up errors to the caller. Also update all of its callers to pass up any error. rdar://126582124
1 parent a619daf commit 6c23def

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,8 @@ ModuleFile::getConformanceChecked(ProtocolConformanceID conformanceID) {
11981198
}
11991199
}
12001200

1201-
GenericParamList *ModuleFile::maybeReadGenericParams(DeclContext *DC) {
1201+
Expected<GenericParamList *>
1202+
ModuleFile::maybeReadGenericParams(DeclContext *DC) {
12021203
using namespace decls_block;
12031204

12041205
assert(DC && "need a context for the decls in the list");
@@ -1223,7 +1224,10 @@ GenericParamList *ModuleFile::maybeReadGenericParams(DeclContext *DC) {
12231224
ArrayRef<uint64_t> paramIDs;
12241225
GenericParamListLayout::readRecord(scratch, paramIDs);
12251226
for (DeclID nextParamID : paramIDs) {
1226-
auto genericParam = cast<GenericTypeParamDecl>(getDecl(nextParamID));
1227+
Decl *nextParam;
1228+
UNWRAP(getDeclChecked(nextParamID), nextParam);
1229+
1230+
auto genericParam = cast<GenericTypeParamDecl>(nextParam);
12271231
params.push_back(genericParam);
12281232
}
12291233

@@ -3428,7 +3432,8 @@ class DeclDeserializer {
34283432
DeclContext *DC;
34293433
UNWRAP(MF.getDeclContextChecked(contextID), DC);
34303434

3431-
auto genericParams = MF.maybeReadGenericParams(DC);
3435+
GenericParamList *genericParams;
3436+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
34323437
if (declOrOffset.isComplete())
34333438
return declOrOffset;
34343439

@@ -3587,7 +3592,8 @@ class DeclDeserializer {
35873592
if (declOrOffset.isComplete())
35883593
return declOrOffset;
35893594

3590-
auto genericParams = MF.maybeReadGenericParams(DC);
3595+
GenericParamList *genericParams;
3596+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
35913597
if (declOrOffset.isComplete())
35923598
return declOrOffset;
35933599

@@ -3701,7 +3707,8 @@ class DeclDeserializer {
37013707
if (declOrOffset.isComplete())
37023708
return declOrOffset;
37033709

3704-
auto *genericParams = MF.maybeReadGenericParams(parent);
3710+
GenericParamList *genericParams;
3711+
UNWRAP(MF.maybeReadGenericParams(parent), genericParams);
37053712
if (declOrOffset.isComplete())
37063713
return declOrOffset;
37073714

@@ -4262,7 +4269,8 @@ class DeclDeserializer {
42624269
// Read generic params before reading the type, because the type may
42634270
// reference generic parameters, and we want them to have a dummy
42644271
// DeclContext for now.
4265-
GenericParamList *genericParams = MF.maybeReadGenericParams(DC);
4272+
GenericParamList *genericParams;
4273+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
42664274

42674275
auto staticSpelling = getActualStaticSpellingKind(rawStaticSpelling);
42684276
if (!staticSpelling.has_value())
@@ -4496,7 +4504,8 @@ class DeclDeserializer {
44964504
if (declOrOffset.isComplete())
44974505
return cast<OpaqueTypeDecl>(declOrOffset.get());
44984506

4499-
auto genericParams = MF.maybeReadGenericParams(declContext);
4507+
GenericParamList *genericParams;
4508+
UNWRAP(MF.maybeReadGenericParams(declContext), genericParams);
45004509

45014510
// Create the decl.
45024511
auto opaqueDecl = OpaqueTypeDecl::get(
@@ -4697,7 +4706,8 @@ class DeclDeserializer {
46974706
ctx.evaluator.cacheOutput(InheritedProtocolsRequest{proto},
46984707
ctx.AllocateCopy(inherited));
46994708

4700-
auto genericParams = MF.maybeReadGenericParams(DC);
4709+
GenericParamList *genericParams;
4710+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
47014711
assert(genericParams && "protocol with no generic parameters?");
47024712
ctx.evaluator.cacheOutput(GenericParamListRequest{proto},
47034713
std::move(genericParams));
@@ -4892,7 +4902,8 @@ class DeclDeserializer {
48924902
if (declOrOffset.isComplete())
48934903
return declOrOffset;
48944904

4895-
auto genericParams = MF.maybeReadGenericParams(DC);
4905+
GenericParamList *genericParams;
4906+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
48964907
if (declOrOffset.isComplete())
48974908
return declOrOffset;
48984909

@@ -4970,7 +4981,8 @@ class DeclDeserializer {
49704981
return DCOrError.takeError();
49714982
auto DC = DCOrError.get();
49724983

4973-
auto genericParams = MF.maybeReadGenericParams(DC);
4984+
GenericParamList *genericParams;
4985+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
49744986
if (declOrOffset.isComplete())
49754987
return declOrOffset;
49764988

@@ -5165,7 +5177,8 @@ class DeclDeserializer {
51655177
if (declOrOffset.isComplete())
51665178
return declOrOffset;
51675179

5168-
auto *genericParams = MF.maybeReadGenericParams(parent);
5180+
GenericParamList *genericParams;
5181+
UNWRAP(MF.maybeReadGenericParams(parent), genericParams);
51695182
if (declOrOffset.isComplete())
51705183
return declOrOffset;
51715184

@@ -5271,7 +5284,12 @@ class DeclDeserializer {
52715284
// Generic parameter lists are written from outermost to innermost.
52725285
// Keep reading until we run out of generic parameter lists.
52735286
GenericParamList *outerParams = nullptr;
5274-
while (auto *genericParams = MF.maybeReadGenericParams(DC)) {
5287+
while (true) {
5288+
GenericParamList *genericParams;
5289+
UNWRAP(MF.maybeReadGenericParams(DC), genericParams);
5290+
if (!genericParams)
5291+
break;
5292+
52755293
genericParams->setOuterParameters(outerParams);
52765294

52775295
// Set up the DeclContexts for the GenericTypeParamDecls in the list.
@@ -5415,7 +5433,8 @@ class DeclDeserializer {
54155433
if (declOrOffset.isComplete())
54165434
return declOrOffset;
54175435

5418-
auto *genericParams = MF.maybeReadGenericParams(parent);
5436+
GenericParamList *genericParams;
5437+
UNWRAP(MF.maybeReadGenericParams(parent), genericParams);
54195438
if (declOrOffset.isComplete())
54205439
return declOrOffset;
54215440

lib/Serialization/ModuleFile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ class ModuleFile
507507
///
508508
/// If the record at the cursor is not a generic param list, returns null
509509
/// without moving the cursor.
510-
GenericParamList *maybeReadGenericParams(DeclContext *DC);
510+
llvm::Expected<GenericParamList *> maybeReadGenericParams(DeclContext *DC);
511511

512512
/// Reads a set of requirements from \c DeclTypeCursor.
513513
void deserializeGenericRequirements(ArrayRef<uint64_t> scratch,

0 commit comments

Comments
 (0)