diff --git a/lib/AST/Module.cpp b/lib/AST/Module.cpp index 72c65aba304b9..c8259cb2387e3 100644 --- a/lib/AST/Module.cpp +++ b/lib/AST/Module.cpp @@ -963,6 +963,14 @@ void ModuleDecl::getDisplayDecls(SmallVectorImpl &Results) const { #ifndef NDEBUG llvm::DenseSet visited; for (auto *D : Results) { + // decls synthesized from implicit clang decls may appear multiple times; + // e.g. if multiple modules with underlying clang modules are re-exported. + // including duplicates of these is harmless, so skip them when counting + // this assertion + if (const auto *CD = D->getClangDecl()) { + if (CD->isImplicit()) continue; + } + auto inserted = visited.insert(D).second; assert(inserted && "there should be no duplicate decls"); } diff --git a/test/SymbolGraph/ClangImporter/Submodules.swift b/test/SymbolGraph/ClangImporter/Submodules.swift index 27e6c125def1f..d568f49922f41 100644 --- a/test/SymbolGraph/ClangImporter/Submodules.swift +++ b/test/SymbolGraph/ClangImporter/Submodules.swift @@ -1,5 +1,7 @@ // RUN: %empty-directory(%t) -// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -I %S/Inputs/Submodules -emit-module-path %t/Submodules.swiftmodule -enable-objc-interop -module-name Submodules %s -emit-symbol-graph -emit-symbol-graph-dir %t +// RUN: cp -r %S/Inputs/EmitWhileBuilding/EmitWhileBuilding.framework %t +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -emit-module-path %t/EmitWhileBuilding.framework/Modules/EmitWhileBuilding.swiftmodule/%target-swiftmodule-name -import-underlying-module -F %t -module-name EmitWhileBuilding -disable-objc-attr-requires-foundation-module %S/EmitWhileBuilding.swift +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -I %S/Inputs/Submodules -emit-module-path %t/Submodules.swiftmodule -enable-objc-interop -module-name Submodules -F %t %s -emit-symbol-graph -emit-symbol-graph-dir %t // REQUIRES: objc_interop @@ -8,4 +10,6 @@ @_exported import Mixed @_exported import Mixed.Submodule +@_exported import EmitWhileBuilding + public func someFunc() {}