mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
If, while loading a bridging header, we pick up a Clang module that claims to have an overlay Swift module, and that Swift module turns out to have a bridging header, we can end up reallocating the array of modules to process while we're looping over it. Be defensive against this occurrence. This just fixes a crash; it does not at all solve the problem of this being broken in several ways: - Accidentally naming your module the same as a system module shadows the latter (if the system module is a Swift module) or *makes your module into an overlay* (if the system module is a Clang module). - Bridging headers are only officially supported on executable targets and unit tests, but this isn't really enforced. - Implicit inclusion of a bridging header *when you import a Swift module* is a hack to begin with, and a hack that worsens when the main module also has a bridging header. (All the bridging headers get folded together into the "same" module, which leads to more visibility than desired as well as cycles in the import graph.) - Combining all of these can result in some pretty bizarre behavior. rdar://problem/54581756
18 lines
1.1 KiB
Swift
18 lines
1.1 KiB
Swift
// rdar://problem/54581756
|
|
// RUN: %empty-directory(%t)
|
|
|
|
// First set up an app-like target with the same name as a system module. Make
|
|
// sure the bridging header has a bunch of extra imports to force the
|
|
// SmallVector 'ImportedHeaderExports' in ClangImporter::Implementation to be
|
|
// reallocated.
|
|
// RUN: %target-swift-frontend -sdk "" -emit-module -o %t -import-objc-header %S/Inputs/bridging-header-reentrancy/App-Bridging-Header.h -I %S/Inputs/bridging-header-reentrancy -module-name CoincidentalNameCollision %S/Inputs/bridging-header-reentrancy/CoincidentalNameCollision.swift
|
|
|
|
// Then import that app-like target by accident in another target that also has
|
|
// a bridging header and a bunch of imports.
|
|
// RUN: %target-typecheck-verify-swift -sdk "" -I %t -import-objc-header %S/Inputs/bridging-header-reentrancy/Main-Bridging-Header.h -I %S/Inputs/bridging-header-reentrancy -verify-ignore-unknown
|
|
|
|
mainBridgingHeaderLoaded() // ok, expected
|
|
appBridgingHeaderLoaded() // ok, accidentally loaded
|
|
CNCTest() // error, accidentally shadowed
|
|
// expected-error@-1 {{use of unresolved identifier 'CNCTest'}}
|