1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
// '@_private import' is intended to be used to compile "thunks" which contain
// modified versions of declarations. For this to work properly, name lookup
// needs to favor declarations in the private import over other imports. This
// emulates the increased visibility of same-module declarations in the original
// file, preserving source compatibility as much as possible.
//
// In this test:
//
// * Module Host contains this file and Host.swift. Note that this file compiles
// successfully with COMPILING_THUNK undefined.
// * This file is also built as a thunk with COMPILING_THUNK defined to "edit"
// it.
// * We also build three other modules called Most, Ghost, and Toast. Each of
// these is imported by both Host and the thunk.
//
// There are various same-name types scattered throughout these modules. If
// name lookup selects the right ones for each of the test cases, the compiler
// will generate the expected diagnostics and the test will pass. If it selects
// incorrect types, deprecation warnings will be emitted and the test will fail.
// We'll put our modules here.
// RUN: %empty-directory(%t)
// Build some libraries to work with.
// RUN: %target-swift-frontend -emit-module -parse-as-library -module-name Most -emit-module-path %t/Most.swiftmodule -primary-file %S/Inputs/private_import/Most.swift
// RUN: %target-swift-frontend -emit-module -parse-as-library -module-name Ghost -emit-module-path %t/Ghost.swiftmodule -primary-file %S/Inputs/private_import/Ghost.swift
// RUN: %target-swift-frontend -emit-module -enable-private-imports -parse-as-library -module-name Toast -emit-module-path %t/Toast.swiftmodule -primary-file %S/Inputs/private_import/Toast.swift
// Build the host module that the thunk is pretending to be part of.
// RUN: %target-swift-frontend -emit-module -module-name Host -I %t -emit-module-path %t/Host.swiftmodule -enable-private-imports %s %S/Inputs/private_import/Host.swift
// Build a thunk for the host module.
// RUN: %target-typecheck-verify-swift -parse-as-library -I %t -DCOMPILING_THUNK
#if COMPILING_THUNK
@_private(sourceFile: "private_import.swift") import Host
#endif
import Most
import Ghost
@_private(sourceFile: "Toast.swift") import Toast
//
// Types with varying definitions
//
struct Hunk {} // Present in both Host and thunk
#if COMPILING_THUNK
struct Thunk {} // Only present in thunk
struct Bunk {} // Not deprecated in thunk
#else
struct Shrunk {} // Only present in Host
@available(*, deprecated, message: "got Host version")
struct Bunk {} // Only deprecated in Host
#endif
//
// Test cases
//
#if COMPILING_THUNK
func thunkCanUseTypesOnlyInThunk(_: Thunk) {}
#endif
func thunkCanRedeclareTypes(_: Hunk) {}
func thunkCanUseTypesOnlyInHost(_: Shrunk, _: Post) {}
func thunkTypesShadowHostTypes(_: Bunk) {}
func hostTypesShadowMostTypes(_: Boast) {}
// no-error@-1; previously, this would give "'Boast' is ambiguous for type lookup in this context"
#if COMPILING_THUNK
func ambiguousWithTwoNonPrivateImports(_: Coast) {}
// expected-error@-1{{'Coast' is ambiguous for type lookup in this context}}
#endif
// The intended clients of '@_private import' should not actually use it twice
// in a single file, so this behavior is more accidental than anything.
func ambiguousWithTwoPrivateImports(_: Roast) {}
// expected-error@-1{{'Roast' is ambiguous for type lookup in this context}}
|