Skip to content

Commit

Permalink
Merge pull request #4452 from jckarter/crash-on-empty-field-in-nested…
Browse files Browse the repository at this point in the history
…-class

Runtime: Don't clobber the compiler-emitted layout of empty fields.
  • Loading branch information
tkremenek committed Aug 22, 2016
2 parents 82a7a55 + 4f65ef9 commit f5f6905
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
3 changes: 3 additions & 0 deletions stdlib/public/runtime/Metadata.cpp
Expand Up @@ -1764,6 +1764,9 @@ swift::swift_initClassMetadata_UniversalStrategy(ClassMetadata *self,

// Okay, now do layout.
for (unsigned i = 0; i != numFields; ++i) {
// Skip empty fields.
if (fieldOffsets[i] == 0 && fieldLayouts[i].Size == 0)
continue;
auto offset = roundUpToAlignMask(size, fieldLayouts[i].AlignMask);
fieldOffsets[i] = offset;
size = offset + fieldLayouts[i].Size;
Expand Down
47 changes: 47 additions & 0 deletions test/Interpreter/generic_class_empty_field.swift
@@ -0,0 +1,47 @@
// RUN: rm -rf %t && mkdir %t
// RUN: %target-build-swift %s -o %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s
// REQUIRES: executable_test

class Outer {
class Foo {
var zim = Bar()
var bas = Outer()
}
class Boo {
var bas = Outer()
var zim = Bar()
}

required init() {}
}

protocol Initable { init() }
extension Outer: Initable {}

class GFoo<T: Initable> {
var zim = Bar()
var bas = T()
}
class GBoo<T: Initable> {
var bas = T()
var zim = Bar()
}
class GFos<T: Initable> {
var bar = T()
var zim = Bar()
var bas = T()
}

struct Bar { }

do {
let a = Outer.Foo()
let b = Outer.Boo()
let c = GFoo<Outer>()
let d = GBoo<Outer>()
let e = GFos<Outer>()
}

// CHECK: Job's finished
print("Job's finished")

0 comments on commit f5f6905

Please sign in to comment.