Skip to content

Commit 31b9b4b

Browse files
author
Harlan Haskins
committed
Test to ensure interface files preserve type layout
1 parent aaecce9 commit 31b9b4b

File tree

2 files changed

+87
-24
lines changed

2 files changed

+87
-24
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// Check that importing this module creates the right types
4+
5+
// RUN: %target-swift-frontend -emit-interface-path %t/private-stored-members.swiftinterface -module-name PrivateStoredMembers -emit-module -o %t/PrivateStoredMembers.swiftmodule %S/private-stored-members.swift
6+
// RUN: %target-swift-frontend -emit-ir %s -I %t 2>&1 -DSHOULD_IMPORT | %FileCheck %s --check-prefix CHECK-EXEC --check-prefix CHECK
7+
8+
// Check that the types are also correct when importing a module created from an interface
9+
10+
// RUN: %target-swift-frontend -emit-module -o %t/PrivateStoredMembers.swiftmodule -module-name PrivateStoredMembers %t/private-stored-members.swiftinterface -disable-objc-attr-requires-foundation-module
11+
// RUN: %target-swift-frontend -emit-ir %s -I %t 2>&1 -DSHOULD_IMPORT | %FileCheck %s --check-prefix CHECK-EXEC --check-prefix CHECK
12+
13+
// Check the types generated when the source file is the primary file, and ensure they're the same layout.
14+
15+
// RUN: %target-swift-frontend -emit-ir %S/private-stored-members.swift %s 2>&1 -module-name main | %FileCheck %s --check-prefix CHECK-MAIN --check-prefix CHECK-EXEC
16+
17+
// These two appear out-of-order between run lines
18+
19+
// CHECK-DAG: [[MYCLASS:%T20PrivateStoredMembers7MyClassC]] = type opaque
20+
// CHECK-DAG: [[MYSTRUCT:%T20PrivateStoredMembers8MyStructV]] = type <{ %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V }>
21+
22+
// CHECK-MAIN-DAG: [[MYCLASS:%T4main7MyClassC]] = type <{ %swift.refcounted, %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V }>
23+
// CHECK-MAIN-DAG: [[MYSTRUCT:%T4main8MyStructV]] = type <{ %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V, %TSb, [7 x i8], %Ts5Int64V }>
24+
25+
#if SHOULD_IMPORT
26+
import PrivateStoredMembers
27+
#endif
28+
29+
// CHECK-EXEC: define swiftcc void @"$S{{[^ ]+}}8makeUseryyF"() #0 {
30+
public func makeUser() {
31+
let ptr = UnsafeMutablePointer<MyStruct>.allocate(capacity: 1)
32+
// CHECK-EXEC: %.publicEndVar = getelementptr inbounds [[MYSTRUCT]], [[MYSTRUCT]]* %{{[0-9]+}}, i32 0, i32 [[PUBLIC_END_VAR_IDX:9]]
33+
// CHECK-EXEC: %.publicEndVar._value = getelementptr inbounds %Ts5Int64V, %Ts5Int64V* %.publicEndVar, i32 0, i32 0
34+
// CHECK-EXEC: store i64 4, i64* %.publicEndVar._value
35+
ptr.pointee.publicEndVar = 4
36+
37+
// CHECK-EXEC: %.publicEndVar1 = getelementptr inbounds [[MYSTRUCT]], [[MYSTRUCT]]* %{{[0-9]+}}, i32 0, i32 [[PUBLIC_END_VAR_IDX]]
38+
// CHECK-EXEC: %.publicEndVar1._value = getelementptr inbounds %Ts5Int64V, %Ts5Int64V* %.publicEndVar1, i32 0, i32 0
39+
// CHECK-EXEC: [[PUBLIC_END_VAR_LOAD:%[0-9]+]] = load i64, i64* %.publicEndVar1._value, align 8
40+
41+
// CHECK-EXEC: %.publicVar = getelementptr inbounds [[MYSTRUCT]], [[MYSTRUCT]]* %{{[0-9]+}}, i32 0, i32 0
42+
// CHECK-EXEC: %.publicVar._value = getelementptr inbounds %Ts5Int64V, %Ts5Int64V* %.publicVar, i32 0, i32 0
43+
// CHECK-EXEC: store i64 [[PUBLIC_END_VAR_LOAD]], i64* %.publicVar._value, align 8
44+
ptr.pointee.publicVar = ptr.pointee.publicEndVar
45+
ptr.deallocate()
46+
47+
// CHECK-EXEC: %[[MYCLASS_INIT:[0-9]+]] = call swiftcc [[MYCLASS]]* @"$S{{[^ ]+}}7MyClassCACycfC"(%swift.type* swiftself %{{[0-9]+}})
48+
let myClass = MyClass()
49+
50+
// These are uninteresting as they just call into the standard getter and setter.
51+
myClass.publicEndVar = 4
52+
myClass.publicVar = myClass.publicEndVar
53+
}

test/ModuleInterface/private-stored-members.swift

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,39 +16,43 @@
1616
// CHECK: struct MyStruct {{{$}}
1717
// RESILIENT: struct MyStruct {{{$}}
1818
public struct MyStruct {
19-
// CHECK-NEXT: var publicVar: Int{{$}}
20-
// RESILIENT-NEXT: var publicVar: Int{{$}}
21-
public var publicVar: Int
19+
// CHECK-NEXT: var publicVar: Int64{{$}}
20+
// RESILIENT-NEXT: var publicVar: Int64{{$}}
21+
public var publicVar: Int64
2222

2323
// CHECK-NEXT: let publicLet: Bool{{$}}
2424
// RESILIENT-NEXT: let publicLet: Bool{{$}}
2525
public let publicLet: Bool
2626

27-
// CHECK-NEXT: internal var _: String{{$}}
28-
// RESILIENT-NOT: internal var _: String{{$}}
29-
var internalVar: String
27+
// CHECK-NEXT: internal var _: Int64{{$}}
28+
// RESILIENT-NOT: internal var _: Int64{{$}}
29+
var internalVar: Int64
3030

3131
// CHECK-NEXT: internal let _: Bool{{$}}
3232
// RESILIENT-NOT: internal let _: Bool{{$}}
3333
let internalLet: Bool
3434

35-
// CHECK-NEXT: private var _: String{{$}}
36-
// RESILIENT-NOT: private var _: String{{$}}
37-
private var privateVar: String
35+
// CHECK-NEXT: private var _: Int64{{$}}
36+
// RESILIENT-NOT: private var _: Int64{{$}}
37+
private var privateVar: Int64
3838

3939
// CHECK-NEXT: private let _: Bool{{$}}
4040
// RESILIENT-NOT: private let _: Bool{{$}}
4141
private let privateLet: Bool
4242

4343
// CHECK-NOT: private var
4444
// RESILIENT-NOT: private var
45-
private var computedPrivateVar: String {
46-
return "computedPrivateVar"
45+
private var computedPrivateVar: Int64 {
46+
return 0
4747
}
4848

4949
// CHECK-NOT: private static var
5050
// RESILIENT-NOT: private static var
51-
private static var staticPrivateVar: String = ""
51+
private static var staticPrivateVar: Int64 = 0
52+
53+
// CHECK-NEXT: var publicEndVar: Int64{{$}}
54+
// RESILIENT-NEXT: var publicEndVar: Int64{{$}}
55+
public var publicEndVar: Int64 = 0
5256

5357
// CHECK: }{{$}}
5458
// RESILIENT: }{{$}}
@@ -57,39 +61,45 @@ public struct MyStruct {
5761
// CHECK: class MyClass {{{$}}
5862
// RESILIENT: class MyClass {{{$}}
5963
public class MyClass {
60-
// CHECK-NEXT: var publicVar: Int{{$}}
61-
// RESILIENT-NEXT: var publicVar: Int{{$}}
62-
public var publicVar: Int = 0
64+
// CHECK-NEXT: var publicVar: Int64{{$}}
65+
// RESILIENT-NEXT: var publicVar: Int64{{$}}
66+
public var publicVar: Int64 = 0
6367

6468
// CHECK-NEXT: let publicLet: Bool{{$}}
6569
// RESILIENT-NEXT: let publicLet: Bool{{$}}
6670
public let publicLet: Bool = true
6771

68-
// CHECK-NEXT: internal var _: String{{$}}
69-
// RESILIENT-NOT: internal var _: String{{$}}
70-
var internalVar: String = ""
72+
// CHECK-NEXT: internal var _: Int64{{$}}
73+
// RESILIENT-NOT: internal var _: Int64{{$}}
74+
var internalVar: Int64 = 0
7175

7276
// CHECK-NEXT: internal let _: Bool{{$}}
7377
// RESILIENT-NOT: internal let _: Bool{{$}}
7478
let internalLet: Bool = true
7579

76-
// CHECK-NEXT: private var _: String{{$}}
77-
// RESILIENT-NOT: private var _: String{{$}}
78-
private var privateVar: String = ""
80+
// CHECK-NEXT: private var _: Int64{{$}}
81+
// RESILIENT-NOT: private var _: Int64{{$}}
82+
private var privateVar: Int64 = 0
7983

8084
// CHECK-NEXT: private let _: Bool{{$}}
8185
// RESILIENT-NOT: private let _: Bool{{$}}
8286
private let privateLet: Bool = true
8387

8488
// CHECK-NOT: private var
8589
// RESILIENT-NOT: private var
86-
private var computedPrivateVar: String {
87-
return "computedPrivateVar"
90+
private var computedPrivateVar: Int64 {
91+
return 0
8892
}
8993

9094
// CHECK-NOT: private static var
9195
// RESILIENT-NOT: private static var
92-
private static var staticPrivateVar: String = ""
96+
private static var staticPrivateVar: Int64 = 0
97+
98+
// CHECK-NEXT: var publicEndVar: Int64{{$}}
99+
// RESILIENT-NEXT: var publicEndVar: Int64{{$}}
100+
public var publicEndVar: Int64 = 0
101+
102+
public init() {}
93103

94104
// CHECK: }{{$}}
95105
// RESILIENT: }{{$}}

0 commit comments

Comments
 (0)