Skip to content

Commit c83703a

Browse files
committed
Reflection: Fix layout of Set, Dictionary and other fixed-size multi-payload enums
For generic multi-payload enums, we would proceed down the dynamic layout path without checking for a builtin descriptor. As a result Set and Dictionary were always reported as being 9 bytes in size and not 8. Oops... Fixes <rdar://problem/30066015>.
1 parent c166e41 commit c83703a

File tree

4 files changed

+40
-38
lines changed

4 files changed

+40
-38
lines changed

stdlib/public/Reflection/TypeRefBuilder.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ TypeRefBuilder::getBuiltinTypeInfo(const TypeRef *TR) {
165165
MangledName = B->getMangledName();
166166
else if (auto N = dyn_cast<NominalTypeRef>(TR))
167167
MangledName = N->getMangledName();
168+
else if (auto B = dyn_cast<BoundGenericTypeRef>(TR))
169+
MangledName = B->getMangledName();
168170
else
169171
return nullptr;
170172

validation-test/Reflection/reflect_Dictionary.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ reflect(object: obj)
2323
// CHECK-64: (class reflect_Dictionary.TestClass)
2424

2525
// CHECK-64: Type info:
26-
// CHECK-64: (class_instance size=25 alignment=8 stride=32 num_extra_inhabitants=0
26+
// CHECK-64: (class_instance size=24 alignment=8 stride=24 num_extra_inhabitants=0
2727
// CHECK-64: (field name=t offset=16
28-
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
28+
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
2929
// (unstable implementation details omitted)
3030

3131
// CHECK-32: Reflecting an object.
@@ -34,9 +34,9 @@ reflect(object: obj)
3434
// CHECK-32: (class reflect_Dictionary.TestClass)
3535

3636
// CHECK-32: Type info:
37-
// CHECK-32: (class_instance size=17 alignment=4 stride=20 num_extra_inhabitants=0
37+
// CHECK-32: (class_instance size=16 alignment=4 stride=16 num_extra_inhabitants=0
3838
// CHECK-32: (field name=t offset=12
39-
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
39+
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
4040
// (unstable implementation details omitted)
4141

4242
doneReflecting()

validation-test/Reflection/reflect_Set.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ reflect(object: obj)
2323
// CHECK-64: (class reflect_Set.TestClass)
2424

2525
// CHECK-64: Type info:
26-
// CHECK-64: (class_instance size=25 alignment=8 stride=32 num_extra_inhabitants=0
26+
// CHECK-64: (class_instance size=24 alignment=8 stride=24 num_extra_inhabitants=0
2727
// CHECK-64: (field name=t offset=16
28-
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
28+
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
2929
// (unstable implementation details omitted)
3030

3131
// CHECK-32: Reflecting an object.
@@ -34,9 +34,9 @@ reflect(object: obj)
3434
// CHECK-32: (class reflect_Set.TestClass)
3535

3636
// CHECK-32: Type info:
37-
// CHECK-32: (class_instance size=17 alignment=4 stride=20 num_extra_inhabitants=0
37+
// CHECK-32: (class_instance size=16 alignment=4 stride=16 num_extra_inhabitants=0
3838
// CHECK-32: (field name=t offset=12
39-
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
39+
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
4040
// (unstable implementation details omitted)
4141

4242
doneReflecting()

validation-test/Reflection/reflect_multiple_types.swift

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ reflect(object: obj)
115115
// CHECK-64: (class reflect_multiple_types.TestClass)
116116

117117
// CHECK-64: Type info:
118-
// CHECK-64: (class_instance size=209 alignment=8 stride=216 num_extra_inhabitants=0
118+
// CHECK-64: (class_instance size=193 alignment=8 stride=200 num_extra_inhabitants=0
119119
// CHECK-64: (field name=t00 offset=16
120120
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=1
121121
// (unstable implementation details omitted)
@@ -136,67 +136,67 @@ reflect(object: obj)
136136
// CHECK-64: (field name=small offset=0
137137
// CHECK-64: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647))))))
138138
// CHECK-64: (field name=t03 offset=48
139-
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
139+
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
140140
// (unstable implementation details omitted)
141-
// CHECK-64: (field name=t04 offset=64
141+
// CHECK-64: (field name=t04 offset=56
142142
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
143143
// CHECK-64: (field name=_value offset=0
144144
// CHECK-64: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0))))
145-
// CHECK-64: (field name=t05 offset=72
145+
// CHECK-64: (field name=t05 offset=64
146146
// CHECK-64: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
147147
// CHECK-64: (field name=_value offset=0
148148
// CHECK-64: (builtin size=4 alignment=4 stride=4 num_extra_inhabitants=0))))
149-
// CHECK-64: (field name=t06 offset=80
149+
// CHECK-64: (field name=t06 offset=72
150150
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
151151
// CHECK-64: (field name=_value offset=0
152152
// CHECK-64: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0))))
153-
// CHECK-64: (field name=t07 offset=88
153+
// CHECK-64: (field name=t07 offset=80
154154
// CHECK-64: (struct size=2 alignment=2 stride=2 num_extra_inhabitants=0
155155
// CHECK-64: (field name=_value offset=0
156156
// CHECK-64: (builtin size=2 alignment=2 stride=2 num_extra_inhabitants=0))))
157-
// CHECK-64: (field name=t08 offset=92
157+
// CHECK-64: (field name=t08 offset=84
158158
// CHECK-64: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
159159
// CHECK-64: (field name=_value offset=0
160160
// CHECK-64: (builtin size=4 alignment=4 stride=4 num_extra_inhabitants=0))))
161-
// CHECK-64: (field name=t09 offset=96
161+
// CHECK-64: (field name=t09 offset=88
162162
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
163163
// CHECK-64: (field name=_value offset=0
164164
// CHECK-64: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0))))
165-
// CHECK-64: (field name=t10 offset=104
165+
// CHECK-64: (field name=t10 offset=96
166166
// CHECK-64: (struct size=1 alignment=1 stride=1 num_extra_inhabitants=0
167167
// CHECK-64: (field name=_value offset=0
168168
// CHECK-64: (builtin size=1 alignment=1 stride=1 num_extra_inhabitants=0))))
169-
// CHECK-64: (field name=t11 offset=112
169+
// CHECK-64: (field name=t11 offset=104
170170
// CHECK-64: (reference kind=strong refcounting=unknown))
171-
// CHECK-64: (field name=t12 offset=120
171+
// CHECK-64: (field name=t12 offset=112
172172
// CHECK-64: (reference kind=strong refcounting=unknown))
173-
// CHECK-64: (field name=t13 offset=128
173+
// CHECK-64: (field name=t13 offset=120
174174
// CHECK-64: (reference kind=strong refcounting=unknown))
175-
// CHECK-64: (field name=t14 offset=136
175+
// CHECK-64: (field name=t14 offset=128
176176
// CHECK-64: (reference kind=strong refcounting=unknown))
177-
// CHECK-64: (field name=t15 offset=144
178-
// CHECK-64: (struct size=9 alignment=8 stride=16 num_extra_inhabitants=0
177+
// CHECK-64: (field name=t15 offset=136
178+
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
179179
// (unstable implementation details omitted)
180-
// CHECK-64: (field name=t16 offset=160
180+
// CHECK-64: (field name=t16 offset=144
181181
// CHECK-64: (struct size=24 alignment=8 stride=24 num_extra_inhabitants=0
182182
// (unstable implementation details omitted)
183-
// CHECK-64: (field name=t17 offset=184
183+
// CHECK-64: (field name=t17 offset=168
184184
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
185185
// CHECK-64: (field name=_value offset=0
186186
// CHECK-64: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0))))
187-
// CHECK-64: (field name=t18 offset=192
187+
// CHECK-64: (field name=t18 offset=176
188188
// CHECK-64: (struct size=2 alignment=2 stride=2 num_extra_inhabitants=0
189189
// CHECK-64: (field name=_value offset=0
190190
// CHECK-64: (builtin size=2 alignment=2 stride=2 num_extra_inhabitants=0))))
191-
// CHECK-64: (field name=t19 offset=196
191+
// CHECK-64: (field name=t19 offset=180
192192
// CHECK-64: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
193193
// CHECK-64: (field name=_value offset=0
194194
// CHECK-64: (builtin size=4 alignment=4 stride=4 num_extra_inhabitants=0))))
195-
// CHECK-64: (field name=t20 offset=200
195+
// CHECK-64: (field name=t20 offset=184
196196
// CHECK-64: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
197197
// CHECK-64: (field name=_value offset=0
198198
// CHECK-64: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0))))
199-
// CHECK-64: (field name=t21 offset=208
199+
// CHECK-64: (field name=t21 offset=192
200200
// CHECK-64: (struct size=1 alignment=1 stride=1 num_extra_inhabitants=0
201201
// CHECK-64: (field name=_value offset=0
202202
// CHECK-64: (builtin size=1 alignment=1 stride=1 num_extra_inhabitants=0)))))
@@ -207,7 +207,7 @@ reflect(object: obj)
207207
// CHECK-32: (class reflect_multiple_types.TestClass)
208208

209209
// CHECK-32: Type info:
210-
// CHECK-32: (class_instance size=137 alignment=8 stride=144 num_extra_inhabitants=0
210+
// CHECK-32: (class_instance size=129 alignment=8 stride=136 num_extra_inhabitants=0
211211
// CHECK-32: (field name=t00 offset=12
212212
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=1
213213
// (unstable implementation details omitted)
@@ -228,7 +228,7 @@ reflect(object: obj)
228228
// CHECK-32: (field name=small offset=0
229229
// CHECK-32: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=2147483647))))))
230230
// CHECK-32: (field name=t03 offset=32
231-
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
231+
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
232232
// (unstable implementation details omitted)
233233
// CHECK-32: (field name=t04 offset=40
234234
// CHECK-32: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
@@ -267,28 +267,28 @@ reflect(object: obj)
267267
// CHECK-32: (field name=t14 offset=88
268268
// CHECK-32: (reference kind=strong refcounting=unknown))
269269
// CHECK-32: (field name=t15 offset=92
270-
// CHECK-32: (struct size=5 alignment=4 stride=8 num_extra_inhabitants=0
270+
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
271271
// (unstable implementation details omitted)
272-
// CHECK-32: (field name=t16 offset=100
272+
// CHECK-32: (field name=t16 offset=96
273273
// CHECK-32: (struct size=12 alignment=4 stride=12 num_extra_inhabitants=0
274274
// (unstable implementation details omitted)
275-
// CHECK-32: (field name=t17 offset=112
275+
// CHECK-32: (field name=t17 offset=108
276276
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
277277
// CHECK-32: (field name=_value offset=0
278278
// CHECK-32: (builtin size=4 alignment=4 stride=4 num_extra_inhabitants=0))))
279-
// CHECK-32: (field name=t18 offset=116
279+
// CHECK-32: (field name=t18 offset=112
280280
// CHECK-32: (struct size=2 alignment=2 stride=2 num_extra_inhabitants=0
281281
// CHECK-32: (field name=_value offset=0
282282
// CHECK-32: (builtin size=2 alignment=2 stride=2 num_extra_inhabitants=0))))
283-
// CHECK-32: (field name=t19 offset=120
283+
// CHECK-32: (field name=t19 offset=116
284284
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
285285
// CHECK-32: (field name=_value offset=0
286286
// CHECK-32: (builtin size=4 alignment=4 stride=4 num_extra_inhabitants=0))))
287-
// CHECK-32: (field name=t20 offset=128
287+
// CHECK-32: (field name=t20 offset=120
288288
// CHECK-32: (struct size=8 alignment=8 stride=8 num_extra_inhabitants=0
289289
// CHECK-32: (field name=_value offset=0
290290
// CHECK-32: (builtin size=8 alignment=8 stride=8 num_extra_inhabitants=0))))
291-
// CHECK-32: (field name=t21 offset=136
291+
// CHECK-32: (field name=t21 offset=128
292292
// CHECK-32: (struct size=1 alignment=1 stride=1 num_extra_inhabitants=0
293293
// CHECK-32: (field name=_value offset=0
294294
// CHECK-32: (builtin size=1 alignment=1 stride=1 num_extra_inhabitants=0)))))

0 commit comments

Comments
 (0)