mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Serialization: Fix latent bug with extensions of nested generic types
ExtensionDecls for nested generic types have multiple generic parameter lists, one for each level of nested generic context. We only serialized the outermost list, though. This didn't cause any problems as far as I can see because most of the time we seem to use the GenericSignature instead, which has the correct generic parameters. However since we still have usages of getGenericParamsOfContext() on deserialized DeclContexts, better safe than sorry. I added a test; the test used to pass on master, but with the new assertion I added, it would fail without the other changes in this patch.
This commit is contained in:
@@ -2385,7 +2385,21 @@ void Serializer::writeDecl(const Decl *D) {
|
||||
isa<ProtocolDecl>(baseNominal);
|
||||
}
|
||||
|
||||
writeGenericParams(extension->getGenericParams());
|
||||
// Extensions of nested generic types have multiple generic parameter
|
||||
// lists. Collect them all, from the innermost to outermost.
|
||||
SmallVector<GenericParamList *, 2> allGenericParams;
|
||||
for (auto *genericParams = extension->getGenericParams();
|
||||
genericParams != nullptr;
|
||||
genericParams = genericParams->getOuterParameters()) {
|
||||
allGenericParams.push_back(genericParams);
|
||||
}
|
||||
|
||||
// Reverse the list, and write the parameter lists, from outermost
|
||||
// to innermost.
|
||||
std::reverse(allGenericParams.begin(), allGenericParams.end());
|
||||
for (auto *genericParams : allGenericParams)
|
||||
writeGenericParams(genericParams);
|
||||
|
||||
writeMembers(extension->getMembers(), isClassExtension);
|
||||
writeConformances(conformances, DeclTypeAbbrCodes);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user