Files
swift-mirror/test/Parse/ConditionalCompilation/can_import_options.swift
Artem Chikin 690dbc530c [Source Warning Control] Avoid duplicate canImport diagnostics from secondary #if walks
`#if canImport(...)` conditions are evaluated by the parser's primary
`EvaluateIfConditionRequest`, which emits `cannot_find_module_version` and
records the result in `CanImportModuleVersions`. Several later analyses re-walk
the same directives and, before this change, routed through that same emitting
`canImportModule` path, duplicating the diagnostic: the
`ExportedSourceFile.configuredRegions` region-tree rebuild that backs
diagnostic-group control (which could also recurse indefinitely), and the
`VarDeclUsageChecker` inactive-code scans behind unused-variable diagnostics.

Introduce a `CanImportMode` on `CompilerBuildConfiguration` distinguishing the
canonical, diagnostic-emitting `.driving` query from a side-effect-free
`.analyzing` re-derivation. `.analyzing` routes to the new
`BridgedASTContext.testCanImport` -> `ASTContext::testImportModule` bridge,
which answers from the module loaders without emitting diagnostics or populating
`CanImportModuleVersions`; `.driving` keeps the existing `canImport` behavior.
The mode defaults to `.analyzing`, so only the canonical site
`evaluatePoundIfCondition` drives, while every secondary walk re-derives `#if`
activity without repeating the diagnostic.
2026-06-05 10:29:15 +01:00

154 lines
7.3 KiB
Swift

// RUN: %empty-directory(%t)
// RUN: %target-typecheck-verify-swift -disable-implicit-concurrency-module-import \
// RUN: -disable-implicit-string-processing-module-import \
// RUN: -module-can-import Foo -module-can-import-version Bar 113.330.1.2 0.0 \
// RUN: -module-can-import-version Baz 113.330.1.2 113.330.1.2
func canImport() {
#if canImport(Foo)
let basicCheck = 1 // expected-warning {{initialization of immutable value 'basicCheck' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Foo, _version: 1) // expected-warning {{cannot find user version number for module 'Foo'; version number ignored}}
// An unversioned 'Foo' causes versioned queries to evaluate to 'true'
let versionCheck = 1 // expected-warning {{initialization of immutable value 'versionCheck' was never used; consider replacing with assignment to '_' or removing it}}
#endif
}
func canImportVersioned() {
#if canImport(Bar, _version: 0)
let majorZero = 1 // expected-warning {{initialization of immutable value 'majorZero' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 112)
let majorSmaller = 1 // expected-warning {{initialization of immutable value 'majorSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113)
let majorEqual = 1 // expected-warning {{initialization of immutable value 'majorEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 114)
let majorLarger = 1
#endif
#if canImport(Bar, _version: 113.329)
let minorSmaller = 1 // expected-warning {{initialization of immutable value 'minorSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113.330)
let minorEqual = 1 // expected-warning {{initialization of immutable value 'minorEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113.331)
let minorLarger = 1
#endif
#if canImport(Bar, _version: 113.330.0)
let patchSmaller = 1 // expected-warning {{initialization of immutable value 'patchSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113.330.1)
let patchEqual = 1 // expected-warning {{initialization of immutable value 'patchEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113.330.2)
let patchLarger = 1
#endif
#if canImport(Bar, _version: 113.330.1.1)
let buildSmaller = 1 // expected-warning {{initialization of immutable value 'buildSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113.330.1.2)
let buildEqual = 1 // expected-warning {{initialization of immutable value 'buildEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113.330.1.3)
let buildLarger = 1
#endif
#if canImport(Bar, _version: 113.330.1.2.0)
let extraComponent = 1 // expected-warning {{initialization of immutable value 'extraComponent' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _version: 113.330.1.2.0.0) // expected-warning {{trailing components of version '113.330.1.2.0' are ignored}}
let extraExtraComponent = 1 // expected-warning {{initialization of immutable value 'extraExtraComponent' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar, _underlyingVersion: 113.33) // expected-warning{{cannot find user version number for Clang module 'Bar'; version number ignored}}
// Bar is an unversioned Swift module with no underlying clang module.
let underlyingMinorSmaller = 1 // expected-warning {{initialization of immutable value 'underlyingMinorSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Bar)
let noVersion = 1 // expected-warning {{initialization of immutable value 'noVersion' was never used; consider replacing with assignment to '_' or removing it}}
#endif
}
func canImportUnderlyingVersion() {
#if canImport(Baz, _underlyingVersion: 0)
let majorZero = 1 // expected-warning {{initialization of immutable value 'majorZero' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 112)
let majorSmaller = 1 // expected-warning {{initialization of immutable value 'majorSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113)
let majorEqual = 1 // expected-warning {{initialization of immutable value 'majorEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 114)
let majorLarger = 1
#endif
#if canImport(Baz, _underlyingVersion: 113.329)
let minorSmaller = 1 // expected-warning {{initialization of immutable value 'minorSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113.330)
let minorEqual = 1 // expected-warning {{initialization of immutable value 'minorEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113.331)
let minorLarger = 1
#endif
#if canImport(Baz, _underlyingVersion: 113.330.0)
let patchSmaller = 1 // expected-warning {{initialization of immutable value 'patchSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113.330.1)
let patchEqual = 1 // expected-warning {{initialization of immutable value 'patchEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113.330.2)
let patchLarger = 1
#endif
#if canImport(Baz, _underlyingVersion: 113.330.1.1)
let buildSmaller = 1 // expected-warning {{initialization of immutable value 'buildSmaller' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113.330.1.2)
let buildEqual = 1 // expected-warning {{initialization of immutable value 'buildEqual' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113.330.1.3)
let buildLarger = 1
#endif
#if canImport(Baz, _underlyingVersion: 113.330.1.2.0)
let extraComponent = 1 // expected-warning {{initialization of immutable value 'extraComponent' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _underlyingVersion: 113.330.1.2.0.0) // expected-warning {{trailing components of version '113.330.1.2.0' are ignored}}
let extraExtraComponent = 1 // expected-warning {{initialization of immutable value 'extraExtraComponent' was never used; consider replacing with assignment to '_' or removing it}}
#endif
#if canImport(Baz, _version: 113.33)
let version = 1 // expected-warning {{initialization of immutable value 'version' was never used; consider replacing with assignment to '_' or removing it}}
#endif
}