| // 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 |
| } |