Skip to content

Commit f5f6905

Browse files
authored
Merge pull request #4452 from jckarter/crash-on-empty-field-in-nested-class
Runtime: Don't clobber the compiler-emitted layout of empty fields.
2 parents 82a7a55 + 4f65ef9 commit f5f6905

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,6 +1764,9 @@ swift::swift_initClassMetadata_UniversalStrategy(ClassMetadata *self,
17641764

17651765
// Okay, now do layout.
17661766
for (unsigned i = 0; i != numFields; ++i) {
1767+
// Skip empty fields.
1768+
if (fieldOffsets[i] == 0 && fieldLayouts[i].Size == 0)
1769+
continue;
17671770
auto offset = roundUpToAlignMask(size, fieldLayouts[i].AlignMask);
17681771
fieldOffsets[i] = offset;
17691772
size = offset + fieldLayouts[i].Size;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// RUN: rm -rf %t && mkdir %t
2+
// RUN: %target-build-swift %s -o %t/a.out
3+
// RUN: %target-run %t/a.out | %FileCheck %s
4+
// REQUIRES: executable_test
5+
6+
class Outer {
7+
class Foo {
8+
var zim = Bar()
9+
var bas = Outer()
10+
}
11+
class Boo {
12+
var bas = Outer()
13+
var zim = Bar()
14+
}
15+
16+
required init() {}
17+
}
18+
19+
protocol Initable { init() }
20+
extension Outer: Initable {}
21+
22+
class GFoo<T: Initable> {
23+
var zim = Bar()
24+
var bas = T()
25+
}
26+
class GBoo<T: Initable> {
27+
var bas = T()
28+
var zim = Bar()
29+
}
30+
class GFos<T: Initable> {
31+
var bar = T()
32+
var zim = Bar()
33+
var bas = T()
34+
}
35+
36+
struct Bar { }
37+
38+
do {
39+
let a = Outer.Foo()
40+
let b = Outer.Boo()
41+
let c = GFoo<Outer>()
42+
let d = GBoo<Outer>()
43+
let e = GFos<Outer>()
44+
}
45+
46+
// CHECK: Job's finished
47+
print("Job's finished")

0 commit comments

Comments
 (0)