@@ -299,17 +299,32 @@ namespace {
299
299
const char XRefError::ID = ' \0 ' ;
300
300
301
301
class OverrideError : public llvm ::ErrorInfo<OverrideError> {
302
+ public:
303
+ enum Kind {
304
+ Normal,
305
+ DesignatedInitializer
306
+ };
307
+
308
+ private:
302
309
friend ErrorInfo;
303
310
static const char ID;
304
311
305
312
DeclName name;
313
+ Kind kind;
314
+
306
315
public:
307
- explicit OverrideError (DeclName name) : name(name) {}
316
+
317
+ explicit OverrideError (DeclName name, Kind kind = Normal)
318
+ : name(name), kind(kind) {}
308
319
309
320
void log (raw_ostream &OS) const override {
310
321
OS << " could not find '" << name << " ' in parent class" ;
311
322
}
312
323
324
+ Kind getKind () const {
325
+ return kind;
326
+ }
327
+
313
328
std::error_code convertToErrorCode () const override {
314
329
// This is a deprecated part of llvm::Error, so we just return a very
315
330
// generic value.
@@ -1235,47 +1250,6 @@ GenericEnvironment *ModuleFile::getGenericEnvironment(
1235
1250
;
1236
1251
}
1237
1252
1238
- bool ModuleFile::readMembers (SmallVectorImpl<Decl *> &Members) {
1239
- using namespace decls_block ;
1240
-
1241
- auto entry = DeclTypeCursor.advance ();
1242
- if (entry.Kind != llvm::BitstreamEntry::Record)
1243
- return true ;
1244
-
1245
- SmallVector<uint64_t , 16 > memberIDBuffer;
1246
-
1247
- unsigned kind = DeclTypeCursor.readRecord (entry.ID , memberIDBuffer);
1248
- assert (kind == MEMBERS);
1249
- (void )kind;
1250
-
1251
- ArrayRef<uint64_t > rawMemberIDs;
1252
- decls_block::MembersLayout::readRecord (memberIDBuffer, rawMemberIDs);
1253
-
1254
- if (rawMemberIDs.empty ())
1255
- return false ;
1256
-
1257
- Members.reserve (rawMemberIDs.size ());
1258
- for (DeclID rawID : rawMemberIDs) {
1259
- Expected<Decl *> D = getDeclChecked (rawID);
1260
- if (!D) {
1261
- if (!getContext ().LangOpts .EnableDeserializationRecovery )
1262
- fatal (D.takeError ());
1263
-
1264
- // Silently drop the member if it had an override-related problem.
1265
- llvm::handleAllErrors (D.takeError (),
1266
- [](const OverrideError &) { /* expected */ },
1267
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
1268
- fatal (std::move (unhandled));
1269
- });
1270
- continue ;
1271
- }
1272
- assert (D.get () && " unchecked error deserializing next member" );
1273
- Members.push_back (D.get ());
1274
- }
1275
-
1276
- return false ;
1277
- }
1278
-
1279
1253
bool ModuleFile::readDefaultWitnessTable (ProtocolDecl *proto) {
1280
1254
using namespace decls_block ;
1281
1255
@@ -2735,6 +2709,29 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2735
2709
genericEnvID, interfaceID,
2736
2710
overriddenID, rawAccessLevel,
2737
2711
argNameIDs);
2712
+
2713
+ // Resolve the name ids.
2714
+ SmallVector<Identifier, 2 > argNames;
2715
+ for (auto argNameID : argNameIDs)
2716
+ argNames.push_back (getIdentifier (argNameID));
2717
+ DeclName name (ctx, ctx.Id_init , argNames);
2718
+
2719
+ Optional<swift::CtorInitializerKind> initKind =
2720
+ getActualCtorInitializerKind (storedInitKind);
2721
+
2722
+ auto overridden = getDeclChecked (overriddenID);
2723
+ if (!overridden) {
2724
+ llvm::handleAllErrors (overridden.takeError (),
2725
+ [](const XRefError &) { /* expected */ },
2726
+ [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
2727
+ fatal (std::move (unhandled));
2728
+ });
2729
+ auto kind = OverrideError::Normal;
2730
+ if (initKind == CtorInitializerKind::Designated)
2731
+ kind = OverrideError::DesignatedInitializer;
2732
+ return llvm::make_error<OverrideError>(name, kind);
2733
+ }
2734
+
2738
2735
auto parent = getDeclContext (contextID);
2739
2736
if (declOrOffset.isComplete ())
2740
2737
return declOrOffset;
@@ -2743,16 +2740,10 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2743
2740
if (declOrOffset.isComplete ())
2744
2741
return declOrOffset;
2745
2742
2746
- // Resolve the name ids.
2747
- SmallVector<Identifier, 2 > argNames;
2748
- for (auto argNameID : argNameIDs)
2749
- argNames.push_back (getIdentifier (argNameID));
2750
-
2751
2743
OptionalTypeKind failability = OTK_None;
2752
2744
if (auto actualFailability = getActualOptionalTypeKind (rawFailability))
2753
2745
failability = *actualFailability;
2754
2746
2755
- DeclName name (ctx, ctx.Id_init , argNames);
2756
2747
auto ctor =
2757
2748
createDecl<ConstructorDecl>(name, SourceLoc (),
2758
2749
failability, /* FailabilityLoc=*/ SourceLoc (),
@@ -2802,11 +2793,10 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2802
2793
ctor->setImplicit ();
2803
2794
if (hasStubImplementation)
2804
2795
ctor->setStubImplementation (true );
2805
- if (auto initKind = getActualCtorInitializerKind (storedInitKind))
2806
- ctor->setInitKind (*initKind);
2807
- if (auto overridden
2808
- = dyn_cast_or_null<ConstructorDecl>(getDecl (overriddenID)))
2809
- ctor->setOverriddenDecl (overridden);
2796
+ if (initKind.hasValue ())
2797
+ ctor->setInitKind (initKind.getValue ());
2798
+ if (auto overriddenCtor = cast_or_null<ConstructorDecl>(overridden.get ()))
2799
+ ctor->setOverriddenDecl (overriddenCtor);
2810
2800
break ;
2811
2801
}
2812
2802
@@ -2834,7 +2824,7 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
2834
2824
if (!overridden) {
2835
2825
llvm::handleAllErrors (overridden.takeError (),
2836
2826
[](const XRefError &) { /* expected */ },
2837
- [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled){
2827
+ [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
2838
2828
fatal (std::move (unhandled));
2839
2829
});
2840
2830
return llvm::make_error<OverrideError>(name);
@@ -4432,28 +4422,69 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
4432
4422
return typeOrOffset;
4433
4423
}
4434
4424
4435
- void ModuleFile::loadAllMembers (Decl *D , uint64_t contextData) {
4436
- PrettyStackTraceDecl trace (" loading members for" , D );
4425
+ void ModuleFile::loadAllMembers (Decl *container , uint64_t contextData) {
4426
+ PrettyStackTraceDecl trace (" loading members for" , container );
4437
4427
++NumMemberListsLoaded;
4438
4428
4439
- BCOffsetRAII restoreOffset (DeclTypeCursor);
4440
- DeclTypeCursor.JumpToBit (contextData);
4441
- SmallVector<Decl *, 16 > members;
4442
- bool Err = readMembers (members);
4443
- assert (!Err && " unable to read members" );
4444
- (void )Err;
4445
-
4446
4429
IterableDeclContext *IDC;
4447
- if (auto *nominal = dyn_cast<NominalTypeDecl>(D ))
4430
+ if (auto *nominal = dyn_cast<NominalTypeDecl>(container ))
4448
4431
IDC = nominal;
4449
4432
else
4450
- IDC = cast<ExtensionDecl>(D);
4433
+ IDC = cast<ExtensionDecl>(container);
4434
+
4435
+ BCOffsetRAII restoreOffset (DeclTypeCursor);
4436
+ DeclTypeCursor.JumpToBit (contextData);
4437
+ auto entry = DeclTypeCursor.advance ();
4438
+ if (entry.Kind != llvm::BitstreamEntry::Record) {
4439
+ error ();
4440
+ return ;
4441
+ }
4442
+
4443
+ SmallVector<uint64_t , 16 > memberIDBuffer;
4444
+
4445
+ unsigned kind = DeclTypeCursor.readRecord (entry.ID , memberIDBuffer);
4446
+ assert (kind == decls_block::MEMBERS);
4447
+ (void )kind;
4448
+
4449
+ ArrayRef<uint64_t > rawMemberIDs;
4450
+ decls_block::MembersLayout::readRecord (memberIDBuffer, rawMemberIDs);
4451
+
4452
+ if (rawMemberIDs.empty ())
4453
+ return ;
4454
+
4455
+ SmallVector<Decl *, 16 > members;
4456
+ members.reserve (rawMemberIDs.size ());
4457
+ for (DeclID rawID : rawMemberIDs) {
4458
+ Expected<Decl *> next = getDeclChecked (rawID);
4459
+ if (!next) {
4460
+ if (!getContext ().LangOpts .EnableDeserializationRecovery )
4461
+ fatal (next.takeError ());
4462
+
4463
+ // Drop the member if it had an override-related problem.
4464
+ auto handleMissingOverrideBase = [container](const OverrideError &error) {
4465
+ if (error.getKind () != OverrideError::DesignatedInitializer)
4466
+ return ;
4467
+ auto *containingClass = dyn_cast<ClassDecl>(container);
4468
+ if (!containingClass)
4469
+ return ;
4470
+ containingClass->setHasMissingDesignatedInitializers ();
4471
+ };
4472
+ llvm::handleAllErrors (next.takeError (),
4473
+ handleMissingOverrideBase,
4474
+ [this ](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
4475
+ fatal (std::move (unhandled));
4476
+ });
4477
+ continue ;
4478
+ }
4479
+ assert (next.get () && " unchecked error deserializing next member" );
4480
+ members.push_back (next.get ());
4481
+ }
4451
4482
4452
4483
for (auto member : members)
4453
4484
IDC->addMember (member);
4454
4485
4455
- if (auto *proto = dyn_cast<ProtocolDecl>(D )) {
4456
- PrettyStackTraceDecl trace (" reading default witness table for" , D );
4486
+ if (auto *proto = dyn_cast<ProtocolDecl>(container )) {
4487
+ PrettyStackTraceDecl trace (" reading default witness table for" , proto );
4457
4488
bool Err = readDefaultWitnessTable (proto);
4458
4489
assert (!Err && " unable to read default witness table" );
4459
4490
(void )Err;
0 commit comments