Files
swift-mirror/validation-test/ClangImporter/bridging-header-reentrancy.swift
Jordan Rose e42dd5ac08 [ClangImporter] Protect against re-entrant bridging header loading (#27045)
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
2019-09-05 17:00:14 -07:00

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'}}