Skip to content

Commit 10a1dcc

Browse files
authored
Merge pull request swiftlang#74159 from xymus/recover-readPattern
Serialization: Recover from deserialization failures under readPattern
2 parents af1d601 + cde2981 commit 10a1dcc

File tree

1 file changed

+9
-16
lines changed

1 file changed

+9
-16
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -555,20 +555,8 @@ getActualVarDeclIntroducer(serialization::VarDeclIntroducer raw) {
555555
}
556556

557557
Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
558-
// Currently, the only case in which this function can fail (return an error)
559-
// is when reading a pattern for a single variable declaration.
560-
561558
using namespace decls_block;
562559

563-
auto readPatternUnchecked = [this](DeclContext *owningDC) -> Pattern * {
564-
Expected<Pattern *> deserialized = readPattern(owningDC);
565-
if (!deserialized) {
566-
fatal(deserialized.takeError());
567-
}
568-
assert(deserialized.get());
569-
return deserialized.get();
570-
};
571-
572560
SmallVector<uint64_t, 8> scratch;
573561

574562
BCOffsetRAII restoreOffset(DeclTypeCursor);
@@ -589,7 +577,8 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
589577
fatalIfUnexpected(DeclTypeCursor.readRecord(next.ID, scratch));
590578
switch (kind) {
591579
case decls_block::PAREN_PATTERN: {
592-
Pattern *subPattern = readPatternUnchecked(owningDC);
580+
Pattern *subPattern;
581+
UNWRAP(readPattern(owningDC), subPattern);
593582

594583
auto result = ParenPattern::createImplicit(getContext(), subPattern);
595584

@@ -622,12 +611,15 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
622611
TuplePatternEltLayout::readRecord(scratch, labelID);
623612
Identifier label = getIdentifier(labelID);
624613

625-
Pattern *subPattern = readPatternUnchecked(owningDC);
614+
Pattern *subPattern;
615+
UNWRAP(readPattern(owningDC), subPattern);
626616
elements.push_back(TuplePatternElt(label, SourceLoc(), subPattern));
627617
}
628618

629619
auto result = TuplePattern::createImplicit(getContext(), elements);
630-
recordPatternType(result, getType(tupleTypeID));
620+
Type tupleType;
621+
UNWRAP(getTypeChecked(tupleTypeID), tupleType);
622+
recordPatternType(result, tupleType);
631623
restoreOffset.reset();
632624
return result;
633625
}
@@ -686,7 +678,8 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
686678
unsigned rawIntroducer;
687679
BindingPatternLayout::readRecord(scratch, rawIntroducer);
688680

689-
Pattern *subPattern = readPatternUnchecked(owningDC);
681+
Pattern *subPattern;
682+
UNWRAP(readPattern(owningDC), subPattern);
690683

691684
auto introducer = getActualVarDeclIntroducer(
692685
(serialization::VarDeclIntroducer) rawIntroducer);

0 commit comments

Comments
 (0)