Skip to content

Commit cc08a31

Browse files
committed
[cxx-interop] Make sure to use the cannonical base class type.
1 parent f93bc64 commit cc08a31

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

lib/IRGen/GenStruct.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,16 +338,18 @@ namespace {
338338

339339
if (auto cxxRecord = dyn_cast<clang::CXXRecordDecl>(ClangDecl)) {
340340
for (auto base : cxxRecord->bases()) {
341-
auto baseRecord = cast<clang::RecordType>(base.getType())->getDecl();
341+
auto baseType = base.getType().getCanonicalType();
342+
343+
auto baseRecord = cast<clang::RecordType>(baseType)->getDecl();
342344
auto baseCxxRecord = cast<clang::CXXRecordDecl>(baseRecord);
343345

344346
if (baseCxxRecord->isEmpty())
345347
continue;
346348

347349
auto offset = layout.getBaseClassOffset(baseCxxRecord);
348350
auto size =
349-
ClangDecl->getASTContext().getTypeSizeInChars(base.getType());
350-
fn(base.getType(), offset, size);
351+
ClangDecl->getASTContext().getTypeSizeInChars(baseType);
352+
fn(baseType, offset, size);
351353
}
352354
}
353355
}

test/Interop/Cxx/class/inheritance/Inputs/fields.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,12 @@ struct NonTrivialHasOneField {
4646
struct NonTrivialDerivedFromAll : NonTrivialHasOneField, NonTrivialDerivedWithOneField {
4747
int f = 6;
4848
};
49+
50+
// Templates:
51+
52+
template<class T>
53+
struct ClassTemplate {
54+
T value;
55+
};
56+
57+
struct DerivedFromClassTemplate : ClassTemplate<int> {};

test/Interop/Cxx/class/inheritance/fields.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,10 @@ FieldsTestSuite.test("Fields from derived from non trivial") {
5252
expectEqual(mutable.f, 48)
5353
}
5454

55+
FieldsTestSuite.test("Derived from class template") {
56+
var derived = DerivedFromClassTemplate()
57+
derived.value = 42
58+
expectEqual(derived.value, 42)
59+
}
60+
5561
runAllTests()

0 commit comments

Comments
 (0)