@@ -41,6 +41,16 @@ final class GenClass<T : P> : P {
41
41
}
42
42
}
43
43
44
+ class Base < T> {
45
+ final var i : Int = 12
46
+ }
47
+
48
+ class DerivedClass < T> : Base < T > {
49
+ }
50
+
51
+ final class DerivedClass2 : DerivedClass < Int > {
52
+ }
53
+
44
54
final class SimpleClass : P {
45
55
var i : Int
46
56
static var numObjs = 0
@@ -97,6 +107,33 @@ func testGenClassRead<T>(_ c: GenClass<T>) -> T {
97
107
return c [ keyPath: kp]
98
108
}
99
109
110
+ // CHECK-LABEL: sil {{.*}}testDerivedClassRead
111
+ // CHECK: [[C:%[0-9]+]] = upcast %0
112
+ // CHECK: [[E:%[0-9]+]] = ref_element_addr [[C]]
113
+ // CHECK: [[A:%[0-9]+]] = begin_access [read] [dynamic] [no_nested_conflict] [[E]]
114
+ // CHECK: [[V:%[0-9]+]] = load [[A]]
115
+ // CHECK: end_access [[A]]
116
+ // CHECK: return [[V]]
117
+ @inline ( never)
118
+ @_semantics ( " optimize.sil.specialize.generic.never " )
119
+ func testDerivedClassRead< T> ( _ c: DerivedClass < T > ) -> Int {
120
+ let kp = \DerivedClass < T > . i
121
+ return c [ keyPath: kp]
122
+ }
123
+
124
+ // CHECK-LABEL: sil {{.*}}testDerivedClass2Read
125
+ // CHECK: [[C:%[0-9]+]] = upcast %0
126
+ // CHECK: [[E:%[0-9]+]] = ref_element_addr [[C]]
127
+ // CHECK: [[A:%[0-9]+]] = begin_access [read] [dynamic] [no_nested_conflict] [[E]]
128
+ // CHECK: [[V:%[0-9]+]] = load [[A]]
129
+ // CHECK: end_access [[A]]
130
+ // CHECK: return [[V]]
131
+ @inline ( never)
132
+ func testDerivedClass2Read( _ c: DerivedClass2 ) -> Int {
133
+ let kp = \DerivedClass2 . i
134
+ return c [ keyPath: kp]
135
+ }
136
+
100
137
// CHECK-LABEL: sil {{.*}}testGenClassWrite
101
138
// CHECK: [[S:%[0-9]+]] = alloc_stack $T
102
139
// CHECK: [[E:%[0-9]+]] = ref_element_addr %0
@@ -233,6 +270,12 @@ func testit() {
233
270
// CHECK-OUTPUT: GenClassRead: 29
234
271
print ( " GenClassRead: \( testGenClassRead ( GenClass ( SimpleClass ( 29 ) ) ) . i) " )
235
272
273
+ // CHECK-OUTPUT: DerivedClassRead: 12
274
+ print ( " DerivedClassRead: \( testDerivedClassRead ( DerivedClass < Int > ( ) ) ) ) " )
275
+
276
+ // CHECK-OUTPUT: DerivedClass2Read: 12
277
+ print ( " DerivedClass2Read: \( testDerivedClass2Read ( DerivedClass2 ( ) ) ) ) " )
278
+
236
279
// CHECK-OUTPUT: GenClassWrite: 30
237
280
let c = GenClass ( SimpleClass ( 0 ) )
238
281
testGenClassWrite ( c, SimpleClass ( 30 ) )
0 commit comments