Skip to content

Commit 9633b41

Browse files
authored
Only enable unsafe flags if version 6.2 or newer. (#8951)
As we disable checking for unsafe flags, make sure they are still checked when the swift-tools-version is earlier than 6.2. This ensures consumers of the package don't get unsafe flags errors when using older toolchains. They will need to upgrade their toolchains to use packages with unsafe flags.
1 parent 5035929 commit 9633b41

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

Sources/PackageLoading/PackageBuilder.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,8 @@ public final class PackageBuilder {
10791079
declaredSwiftVersions: self.declaredSwiftVersions(),
10801080
buildSettings: buildSettings,
10811081
buildSettingsDescription: manifestTarget.settings,
1082-
usesUnsafeFlags: manifestTarget.usesUnsafeFlags,
1082+
// unsafe flags check disabled in 6.2
1083+
usesUnsafeFlags: manifest.toolsVersion >= .v6_2 ? false : manifestTarget.usesUnsafeFlags,
10831084
implicit: false
10841085
)
10851086
} else {
@@ -1125,7 +1126,8 @@ public final class PackageBuilder {
11251126
dependencies: dependencies,
11261127
buildSettings: buildSettings,
11271128
buildSettingsDescription: manifestTarget.settings,
1128-
usesUnsafeFlags: manifestTarget.usesUnsafeFlags,
1129+
// unsafe flags check disabled in 6.2
1130+
usesUnsafeFlags: manifest.toolsVersion >= .v6_2 ? false : manifestTarget.usesUnsafeFlags,
11291131
implicit: false
11301132
)
11311133
}
@@ -2024,8 +2026,7 @@ extension Sequence {
20242026

20252027
extension TargetDescription {
20262028
fileprivate var usesUnsafeFlags: Bool {
2027-
// We no longer restrict unsafe flags
2028-
false
2029+
settings.filter(\.kind.isUnsafeFlags).isEmpty == false
20292030
}
20302031

20312032
fileprivate func isMacroTest(in manifest: Manifest) -> Bool {

Tests/PackageGraphTests/ModulesGraphTests.swift

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2058,7 +2058,7 @@ final class ModulesGraphTests: XCTestCase {
20582058
}
20592059
}
20602060

2061-
func testUnsafeFlags() throws {
2061+
func loadUnsafeModulesGraph(toolsVersion: ToolsVersion) throws -> TestingObservability {
20622062
let fs = InMemoryFileSystem(
20632063
emptyFiles:
20642064
"/Foo/Sources/Foo/foo.swift",
@@ -2071,6 +2071,7 @@ final class ModulesGraphTests: XCTestCase {
20712071
)
20722072

20732073
let observability = ObservabilitySystem.makeForTesting()
2074+
20742075
_ = try loadModulesGraph(
20752076
fileSystem: fs,
20762077
manifests: [
@@ -2088,6 +2089,7 @@ final class ModulesGraphTests: XCTestCase {
20882089
Manifest.createFileSystemManifest(
20892090
displayName: "Bar",
20902091
path: "/Bar",
2092+
toolsVersion: toolsVersion,
20912093
products: [
20922094
ProductDescription(name: "Bar", type: .library(.automatic), targets: ["Bar", "Bar2", "Bar3"]),
20932095
ProductDescription(
@@ -2127,10 +2129,41 @@ final class ModulesGraphTests: XCTestCase {
21272129
observabilityScope: observability.topScope
21282130
)
21292131

2132+
return observability
2133+
}
2134+
2135+
func testUnsafeFlagsDisabled() throws {
2136+
let observability = try loadUnsafeModulesGraph(toolsVersion: .v6_2)
2137+
21302138
// We have turned off the unsafe flags check
21312139
XCTAssertEqual(observability.diagnostics.count, 0)
21322140
}
21332141

2142+
func testUnsafeFlagsEnabled() throws {
2143+
let observability = try loadUnsafeModulesGraph(toolsVersion: .v6_1)
2144+
2145+
XCTAssertEqual(observability.diagnostics.count, 3)
2146+
testDiagnostics(observability.diagnostics) { result in
2147+
var expectedMetadata = ObservabilityMetadata()
2148+
expectedMetadata.moduleName = "Foo2"
2149+
let diagnostic1 = result.checkUnordered(
2150+
diagnostic: .contains("the target 'Bar2' in product 'TransitiveBar' contains unsafe build flags"),
2151+
severity: .error
2152+
)
2153+
XCTAssertEqual(diagnostic1?.metadata?.moduleName, "Foo2")
2154+
let diagnostic2 = result.checkUnordered(
2155+
diagnostic: .contains("the target 'Bar' in product 'Bar' contains unsafe build flags"),
2156+
severity: .error
2157+
)
2158+
XCTAssertEqual(diagnostic2?.metadata?.moduleName, "Foo")
2159+
let diagnostic3 = result.checkUnordered(
2160+
diagnostic: .contains("the target 'Bar2' in product 'Bar' contains unsafe build flags"),
2161+
severity: .error
2162+
)
2163+
XCTAssertEqual(diagnostic3?.metadata?.moduleName, "Foo")
2164+
}
2165+
}
2166+
21342167
func testConditionalTargetDependency() throws {
21352168
let fs = InMemoryFileSystem(
21362169
emptyFiles:

Tests/WorkspaceTests/WorkspaceTests.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5745,7 +5745,7 @@ final class WorkspaceTests: XCTestCase {
57455745
products: [
57465746
MockProduct(name: "Bar", modules: ["Bar"]),
57475747
],
5748-
versions: ["1.0.0", nil]
5748+
versions: ["1.0.0", nil],
57495749
),
57505750
MockPackage(
57515751
name: "Foo",
@@ -5768,7 +5768,7 @@ final class WorkspaceTests: XCTestCase {
57685768
products: [
57695769
MockProduct(name: "Bar", modules: ["Bar"]),
57705770
],
5771-
versions: ["1.0.0", nil]
5771+
versions: ["1.0.0", nil],
57725772
),
57735773
MockPackage(
57745774
name: "Baz",
@@ -5785,15 +5785,27 @@ final class WorkspaceTests: XCTestCase {
57855785
dependencies: [
57865786
.sourceControl(path: "./Bar", requirement: .upToNextMajor(from: "1.0.0")),
57875787
],
5788-
versions: ["1.0.0", "1.5.0"]
5788+
versions: ["1.0.0", "1.5.0"],
5789+
toolsVersion: .minimumRequired
57895790
),
57905791
]
57915792
)
57925793

57935794
// We should only see errors about use of unsafe flag in the version-based dependency.
57945795
try await workspace.checkPackageGraph(roots: ["Foo", "Bar"]) { _, diagnostics in
57955796
// We have disabled the check so there shouldn't be any errors.
5796-
XCTAssert(diagnostics.filter({ $0.severity == .error }).isEmpty)
5797+
testDiagnostics(diagnostics) { result in
5798+
let diagnostic1 = result.checkUnordered(
5799+
diagnostic: .equal("the target 'Baz' in product 'Baz' contains unsafe build flags"),
5800+
severity: .error
5801+
)
5802+
XCTAssertEqual(diagnostic1?.metadata?.packageIdentity, .plain("foo"))
5803+
XCTAssertEqual(diagnostic1?.metadata?.moduleName, "Foo")
5804+
5805+
// since Bar is using the current tools version and we've disabled the check since 6.2,
5806+
// the result should now be empty.
5807+
result.checkIsEmpty()
5808+
}
57975809
}
57985810
}
57995811

0 commit comments

Comments
 (0)