mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Also, add a third [serializable] state for functions whose bodies we *can* serialize, but only do so if they're referenced from another serialized function. This will be used for bodies synthesized for imported definitions, such as init(rawValue:), etc, and various thunks, but for now this change is NFC.
213 lines
6.0 KiB
Swift
213 lines
6.0 KiB
Swift
// RUN: %target-swift-frontend -emit-silgen -emit-verbose-sil %s | %FileCheck %s
|
|
|
|
// Test that the attribute gets set on default argument generators.
|
|
@_transparent func transparentFuncWithDefaultArgument (x: Int = 1) -> Int {
|
|
return x
|
|
}
|
|
func useTransparentFuncWithDefaultArgument() -> Int {
|
|
return transparentFuncWithDefaultArgument();
|
|
|
|
// CHECK-LABEL: sil hidden @_T021transparent_attribute37useTransparentFuncWithDefaultArgumentSiyF
|
|
// CHECK: apply {{.*}} line:8:44
|
|
// CHECK: apply {{.*}} line:8:10
|
|
// CHECK: return
|
|
|
|
}
|
|
|
|
func transparentFuncWithoutDefaultArgument (x: Int = 1) -> Int {
|
|
return x
|
|
}
|
|
func useTransparentFuncWithoutDefaultArgument() -> Int {
|
|
return transparentFuncWithoutDefaultArgument();
|
|
|
|
// CHECK-LABEL: sil hidden @_T021transparent_attribute40useTransparentFuncWithoutDefaultArgumentSiyF
|
|
// CHECK: apply {{.*}} line:21:47
|
|
// CHECK-NOT: transparent
|
|
// CHECK: apply {{.*}} line:21:10
|
|
// CHECK: return
|
|
|
|
}
|
|
|
|
// Make sure the transparent attribute is set on constructors (allocating and initializing).
|
|
struct StructWithTranspConstructor {
|
|
@_transparent init () {}
|
|
}
|
|
func testStructWithTranspConstructor() -> StructWithTranspConstructor {
|
|
return StructWithTranspConstructor()
|
|
|
|
// transparent_attribute.StructWithTranspConstructor.constructor
|
|
// CHECK-APPLY: sil hidden @_T021transparent_attribute27StructWithTranspConstructorV{{[_0-9a-zA-Z]*}}fC
|
|
|
|
// testStructWithTranspConstructor
|
|
// CHECK-APPLY: _T21transparent_attribute31testStructWithTranspConstructorFT_VS_27StructWithTranspConstructor
|
|
// CHECK: apply {{.*}} line:36:10
|
|
|
|
}
|
|
|
|
struct MySt {}
|
|
var _x = MySt()
|
|
var x1 : MySt {
|
|
@_transparent
|
|
get {
|
|
return _x
|
|
}
|
|
@_transparent
|
|
set {
|
|
_x = newValue
|
|
}
|
|
}
|
|
var x2 : MySt {
|
|
@_transparent
|
|
set(v) {
|
|
_x = v
|
|
}
|
|
@_transparent
|
|
get {
|
|
return _x
|
|
}
|
|
}
|
|
func testProperty(z: MySt) {
|
|
x1 = z
|
|
x2 = z
|
|
var m1 : MySt = x1
|
|
var m2 : MySt = x2
|
|
// CHECK-APPLY: sil hidden @_T021transparent_attribute12testPropertyyAA4MyStV1z_tF
|
|
// CHECK: function_ref @_T021transparent_attribute2x1AA4MyStVfs
|
|
// CHECK-NEXT: apply
|
|
// CHECK: function_ref @_T021transparent_attribute2x2AA4MyStVfs
|
|
// CHECK-NEXT: apply
|
|
// CHECK: function_ref @_T021transparent_attribute2x1AA4MyStVfg
|
|
// CHECK-NEXT: apply
|
|
// CHECK: function_ref @_T021transparent_attribute2x2AA4MyStVfg
|
|
// CHECK-NEXT: apply
|
|
}
|
|
|
|
var _tr2 = MySt()
|
|
var _tr3 = MySt()
|
|
struct MyTranspStruct {}
|
|
extension MyTranspStruct {
|
|
@_transparent
|
|
init(input : MySt) {}
|
|
mutating
|
|
func tr1() {}
|
|
var tr2: MySt {
|
|
get {
|
|
return _tr2
|
|
}
|
|
set {
|
|
_tr2 = newValue
|
|
}
|
|
}
|
|
}
|
|
|
|
extension MyTranspStruct {
|
|
@_transparent
|
|
var tr3: MySt {
|
|
get {
|
|
return _tr3
|
|
}
|
|
set {
|
|
_tr3 = newValue
|
|
}
|
|
}
|
|
}
|
|
|
|
func testStructExtension() {
|
|
var c : MyTranspStruct = MyTranspStruct(input: _x)
|
|
c.tr1()
|
|
var s : MySt = c.tr2
|
|
var t : MySt = c.tr3
|
|
// CHECK-APPLY: sil hidden @_TF21transparent_attribute13testStructExtensionFT_T_
|
|
// CHECK: [[INIT:%[0-9]+]] = function_ref @_T021transparent_attribute14MyTranspStructV{{[_0-9a-zA-Z]*}}fC
|
|
// CHECK: apply [[INIT]]
|
|
// CHECK: [[TR1:%[0-9]+]] = function_ref @_T021transparent_attribute14MyTranspStructV3tr1{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: apply [[TR1]]
|
|
// CHECK: [[TR2:%[0-9]+]] = function_ref @_T021transparent_attribute14MyTranspStructV3tr2AA0C2StVfg
|
|
// CHECK: apply [[TR2]]
|
|
// CHECK: [[TR3:%[0-9]+]] = function_ref @_T021transparent_attribute14MyTranspStructV3tr3AA0C2StVfg
|
|
// CHECK: apply [[TR3]]
|
|
}
|
|
|
|
enum MyEnum {
|
|
case onetransp
|
|
case twotransp
|
|
}
|
|
|
|
extension MyEnum {
|
|
@_transparent
|
|
func tr3() {}
|
|
}
|
|
|
|
func testEnumExtension() {
|
|
MyEnum.onetransp.tr3()
|
|
// CHECK-APPLY: sil hidden @_T021transparent_attribute17testEnumExtensionyyF
|
|
// CHECK: [[TR3:%[0-9]+]] = function_ref @_T021transparent_attribute6MyEnumO3tr3{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: [[INIT:%[0-9]+]] = enum $MyEnum, #MyEnum.onetransp!enumelt
|
|
// CHECK: apply [[TR3]]([[INIT]])
|
|
}
|
|
|
|
struct testVarDecl {
|
|
@_transparent var max: Int {
|
|
get {
|
|
return 0xFF
|
|
}
|
|
mutating
|
|
set {
|
|
max = 0xFF
|
|
}
|
|
}
|
|
func testVarDeclFoo () {
|
|
var z: Int = max
|
|
// CHECK-APPLY: sil hidden @_T021transparent_attribute11testVarDeclV0cdE3Foo{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: [[TR4:%[0-9]+]] = function_ref @_T021transparent_attribute11testVarDeclV3maxSifg
|
|
// CHECK: apply [[TR4]]
|
|
}
|
|
}
|
|
|
|
struct testVarDeclShortenedSyntax {
|
|
@_transparent static var max: Int { return 0xFF };
|
|
func testVarDeclShortenedSyntaxfoo () {
|
|
var z: Int = testVarDeclShortenedSyntax.max
|
|
// CHECK-APPLY: sil hidden @_T021transparent_attribute26testVarDeclShortenedSyntaxV0cdeF9Syntaxfoo{{[_0-9a-zA-Z]*}}F
|
|
// CHECK: [[TR5:%[0-9]+]] = function_ref @_T021transparent_attribute26testVarDeclShortenedSyntaxV3maxSifgZ
|
|
// CHECK: apply [[TR5]]
|
|
}
|
|
};
|
|
|
|
@_transparent var transparentOnGlobalVar: Int {
|
|
get {
|
|
return 0xFF
|
|
}
|
|
}
|
|
// CHECK: sil hidden [transparent] @_T021transparent_attribute0A11OnGlobalVarSifg
|
|
|
|
// Local functions in transparent context are fragile.
|
|
@_transparent public func foo() {
|
|
// CHECK-LABEL: sil shared [serialized] @_T021transparent_attribute3fooyyF3barL_yyF : $@convention(thin) () -> ()
|
|
func bar() {}
|
|
bar()
|
|
|
|
// CHECK-LABEL: sil shared [serialized] @_T021transparent_attribute3fooyyFyycfU_ : $@convention(thin) () -> () {
|
|
let f: () -> () = {}
|
|
f()
|
|
|
|
// CHECK-LABEL: sil shared [serialized] @_T021transparent_attribute3fooyyF3zimL_yyF : $@convention(thin) () -> () {
|
|
func zim() {
|
|
// CHECK-LABEL: sil shared [serialized] @_T021transparent_attribute3fooyyF3zimL_yyF4zangL_yyF : $@convention(thin) () -> () {
|
|
func zang() {
|
|
}
|
|
zang()
|
|
}
|
|
zim()
|
|
}
|
|
|
|
|
|
// Check that @_versioned entities have public linkage.
|
|
// CHECK-LABEL: sil @_T021transparent_attribute25referencedFromTransparentyyF : $@convention(thin) () -> () {
|
|
@_versioned func referencedFromTransparent() {}
|
|
|
|
// CHECK-LABEL: sil [transparent] [serialized] @_T021transparent_attribute23referencesVersionedFuncyycyF : $@convention(thin) () -> @owned @callee_owned () -> () {
|
|
@_transparent public func referencesVersionedFunc() -> () -> () {
|
|
return referencedFromTransparent
|
|
}
|