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 87 88 89 90 91 92
|
// RUN: %target-swift-frontend %s -O -Xllvm -sil-print-after=loadable-address -c -o %t/t.o 2>&1 | %FileCheck %s
// XFAIL: OS=windows-msvc
public struct LargeThing {
var s0 : String = ""
var s1 : String = ""
var s2 : String = ""
var s3 : String = ""
var s4 : String = ""
var s5 : String = ""
var s6 : String = ""
var s7 : String = ""
var s8 : String = ""
public init() {}
mutating func setThirdString(_ to: String) {
s2 = to
}
var thirdString : String {
return s2
}
}
public struct Container {
public var field : LargeThing
public var field2 : LargeThing
public init(_ l: LargeThing, _ l2: LargeThing) {
field = l
field2 = l2
}
}
public struct Container2 {
public var field : Container
public var field2: Container
public var field3: LargeThing?
public init(_ b: Bool, _ l: LargeThing, _ l2: LargeThing) {
if b {
let t = Container(l, l2)
let t2 = Container(l2, l)
field2 = t2
field = t
field3 = t.field
} else {
let t = Container(l, l2)
let t2 = Container(l2, l)
field = t2
field2 = t
field3 = t2.field2
}
}
public func testLargeThing() {
if let x = field3 {
print("hello \(x)")
}
}
}
// CHECK: sil @$s1t10LargeThingVACycfC : $@convention(method) (@thin LargeThing.Type) -> @out LargeThing {
// CHECK: bb0(%0 : $*LargeThing, %1 : $@thin LargeThing.Type):
// CHECK: [[T0:%.*]] = alloc_stack $LargeThing
// CHECK: [[T2:%.*]] = struct_element_addr [[T0]] : $*LargeThing, #LargeThing.s0
// CHECK: store {{.*}} to [[T2]] : $*String
// CHECK: copy_addr [take] [[T0]] to [init] %0 : $*LargeThing
// CHECK: } // end sil function '$s1t10LargeThingVACycfC'
// CHECK: sil [transparent] @$s1t9ContainerV5fieldAA10LargeThingVvg : $@convention(method) (@in_guaranteed Container) -> @out LargeThing {
// CHECK: bb0(%0 : $*LargeThing, %1 : $*Container):
// CHECK: [[T0:%.*]] = struct_element_addr %1 : $*Container, #Container.field
// CHECK: copy_addr [[T0]] to [init] %0 : $*LargeThing
// CHECK: } // end sil function '$s1t9ContainerV5fieldAA10LargeThingVvg'
// CHECK: sil [transparent] @$s1t10Container2V5fieldAA9ContainerVvs : $@convention(method) (@in Container, @inout Container2) -> () {
// CHECK: bb0(%0 : $*Container, %1 : $*Container2):
// CHECK: [[T0:%.*]] = struct_element_addr %1 : $*Container2, #Container2.field
// CHECK: copy_addr [take] %0 to [[T0]] : $*Container
// CHECK: } // end sil function '$s1t10Container2V5fieldAA9ContainerVvs'
// CHECK: sil @$s1t10Container2VyACSb_AA10LargeThingVAEtcfC :
// CHECK: [[T0:%.*]] = init_enum_data_addr [[T2:%.*]] : $*Optional<LargeThing>, #Optional.some!enumelt
// CHECK: copy_addr [take] {{.*}} to [init] [[T0]] : $*LargeThing
// CHECK: inject_enum_addr [[T2]] : $*Optional<LargeThing>, #Optional.some!enumelt
// CHECK: } // end sil function '$s1t10Container2VyACSb_AA10LargeThingVAEtcfC
|