diff --git a/Sources/PackageLoading/TargetSourcesBuilder.swift b/Sources/PackageLoading/TargetSourcesBuilder.swift index 58f4af0ae53..a008afcb9eb 100644 --- a/Sources/PackageLoading/TargetSourcesBuilder.swift +++ b/Sources/PackageLoading/TargetSourcesBuilder.swift @@ -158,6 +158,10 @@ public struct TargetSourcesBuilder { } else { matchedRule = .compile } + // The source file might have been declared twice so + // exit on first match. + // FIXME: We should emitting warnings for duplicate// declarations. + break } } } diff --git a/Tests/PackageLoadingTests/PackageBuilderTests.swift b/Tests/PackageLoadingTests/PackageBuilderTests.swift index 00f6936f7e3..531146b6e96 100644 --- a/Tests/PackageLoadingTests/PackageBuilderTests.swift +++ b/Tests/PackageLoadingTests/PackageBuilderTests.swift @@ -290,6 +290,32 @@ class PackageBuilderTests: XCTestCase { } } + func testOverlappingDeclaredSources() throws { + let fs = InMemoryFileSystem(emptyFiles: + "/Sources/clib/subfolder/foo.h", + "/Sources/clib/subfolder/foo.c", + "/Sources/clib/bar.h", + "/Sources/clib/bar.c", + "/done" + ) + + let manifest = Manifest.createV4Manifest( + name: "MyPackage", + targets: [ + TargetDescription( + name: "clib", + path: "Sources", + sources: ["clib", "clib/subfolder"] + ), + ] + ) + PackageBuilderTester(manifest, in: fs) { result in + result.checkModule("clib") { module in + module.checkSources(sources: ["clib/bar.c", "clib/subfolder/foo.c"]) + } + } + } + func testDeclaredExecutableProducts() { // Check that declaring executable product doesn't collide with the // inferred products. diff --git a/Tests/PackageLoadingTests/XCTestManifests.swift b/Tests/PackageLoadingTests/XCTestManifests.swift index c461ffd536b..8342812e502 100644 --- a/Tests/PackageLoadingTests/XCTestManifests.swift +++ b/Tests/PackageLoadingTests/XCTestManifests.swift @@ -31,6 +31,7 @@ extension PackageBuilderTests { ("testCustomTargetPaths", testCustomTargetPaths), ("testCustomTargetPathsOverlap", testCustomTargetPathsOverlap), ("testDeclaredExecutableProducts", testDeclaredExecutableProducts), + ("testDeclaredSourcesWithDot", testDeclaredSourcesWithDot), ("testDotFilesAreIgnored", testDotFilesAreIgnored), ("testDuplicateProducts", testDuplicateProducts), ("testDuplicateTargetDependencies", testDuplicateTargetDependencies), @@ -46,6 +47,7 @@ extension PackageBuilderTests { ("testMixedSources", testMixedSources), ("testModuleMapLayout", testModuleMapLayout), ("testMultipleTestProducts", testMultipleTestProducts), + ("testOverlappingDeclaredSources", testOverlappingDeclaredSources), ("testPlatforms", testPlatforms), ("testPredefinedTargetSearchError", testPredefinedTargetSearchError), ("testPublicHeadersPath", testPublicHeadersPath),