blob: 32d2ef18ccf8c091be198e80cf350aad66addd3c [file] [log] [blame]
// RUN: %target-sil-opt -let-properties-opt -enable-sil-verify-all %s | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
// Test initialization of a constant aggregate "let".
// <rdar://problem/45691574> [SR-9146] IBAnimatable - SILCloner crash in LetPropertiesOpt.
struct Point {
var x: Int64
var y: Int64
}
class HasCenter {
let centerPoint: Point = Point(x: 0, y: 0)
public func getCenter() -> Int64
}
sil hidden @$s19let_properties_opts5PointV1x1yACSi_SitcfC : $@convention(method) (Int64, Int64, @thin Point.Type) -> Point {
bb0(%0 : $Int64, %1 : $Int64, %2 : $@thin Point.Type):
%3 = struct $Point (%0 : $Int64, %1 : $Int64)
return %3 : $Point
}
// variable initialization expression of HasCenter.centerPoint
sil hidden [transparent] @$s19let_properties_opts9HasCenterC11centerPointAA0E0Vvpfi : $@convention(thin) () -> Point {
bb0:
%0 = integer_literal $Builtin.Int64, 0
%1 = struct $Int64 (%0 : $Builtin.Int64)
%2 = struct $Point (%1 : $Int64, %1 : $Int64)
return %2 : $Point
}
// HasCenter.centerPoint.getter
// CHECK-LABEL: sil hidden [transparent] @$s19let_properties_opts9HasCenterC11centerPointAA0E0Vvg : $@convention(method) (@guaranteed HasCenter) -> Point {
// CHECK: bb0(%0 : $HasCenter):
// CHECK: [[LIT:%.*]] = integer_literal $Builtin.Int64, 0
// CHECK: [[INT:%.*]] = struct $Int64 ([[LIT]] : $Builtin.Int64)
// CHECK: [[PNT:%.*]] = struct $Point ([[INT]] : $Int64, [[INT]] : $Int64)
// CHECK: return [[PNT]] : $Point
// CHECK-LABEL: } // end sil function '$s19let_properties_opts9HasCenterC11centerPointAA0E0Vvg'
sil hidden [transparent] @$s19let_properties_opts9HasCenterC11centerPointAA0E0Vvg : $@convention(method) (@guaranteed HasCenter) -> Point {
bb0(%0 : $HasCenter):
%1 = ref_element_addr %0 : $HasCenter, #HasCenter.centerPoint
%2 = load %1 : $*Point
return %2 : $Point
}
// HasCenter.getCenter()
// CHECK-LABEL: sil hidden @$s19let_properties_opts9HasCenterC9getCenterSiyF : $@convention(method) (@guaranteed HasCenter) -> Int64 {
// CHECK: [[LIT:%.*]] = integer_literal $Builtin.Int64, 0
// CHECK: [[INT:%.*]] = struct $Int64 ([[LIT]] : $Builtin.Int64)
// CHECK: [[PNT:%.*]] = struct $Point ([[INT]] : $Int64, [[INT]] : $Int64)
// CHECK: [[X:%.*]] = struct_extract [[PNT]] : $Point, #Point.x
// CHECK: return [[X]] : $Int64
// CHECK-LABEL: } // end sil function '$s19let_properties_opts9HasCenterC9getCenterSiyF'
sil hidden @$s19let_properties_opts9HasCenterC9getCenterSiyF : $@convention(method) (@guaranteed HasCenter) -> Int64 {
bb0(%0 : $HasCenter):
%1 = ref_element_addr %0 : $HasCenter, #HasCenter.centerPoint
%2 = struct_element_addr %1 : $*Point, #Point.x
%3 = load %2 : $*Int64
return %3 : $Int64
}
// HasCenter.init()
sil hidden @$s19let_properties_opts9HasCenterCACycfc : $@convention(method) (@owned HasCenter) -> @owned HasCenter {
bb0(%0 : $HasCenter):
%1 = integer_literal $Builtin.Int64, 0
%2 = struct $Int64 (%1 : $Builtin.Int64)
%3 = struct $Point (%2 : $Int64, %2 : $Int64)
%4 = ref_element_addr %0 : $HasCenter, #HasCenter.centerPoint
store %3 to %4 : $*Point
return %0 : $HasCenter
}