Skip to content

Commit cde2981

Browse files
committed
Serialization: Recover from deserialization failures under readPattern
rdar://129310602
1 parent 7c69bec commit cde2981

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
@@ -554,20 +554,8 @@ getActualVarDeclIntroducer(serialization::VarDeclIntroducer raw) {
554554
}
555555

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

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

573561
BCOffsetRAII restoreOffset(DeclTypeCursor);
@@ -588,7 +576,8 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
588576
fatalIfUnexpected(DeclTypeCursor.readRecord(next.ID, scratch));
589577
switch (kind) {
590578
case decls_block::PAREN_PATTERN: {
591-
Pattern *subPattern = readPatternUnchecked(owningDC);
579+
Pattern *subPattern;
580+
UNWRAP(readPattern(owningDC), subPattern);
592581

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

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

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

628618
auto result = TuplePattern::createImplicit(getContext(), elements);
629-
recordPatternType(result, getType(tupleTypeID));
619+
Type tupleType;
620+
UNWRAP(getTypeChecked(tupleTypeID), tupleType);
621+
recordPatternType(result, tupleType);
630622
restoreOffset.reset();
631623
return result;
632624
}
@@ -685,7 +677,8 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
685677
unsigned rawIntroducer;
686678
BindingPatternLayout::readRecord(scratch, rawIntroducer);
687679

688-
Pattern *subPattern = readPatternUnchecked(owningDC);
680+
Pattern *subPattern;
681+
UNWRAP(readPattern(owningDC), subPattern);
689682

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

0 commit comments

Comments
 (0)