Skip to content

Commit ce12778

Browse files
committed
[Serialization] Use getAllMembers() to eliminate nondeterminism.
When serializing the members of a nominal type or extension, use `getAllMembers()` instead of `getMembers()` to provide a deterministic ordering. Fixes rdar://63294687.
1 parent c4e265e commit ce12778

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

lib/Serialization/Serialization.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2712,7 +2712,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
27122712
/// \param members The decls within the context.
27132713
/// \param isClass True if the context could be a class context (class,
27142714
/// class extension, or protocol).
2715-
void writeMembers(DeclID parentID, DeclRange members, bool isClass) {
2715+
void writeMembers(DeclID parentID, ArrayRef<Decl *> members, bool isClass) {
27162716
using namespace decls_block;
27172717

27182718
SmallVector<DeclID, 16> memberIDs;
@@ -2853,7 +2853,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
28532853

28542854
SmallVector<DeclID, 16> witnessIDs;
28552855

2856-
for (auto member : proto->getMembers()) {
2856+
for (auto member : proto->getAllMembers()) {
28572857
if (auto *value = dyn_cast<ValueDecl>(member)) {
28582858
auto witness = proto->getDefaultWitness(value);
28592859
if (!witness)
@@ -3032,7 +3032,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
30323032
for (auto *genericParams : llvm::reverse(allGenericParams))
30333033
writeGenericParams(genericParams);
30343034

3035-
writeMembers(id, extension->getMembers(), isClassExtension);
3035+
writeMembers(id, extension->getAllMembers(), isClassExtension);
30363036
S.writeConformances(conformances, S.DeclTypeAbbrCodes);
30373037
}
30383038

@@ -3248,7 +3248,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
32483248

32493249

32503250
writeGenericParams(theStruct->getGenericParams());
3251-
writeMembers(id, theStruct->getMembers(), false);
3251+
writeMembers(id, theStruct->getAllMembers(), false);
32523252
S.writeConformances(conformances, S.DeclTypeAbbrCodes);
32533253
}
32543254

@@ -3305,7 +3305,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
33053305
inheritedAndDependencyTypes);
33063306

33073307
writeGenericParams(theEnum->getGenericParams());
3308-
writeMembers(id, theEnum->getMembers(), false);
3308+
writeMembers(id, theEnum->getAllMembers(), false);
33093309
S.writeConformances(conformances, S.DeclTypeAbbrCodes);
33103310
}
33113311

@@ -3364,7 +3364,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
33643364
inheritedAndDependencyTypes);
33653365

33663366
writeGenericParams(theClass->getGenericParams());
3367-
writeMembers(id, theClass->getMembers(), true);
3367+
writeMembers(id, theClass->getAllMembers(), true);
33683368
S.writeConformances(conformances, S.DeclTypeAbbrCodes);
33693369
}
33703370

@@ -3413,7 +3413,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
34133413
writeGenericParams(proto->getGenericParams());
34143414
S.writeGenericRequirements(
34153415
proto->getRequirementSignature(), S.DeclTypeAbbrCodes);
3416-
writeMembers(id, proto->getMembers(), true);
3416+
writeMembers(id, proto->getAllMembers(), true);
34173417
writeDefaultWitnessTable(proto);
34183418
}
34193419

@@ -5149,7 +5149,7 @@ static void collectInterestingNestedDeclarations(
51495149

51505150
// Recurse into nested declarations.
51515151
if (auto iterable = dyn_cast<IterableDeclContext>(member)) {
5152-
collectInterestingNestedDeclarations(S, iterable->getMembers(),
5152+
collectInterestingNestedDeclarations(S, iterable->getAllMembers(),
51535153
operatorMethodDecls,
51545154
objcMethods, nestedTypeDecls,
51555155
derivativeConfigs,
@@ -5231,7 +5231,7 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
52315231
if (auto bodyFP = IDC->getBodyFingerprint()) {
52325232
declFingerprints.insert({addDeclRef(D), *bodyFP});
52335233
}
5234-
collectInterestingNestedDeclarations(*this, IDC->getMembers(),
5234+
collectInterestingNestedDeclarations(*this, IDC->getAllMembers(),
52355235
operatorMethodDecls, objcMethods,
52365236
nestedTypeDecls,
52375237
uniquedDerivativeConfigs);
@@ -5264,7 +5264,7 @@ void Serializer::writeAST(ModuleOrSourceFile DC) {
52645264
if (auto bodyFP = IDC->getBodyFingerprint()) {
52655265
declFingerprints.insert({addDeclRef(TD), *bodyFP});
52665266
}
5267-
collectInterestingNestedDeclarations(*this, IDC->getMembers(),
5267+
collectInterestingNestedDeclarations(*this, IDC->getAllMembers(),
52685268
operatorMethodDecls, objcMethods,
52695269
nestedTypeDecls,
52705270
uniquedDerivativeConfigs,

0 commit comments

Comments
 (0)