Skip to content

Commit 3d285a9

Browse files
author
Gabor Horvath
committed
[cxx-interop] Do not import zero-sized fields
Zero sized fields are messing up the offset calculations when we import C++ fields to Swift. We assume that the size of the field is determined by the type of the field. This is not true for fields marked with no_unique_address. Those fields can have 0 size while the sizeof(decltype(field)) is still 1. rdar://143907490
1 parent aff0f45 commit 3d285a9

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

lib/IRGen/GenStruct.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,6 +1451,9 @@ class ClangRecordLowering {
14511451
/// Place the next struct field at its appropriate offset.
14521452
void addStructField(const clang::FieldDecl *clangField,
14531453
VarDecl *swiftField, const clang::ASTRecordLayout &layout) {
1454+
// Skip importing zero-sized fields for now.
1455+
if (clangField->isZeroSize(ClangContext))
1456+
return;
14541457
unsigned fieldOffset = layout.getFieldOffset(clangField->getFieldIndex());
14551458
assert(!clangField->isBitField());
14561459
Size offset( SubobjectAdjustment.getValue() + fieldOffset / 8);

test/Interop/Cxx/class/Inputs/member-variables.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,11 @@ class MyClass {
66
const int const_member = 23;
77
};
88

9+
struct Empty {};
10+
11+
struct HasZeroSizedField {
12+
int a;
13+
[[no_unique_address]] Empty b;
14+
};
15+
916
#endif
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-experimental-cxx-interop)
2+
//
3+
// REQUIRES: executable_test
4+
5+
import StdlibUnittest
6+
import MemberVariables
7+
8+
var FieldsTestSuite = TestSuite("Generating code with zero sized fields")
9+
10+
FieldsTestSuite.test("Zero sized field") {
11+
var s = HasZeroSizedField()
12+
s.a = 5
13+
expectEqual(s.a, 5)
14+
}
15+
16+
runAllTests()

0 commit comments

Comments
 (0)