// RUN: %target-swift-frontend -primary-file %s -O -sil-verify-all -module-name=test -emit-sil | %FileCheck %s // Make a runtime test to check that the values are correct. // RUN: %empty-directory(%t) // RUN: %target-build-swift -O -module-name=test %s -o %t/a.out // RUN: %target-codesign %t/a.out // RUN: %target-run %t/a.out | %FileCheck %s -check-prefix=CHECK-OUTPUT // REQUIRES: executable_test,optimized_stdlib // REQUIRES: swift_in_compiler struct S { var i: Int var b: Int8 // CHECK-LABEL: sil_global hidden [let] @$s4test1SV4sizeSivpZ : $Int = { // CHECK-NEXT: integer_literal static let size = MemoryLayout.size // CHECK-LABEL: sil_global hidden [let] @$s4test1SV9alignmentSivpZ : $Int = { // CHECK-NEXT: integer_literal static let alignment = MemoryLayout.alignment // CHECK-LABEL: sil_global hidden [let] @$s4test1SV6strideSivpZ : $Int = { // CHECK-NEXT: integer_literal static let stride = MemoryLayout.stride static let doubleSize = MemoryLayout.size * 2 } // CHECK-LABEL: sil @$s4test14noConstantSizeySixmlF // CHECK: builtin "sizeof" // CHECK: } // end sil function '$s4test14noConstantSizeySixmlF' public func noConstantSize(_ t: T.Type) -> Int { return MemoryLayout.size } // It's important to not constant propagate here to make sure that we are comparing // SIL constant propagated values with IRGen values. // CHECK-LABEL: sil {{.*}} @$s4test7getSizeySixmlF // CHECK: builtin "sizeof" // CHECK: } // end sil function '$s4test7getSizeySixmlF' @_optimize(none) func getSize(_ t: T.Type) -> Int { return MemoryLayout.size } // CHECK-LABEL: sil {{.*}} @$s4test12getAlignmentySixmlF // CHECK: builtin "alignof" // CHECK: } // end sil function '$s4test12getAlignmentySixmlF' @_optimize(none) func getAlignment(_ t: T.Type) -> Int { return MemoryLayout.alignment } // CHECK-LABEL: sil {{.*}} @$s4test9getStrideySixmlF // CHECK: builtin "strideof" // CHECK: } // end sil function '$s4test9getStrideySixmlF' @_optimize(none) func getStride(_ t: T.Type) -> Int { return MemoryLayout.stride } @inline(never) func testit() { // CHECK-OUTPUT: size: true print("size: \(S.size == getSize(S.self))") // CHECK-OUTPUT: alignment: true print("alignment: \(S.alignment == getAlignment(S.self))") // CHECK-OUTPUT: stride: true print("stride: \(S.stride == getStride(S.self))") // CHECK-OUTPUT: doubleSize: true print("doubleSize: \(S.doubleSize == getSize(S.self) * 2)") // CHECK-OUTPUT: metatype-size-1: true print("metatype-size-1: \(MemoryLayout.size == MemoryLayout.size)") // CHECK-OUTPUT: metatype-size-2: true print("metatype-size-2: \(getSize(S.Type.self) == MemoryLayout.size)") // CHECK-OUTPUT: metatype-alignment: true print("metatype-alignment: \(getAlignment(S.Type.self) == MemoryLayout.alignment)") // CHECK-OUTPUT: metatype-stride: true print("metatype-stride: \(getStride(S.Type.self) == MemoryLayout.stride)") } testit()