diff --git a/oi/type_graph/AlignmentCalc.cpp b/oi/type_graph/AlignmentCalc.cpp index b472b7d..facba09 100644 --- a/oi/type_graph/AlignmentCalc.cpp +++ b/oi/type_graph/AlignmentCalc.cpp @@ -47,11 +47,16 @@ void AlignmentCalc::accept(Type& type) { type.accept(*this); } -// TODO we will need to calculate alignment for c.templateParams too?? -// TODO same for children. test this void AlignmentCalc::visit(Class& c) { - // AlignmentCalc should be run after Flattener - assert(c.parents.empty()); + for (const auto& param : c.templateParams) { + accept(param.type()); + } + for (const auto& parent : c.parents) { + accept(parent.type()); + } + for (const auto& child : c.children) { + accept(child); + } uint64_t alignment = 1; for (auto& member : c.members) { diff --git a/test/test_alignment_calc.cpp b/test/test_alignment_calc.cpp index 23b8fcb..22cdfa3 100644 --- a/test/test_alignment_calc.cpp +++ b/test/test_alignment_calc.cpp @@ -81,3 +81,87 @@ TEST(AlignmentCalcTest, Packed) { Primitive: int64_t )"); } + +TEST(AlignmentCalcTest, RecurseClassParam) { + test(AlignmentCalc::createPass(), R"( +[0] Class: MyClass (size: 0) + Param +[1] Class: ClassA (size: 16) + Member: a (offset: 0) + Primitive: int8_t + Member: b (offset: 4) + Primitive: int64_t +)", + R"( +[0] Class: MyClass (size: 0, align: 1) + Param +[1] Class: ClassA (size: 16, align: 8) + Member: a (offset: 0, align: 1) + Primitive: int8_t + Member: b (offset: 4, align: 8) + Primitive: int64_t +)"); +} + +TEST(AlignmentCalcTest, RecurseClassParent) { + test(AlignmentCalc::createPass(), R"( +[0] Class: MyClass (size: 0) + Parent (offset: 0) +[1] Class: ClassA (size: 16) + Member: a (offset: 0) + Primitive: int8_t + Member: b (offset: 4) + Primitive: int64_t +)", + R"( +[0] Class: MyClass (size: 0, align: 1) + Parent (offset: 0) +[1] Class: ClassA (size: 16, align: 8) + Member: a (offset: 0, align: 1) + Primitive: int8_t + Member: b (offset: 4, align: 8) + Primitive: int64_t +)"); +} + +TEST(AlignmentCalcTest, RecurseClassMember) { + test(AlignmentCalc::createPass(), R"( +[0] Class: MyClass (size: 0) + Member: xxx (offset: 0) +[1] Class: ClassA (size: 16) + Member: a (offset: 0) + Primitive: int8_t + Member: b (offset: 4) + Primitive: int64_t +)", + R"( +[0] Class: MyClass (size: 0, align: 8) + Member: xxx (offset: 0, align: 8) +[1] Class: ClassA (size: 16, align: 8) + Member: a (offset: 0, align: 1) + Primitive: int8_t + Member: b (offset: 4, align: 8) + Primitive: int64_t +)"); +} + +TEST(AlignmentCalcTest, RecurseClassChild) { + test(AlignmentCalc::createPass(), R"( +[0] Class: MyClass (size: 0) + Child +[1] Class: ClassA (size: 16) + Member: a (offset: 0) + Primitive: int8_t + Member: b (offset: 4) + Primitive: int64_t +)", + R"( +[0] Class: MyClass (size: 0, align: 1) + Child +[1] Class: ClassA (size: 16, align: 8) + Member: a (offset: 0, align: 1) + Primitive: int8_t + Member: b (offset: 4, align: 8) + Primitive: int64_t +)"); +}