|
| 1 | +// This elaborate test ensures that @_implementationOnly with Embedded Swift |
| 2 | +// can hide some dependencies if you are very, very careful. |
| 3 | + |
| 4 | +// RUN: %empty-directory(%t) |
| 5 | +// RUN: mkdir -p %t/Dependencies |
| 6 | +// RUN: mkdir -p %t/Files |
| 7 | +// RUN: mkdir -p %t/Modules |
| 8 | + |
| 9 | +// Copy Swift file + C header + module map into a separate directory we'll use |
| 10 | +// when building the module whose implementation we want to hide. |
| 11 | +// RUN: cp %S/Inputs/SwiftDependency.swift %t/Dependencies/ |
| 12 | +// RUN: cp %S/Inputs/CHeader.h %t/Dependencies/ |
| 13 | +// RUN: cp %S/Inputs/module.modulemap %t/Dependencies/ |
| 14 | + |
| 15 | +// RUN: split-file %s %t/Files |
| 16 | + |
| 17 | +// Compile the Swift dependencies into that same location. |
| 18 | +// RUN: %target-swift-frontend -parse-as-library -emit-module %t/Dependencies/SwiftDependency.swift -enable-experimental-feature Embedded -o %t/Dependencies/SwiftDependency.swiftmodule |
| 19 | + |
| 20 | +// Build the library (which is supposed to encapsulate those dependencies) |
| 21 | +// against the dependencies. |
| 22 | +// RUN: %target-swift-frontend -parse-as-library -emit-module %t/Files/Library.swift -enable-experimental-feature Embedded -I %t/Dependencies/ -o %t/Modules/Library.swiftmodule |
| 23 | + |
| 24 | +// Remove the dependencies so there is no way we can find them later. |
| 25 | +// RUN: rm -rf %t/Dependencies |
| 26 | + |
| 27 | +// Build the application against the library. This is expected to work because |
| 28 | +// @_neverEmitIntoClient hides the body of test(). |
| 29 | +// RUN: %target-swift-frontend -emit-ir -parse-as-library %t/Files/Application.swift -enable-experimental-feature Embedded -I %t/Modules -o %t/Application.ir |
| 30 | + |
| 31 | +// Build the application against the library, but intentionally trigger |
| 32 | +// deserialization of some serialized SIL that refers to an implementation-only |
| 33 | +// dependency. Right now, these fail spectacularly. Over time, we want them to |
| 34 | +// become compile-time errors or start working. |
| 35 | +// RUN: not --crash %target-swift-frontend -emit-ir -parse-as-library %t/Files/Application.swift -enable-experimental-feature Embedded -I %t/Modules -o %t/Application.ir -DBAD_C_USAGE |
| 36 | +// RUN: not --crash %target-swift-frontend -emit-ir -parse-as-library %t/Files/Application.swift -enable-experimental-feature Embedded -I %t/Modules -o %t/Application.ir -DBAD_SWIFT_USAGE |
| 37 | + |
| 38 | +// REQUIRES: swift_in_compiler |
| 39 | +// REQUIRES: swift_feature_Embedded |
| 40 | + |
| 41 | +//--- Library.swift |
| 42 | +@_implementationOnly import CDependency |
| 43 | +@_implementationOnly import SwiftDependency |
| 44 | + |
| 45 | +@_neverEmitIntoClient |
| 46 | +public func test() { |
| 47 | + _ = getPoint(3.14159, 2.71828) |
| 48 | + A().doSomething() |
| 49 | +} |
| 50 | + |
| 51 | +public func badCLibraryUsage() { |
| 52 | + _ = getPoint(3.14159, 2.71828) |
| 53 | +} |
| 54 | + |
| 55 | +public func badSwiftLibraryUsage() { |
| 56 | + A().doSomething() |
| 57 | +} |
| 58 | + |
| 59 | +//--- Application.swift |
| 60 | + |
| 61 | +import Library |
| 62 | + |
| 63 | +public func useTest() { |
| 64 | + test() |
| 65 | + |
| 66 | +#if BAD_C_USAGE |
| 67 | + badCLibraryUsage() |
| 68 | +#endif |
| 69 | + |
| 70 | +#if BAD_SWIFT_USAGE |
| 71 | + badSwiftLibraryUsage() |
| 72 | +#endif |
| 73 | +} |
0 commit comments