@@ -459,15 +459,29 @@ ParameterList *ModuleFile::readParameterList() {
459
459
return ParameterList::create (getContext (), params);
460
460
}
461
461
462
- Pattern *ModuleFile::maybeReadPattern (DeclContext *owningDC) {
462
+ Expected<Pattern *> ModuleFile::readPattern (DeclContext *owningDC) {
463
+ // Currently, the only case in which this function can fail (return an error)
464
+ // is when reading a pattern for a single variable declaration.
465
+
463
466
using namespace decls_block ;
464
467
468
+ auto readPatternUnchecked = [this ](DeclContext *owningDC) -> Pattern * {
469
+ Expected<Pattern *> deserialized = readPattern (owningDC);
470
+ if (!deserialized) {
471
+ fatal (deserialized.takeError ());
472
+ }
473
+ assert (deserialized.get ());
474
+ return deserialized.get ();
475
+ };
476
+
465
477
SmallVector<uint64_t , 8 > scratch;
466
478
467
479
BCOffsetRAII restoreOffset (DeclTypeCursor);
468
480
auto next = DeclTypeCursor.advance (AF_DontPopBlockAtEnd);
469
- if (next.Kind != llvm::BitstreamEntry::Record)
481
+ if (next.Kind != llvm::BitstreamEntry::Record) {
482
+ error ();
470
483
return nullptr ;
484
+ }
471
485
472
486
// / Local function to record the type of this pattern.
473
487
auto recordPatternType = [&](Pattern *pattern, Type type) {
@@ -483,8 +497,7 @@ Pattern *ModuleFile::maybeReadPattern(DeclContext *owningDC) {
483
497
bool isImplicit;
484
498
ParenPatternLayout::readRecord (scratch, isImplicit);
485
499
486
- Pattern *subPattern = maybeReadPattern (owningDC);
487
- assert (subPattern);
500
+ Pattern *subPattern = readPatternUnchecked (owningDC);
488
501
489
502
auto result = new (getContext ()) ParenPattern (SourceLoc (),
490
503
subPattern,
@@ -520,8 +533,7 @@ Pattern *ModuleFile::maybeReadPattern(DeclContext *owningDC) {
520
533
TuplePatternEltLayout::readRecord (scratch, labelID);
521
534
Identifier label = getIdentifier (labelID);
522
535
523
- Pattern *subPattern = maybeReadPattern (owningDC);
524
- assert (subPattern);
536
+ Pattern *subPattern = readPatternUnchecked (owningDC);
525
537
elements.push_back (TuplePatternElt (label, SourceLoc (), subPattern));
526
538
}
527
539
@@ -537,7 +549,14 @@ Pattern *ModuleFile::maybeReadPattern(DeclContext *owningDC) {
537
549
bool isImplicit;
538
550
NamedPatternLayout::readRecord (scratch, varID, typeID, isImplicit);
539
551
540
- auto var = cast<VarDecl>(getDecl (varID));
552
+ auto deserialized = getDeclChecked (varID);
553
+ if (!deserialized) {
554
+ // Pass through the error. It's too bad that it affects the whole pattern,
555
+ // but that's what we get.
556
+ return deserialized.takeError ();
557
+ }
558
+
559
+ auto var = cast<VarDecl>(deserialized.get ());
541
560
auto result = new (getContext ()) NamedPattern (var, isImplicit);
542
561
recordPatternType (result, getType (typeID));
543
562
restoreOffset.reset ();
@@ -556,12 +575,15 @@ Pattern *ModuleFile::maybeReadPattern(DeclContext *owningDC) {
556
575
case decls_block::TYPED_PATTERN: {
557
576
TypeID typeID;
558
577
bool isImplicit;
559
-
560
578
TypedPatternLayout::readRecord (scratch, typeID, isImplicit);
561
- Pattern *subPattern = maybeReadPattern (owningDC);
562
- assert (subPattern);
563
579
564
- auto result = new (getContext ()) TypedPattern (subPattern, TypeLoc (),
580
+ Expected<Pattern *> subPattern = readPattern (owningDC);
581
+ if (!subPattern) {
582
+ // Pass through any errors.
583
+ return subPattern;
584
+ }
585
+
586
+ auto result = new (getContext ()) TypedPattern (subPattern.get (), TypeLoc (),
565
587
isImplicit);
566
588
recordPatternType (result, getType (typeID));
567
589
restoreOffset.reset ();
@@ -570,8 +592,8 @@ Pattern *ModuleFile::maybeReadPattern(DeclContext *owningDC) {
570
592
case decls_block::VAR_PATTERN: {
571
593
bool isImplicit, isLet;
572
594
VarPatternLayout::readRecord (scratch, isLet, isImplicit);
573
- Pattern *subPattern = maybeReadPattern (owningDC);
574
- assert ( subPattern);
595
+
596
+ Pattern * subPattern = readPatternUnchecked (owningDC );
575
597
576
598
auto result = new (getContext ()) VarPattern (SourceLoc (), isLet, subPattern,
577
599
isImplicit);
@@ -1244,8 +1266,8 @@ bool ModuleFile::readMembers(SmallVectorImpl<Decl *> &Members) {
1244
1266
1245
1267
// Silently drop the member if it had an override-related problem.
1246
1268
llvm::handleAllErrors (D.takeError (),
1247
- [](const OverrideError &) { /* expected */ },
1248
- [& ](std::unique_ptr<llvm::ErrorInfoBase> unhandled){
1269
+ [](const OverrideError &) { /* expected */ },
1270
+ [ this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
1249
1271
fatal (std::move (unhandled));
1250
1272
});
1251
1273
continue ;
@@ -2843,13 +2865,25 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2843
2865
willSetID, didSetID, overriddenID,
2844
2866
rawAccessLevel, rawSetterAccessLevel);
2845
2867
2868
+ Identifier name = getIdentifier (nameID);
2869
+
2870
+ Expected<Decl *> overridden = getDeclChecked (overriddenID);
2871
+ if (!overridden) {
2872
+ llvm::handleAllErrors (overridden.takeError (),
2873
+ [](const XRefError &) { /* expected */ },
2874
+ [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled){
2875
+ fatal (std::move (unhandled));
2876
+ });
2877
+ return llvm::make_error<OverrideError>(name);
2878
+ }
2879
+
2846
2880
auto DC = ForcedContext ? *ForcedContext : getDeclContext (contextID);
2847
2881
if (declOrOffset.isComplete ())
2848
2882
return declOrOffset;
2849
2883
2850
2884
auto var = createDecl<VarDecl>(/* IsStatic*/ isStatic, /* IsLet*/ isLet,
2851
- /* IsCaptureList*/ false , SourceLoc (),
2852
- getIdentifier (nameID), Type (), DC);
2885
+ /* IsCaptureList*/ false , SourceLoc (), name,
2886
+ Type (), DC);
2853
2887
var->setHasNonPatternBindingInit (hasNonPatternBindingInit);
2854
2888
declOrOffset = var;
2855
2889
@@ -2881,8 +2915,8 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2881
2915
if (isImplicit)
2882
2916
var->setImplicit ();
2883
2917
2884
- if (auto overridden = cast_or_null<VarDecl>(getDecl (overriddenID ))) {
2885
- var->setOverriddenDecl (overridden );
2918
+ if (auto overriddenVar = cast_or_null<VarDecl>(overridden. get ( ))) {
2919
+ var->setOverriddenDecl (overriddenVar );
2886
2920
AddAttribute (new (ctx) OverrideAttr (SourceLoc ()));
2887
2921
}
2888
2922
@@ -2963,8 +2997,8 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2963
2997
Expected<Decl *> overridden = getDeclChecked (overriddenID);
2964
2998
if (!overridden) {
2965
2999
llvm::handleAllErrors (overridden.takeError (),
2966
- [](const XRefError &) { /* expected */ },
2967
- [& ](std::unique_ptr<llvm::ErrorInfoBase> unhandled){
3000
+ [](const XRefError &) { /* expected */ },
3001
+ [ this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
2968
3002
fatal (std::move (unhandled));
2969
3003
});
2970
3004
return llvm::make_error<OverrideError>(name);
@@ -3082,10 +3116,30 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3082
3116
}
3083
3117
3084
3118
auto dc = getDeclContext (contextID);
3119
+
3120
+ SmallVector<std::pair<Pattern *, DeclContextID>, 4 > patterns;
3121
+ for (unsigned i = 0 ; i != numPatterns; ++i) {
3122
+ auto pattern = readPattern (dc);
3123
+ if (!pattern) {
3124
+ // Silently drop the pattern if it had an override-related problem.
3125
+ llvm::handleAllErrors (pattern.takeError (),
3126
+ [](const OverrideError &) { /* expected */ },
3127
+ [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
3128
+ fatal (std::move (unhandled));
3129
+ });
3130
+ // ...but continue to read any further patterns we're expecting.
3131
+ continue ;
3132
+ }
3133
+
3134
+ patterns.emplace_back (pattern.get (), DeclContextID ());
3135
+ if (!initContextIDs.empty ())
3136
+ patterns.back ().second = initContextIDs[i];
3137
+ }
3138
+
3085
3139
auto binding =
3086
3140
PatternBindingDecl::createDeserialized (ctx, SourceLoc (),
3087
3141
StaticSpelling.getValue (),
3088
- SourceLoc (), numPatterns , dc);
3142
+ SourceLoc (), patterns. size () , dc);
3089
3143
binding->setEarlyAttrValidation (true );
3090
3144
declOrOffset = binding;
3091
3145
@@ -3094,13 +3148,9 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3094
3148
if (isImplicit)
3095
3149
binding->setImplicit ();
3096
3150
3097
- for (unsigned i = 0 ; i != numPatterns; ++i) {
3098
- auto pattern = maybeReadPattern (dc);
3099
- assert (pattern);
3100
- DeclContext *initContext = nullptr ;
3101
- if (!initContextIDs.empty ())
3102
- initContext = getDeclContext (initContextIDs[i]);
3103
- binding->setPattern (i, pattern, initContext);
3151
+ for (unsigned i = 0 ; i != patterns.size (); ++i) {
3152
+ DeclContext *initContext = getDeclContext (patterns[i].second );
3153
+ binding->setPattern (i, patterns[i].first , initContext);
3104
3154
}
3105
3155
3106
3156
break ;
@@ -3475,6 +3525,22 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3475
3525
overriddenID, rawAccessLevel,
3476
3526
rawSetterAccessLevel,
3477
3527
argNameIDs);
3528
+ // Resolve the name ids.
3529
+ SmallVector<Identifier, 2 > argNames;
3530
+ for (auto argNameID : argNameIDs)
3531
+ argNames.push_back (getIdentifier (argNameID));
3532
+ DeclName name (ctx, ctx.Id_subscript , argNames);
3533
+
3534
+ Expected<Decl *> overridden = getDeclChecked (overriddenID);
3535
+ if (!overridden) {
3536
+ llvm::handleAllErrors (overridden.takeError (),
3537
+ [](const XRefError &) { /* expected */ },
3538
+ [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
3539
+ fatal (std::move (unhandled));
3540
+ });
3541
+ return llvm::make_error<OverrideError>(name);
3542
+ }
3543
+
3478
3544
auto parent = getDeclContext (contextID);
3479
3545
if (declOrOffset.isComplete ())
3480
3546
return declOrOffset;
@@ -3483,12 +3549,6 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3483
3549
if (declOrOffset.isComplete ())
3484
3550
return declOrOffset;
3485
3551
3486
- // Resolve the name ids.
3487
- SmallVector<Identifier, 2 > argNames;
3488
- for (auto argNameID : argNameIDs)
3489
- argNames.push_back (getIdentifier (argNameID));
3490
-
3491
- DeclName name (ctx, ctx.Id_subscript , argNames);
3492
3552
auto subscript = createDecl<SubscriptDecl>(name, SourceLoc (), nullptr ,
3493
3553
SourceLoc (), TypeLoc (),
3494
3554
parent, genericParams);
@@ -3523,8 +3583,8 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
3523
3583
3524
3584
if (isImplicit)
3525
3585
subscript->setImplicit ();
3526
- if (auto overridden = cast_or_null<SubscriptDecl>(getDecl (overriddenID ))) {
3527
- subscript->setOverriddenDecl (overridden );
3586
+ if (auto overriddenSub = cast_or_null<SubscriptDecl>(overridden. get ( ))) {
3587
+ subscript->setOverriddenDecl (overriddenSub );
3528
3588
AddAttribute (new (ctx) OverrideAttr (SourceLoc ()));
3529
3589
}
3530
3590
break ;
0 commit comments