diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index 6348fdd1b9b16..ff441f5b581d2 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -2323,22 +2323,13 @@ void Serializer::writeForeignErrorConvention(const ForeignErrorConvention &fec){ /// - \p decl is declared in an extension of a type that depends on /// \p problemContext static bool contextDependsOn(const NominalTypeDecl *decl, - const DeclContext *problemContext) { - const DeclContext *dc = decl; - do { - if (dc == problemContext) - return true; - if (auto *extension = dyn_cast(dc)) - dc = extension->getAsNominalTypeOrNominalTypeExtensionContext(); - else - dc = dc->getParent(); - } while (!dc->isModuleScopeContext()); - return false; + const ModuleDecl *problemModule) { + return decl->getParentModule() == problemModule; } static void collectDependenciesFromType(llvm::SmallSetVector &seen, Type ty, - const DeclContext *excluding) { + const ModuleDecl *excluding) { ty.visit([&](Type next) { auto *nominal = next->getAnyNominal(); if (!nominal) @@ -2712,7 +2703,7 @@ void Serializer::writeDecl(const Decl *D) { continue; collectDependenciesFromType(dependencyTypes, nextElt->getArgumentInterfaceType(), - /*excluding*/theEnum); + /*excluding*/theEnum->getParentModule()); } for (Type ty : dependencyTypes) inheritedAndDependencyTypes.push_back(addTypeRef(ty)); diff --git a/test/Serialization/Inputs/enum-mutual-circularity-2.swift b/test/Serialization/Inputs/enum-mutual-circularity-2.swift new file mode 100644 index 0000000000000..6445750261584 --- /dev/null +++ b/test/Serialization/Inputs/enum-mutual-circularity-2.swift @@ -0,0 +1,3 @@ +public enum TweedleDum { + indirect case dee(TweedleDee) +} diff --git a/test/Serialization/Inputs/enum-mutual-circularity-client.swift b/test/Serialization/Inputs/enum-mutual-circularity-client.swift new file mode 100644 index 0000000000000..1c87736a0d651 --- /dev/null +++ b/test/Serialization/Inputs/enum-mutual-circularity-client.swift @@ -0,0 +1,3 @@ +import EnumCircularity + +func foo(_: TweedleDee) {} diff --git a/test/Serialization/enum-mutual-circularity.swift b/test/Serialization/enum-mutual-circularity.swift new file mode 100644 index 0000000000000..f92416080a826 --- /dev/null +++ b/test/Serialization/enum-mutual-circularity.swift @@ -0,0 +1,9 @@ +// RUN: rm -rf %t && mkdir -p %t +// RUN: %target-swift-frontend -emit-module -module-name EnumCircularity -o %t/partial1.swiftmodule -primary-file %s %S/Inputs/enum-mutual-circularity-2.swift +// RUN: %target-swift-frontend -emit-module -module-name EnumCircularity -o %t/partial2.swiftmodule %s -primary-file %S/Inputs/enum-mutual-circularity-2.swift +// RUN: %target-swift-frontend -emit-module -module-name EnumCircularity -o %t/EnumCircularity.swiftmodule %t/partial1.swiftmodule %t/partial2.swiftmodule +// RUN: %target-swift-frontend -I %t -c -o %t/client.o %S/Inputs/enum-mutual-circularity-client.swift + +public enum TweedleDee { + indirect case dum(TweedleDum) +}