mirror of
https://github.com/apple/swift.git
synced 2026-09-30 10:17:34 +02:00
`#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.
154 lines
7.3 KiB
Swift
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
|
|
}
|