Files
swift-mirror/test/SILOptimizer/package-cmo-swiftinterface.swift
Ellie Shin 1e5266e7b6 [PackageCMO] Don't allow modifying AST.
Currently not all types are visited in canSerialize* calls, sometimes
 resulting in an internal type getting @usableFromInline, which is
 incorrect.

 For example, for `let q = P() as? Q`, where Q is an internal class
 inherting a public class P, Q is not visited in the canSerialize*
 checks, thus resulting in `@usableFromInline class Q`; this is not
 the intended behavior in the conservative mode used by PackageCMO
 as it modifies AST.

 To properly fix, instruction visitor needs to be refactored to do
 both the "canSerialize" check (that visits all types) and serialize
 or update visibility (modify AST in non-conservative modes).

 This PR provides a short-term fix that prevents modifying AST, and
 also ensures that the generated interfaces with PackageCMO flags
 are not affected by the optimization or contain modified AST.

rdar://130292190
2024-06-25 18:15:29 -07:00

67 lines
3.1 KiB
Swift

// RUN: %empty-directory(%t)
/// First Test: Check `@_usableFromInline` is not added to types in PackageCMO mode.
// RUN: %target-swift-frontend -parse-as-library %s -O -wmo -enable-library-evolution -experimental-allow-non-resilient-access -experimental-package-cmo -module-name=Lib -package-name pkg -emit-module -o %t/Lib-package-cmo.swiftmodule
// RUN: %target-sil-opt -module-name Lib -enable-sil-verify-all %t/Lib-package-cmo.swiftmodule -o %t/Lib-package-cmo.sil
// RUN: %FileCheck %s < %t/Lib-package-cmo.sil
/// Second Test: Check .swiftinterface files with and without PackageCMO have the same decl signatures without `@_usableFromInline`.
// RUN: %target-swift-frontend -emit-module %s -I %t \
// RUN: -module-name Lib -package-name pkg \
// RUN: -enable-library-evolution -swift-version 6 \
// RUN: -emit-module-path %t/Lib.swiftmodule \
// RUN: -emit-module-interface-path %t/Lib.swiftinterface \
// RUN: -emit-private-module-interface-path %t/Lib.private.swiftinterface \
// RUN: -emit-package-module-interface-path %t/Lib.package.swiftinterface
// RUN: %FileCheck %s --check-prefixes=CHECK-PKG-INTERFACE,CHECK-INTERFACE < %t/Lib.package.swiftinterface
// RUN: %FileCheck %s --check-prefix=CHECK-INTERFACE < %t/Lib.swiftinterface
// RUN: rm -rf %t/Lib.swiftmodule
// RUN: rm -rf %t/Lib.swiftinterface
// RUN: rm -rf %t/Lib.private.swiftinterface
// RUN: rm -rf %t/Lib.package.swiftinterface
// RUN: %target-swift-frontend -emit-module %s -I %t \
// RUN: -module-name Lib -package-name pkg \
// RUN: -enable-library-evolution -swift-version 6 \
// RUN: -O -wmo \
// RUN: -experimental-allow-non-resilient-access -experimental-package-cmo \
// RUN: -emit-module-path %t/Lib.swiftmodule \
// RUN: -emit-module-interface-path %t/Lib.swiftinterface \
// RUN: -emit-private-module-interface-path %t/Lib.private.swiftinterface \
// RUN: -emit-package-module-interface-path %t/Lib.package.swiftinterface
// RUN: %FileCheck %s --check-prefixes=CHECK-PKG-INTERFACE,CHECK-INTERFACE < %t/Lib.package.swiftinterface
// RUN: %FileCheck %s --check-prefix=CHECK-INTERFACE < %t/Lib.swiftinterface
// REQUIRES: swift_in_compiler
// CHECK-NOT: @usableFromInline
final class InternalKlass: PkgKlass {
@inline(never)
override func bar() -> Int { return 13 }
}
package class PkgKlass {
@inline(never)
package func bar() -> Int { return 11 }
}
// CHECK-NOT: sil package [serialized_for_package] [noinline] [canonical] @$s3Lib3fooySiSgAA8PkgKlassCF : $@convention(thin) (@guaranteed PkgKlass) -> Optional<Int> {
// CHECK-NOT: checked_cast_br PkgKlass in {{.*}} : $PkgKlass to InternalKlass
@inline(never)
package func foo(_ arg: PkgKlass) -> Int? {
let x = arg as? InternalKlass
return x?.bar()
}
public func run() -> Int {
return PkgKlass().bar()
}
// CHECK-PKG-INTERFACE-NOT: @usableFromInline
// CHECK-INTERFACE-NOT: @usableFromInline
// CHECK-PKG-INTERFACE: package class PkgKlass {
// CHECK-PKG-INTERFACE: @inline(never) package func bar() -> Swift.Int
// CHECK-PKG-INTERFACE: @inline(never) package func foo(_ arg: Lib.PkgKlass) -> Swift.Int?
// CHECK-INTERFACE: public func run() -> Swift.Int