Browse Source

Fixed a bug causing a class layout to have the class as its own base.

Fixes https://github.com/mono/CppSharp/issues/702.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/705/head
Dimitar Dobrev 9 years ago
parent
commit
56c1fab63b
  1. 13
      src/CppParser/Parser.cpp
  2. 9
      src/Generator.Tests/AST/TestAST.cs

13
src/CppParser/Parser.cpp

@ -102,12 +102,15 @@ void Parser::ReadClassLayout(Class* Class, const clang::RecordDecl* RD,
auto CXXRD = dyn_cast<CXXRecordDecl>(RD); auto CXXRD = dyn_cast<CXXRecordDecl>(RD);
auto Parent = static_cast<AST::Class*>( auto Parent = static_cast<AST::Class*>(
WalkDeclaration(RD, /*IgnoreSystemDecls =*/false)); WalkDeclaration(RD, /*CanBeDefinition =*/false));
LayoutBase LayoutBase; if (Class != Parent)
LayoutBase.Offset = Offset.getQuantity(); {
LayoutBase.Class = Parent; LayoutBase LayoutBase;
Class->Layout->Bases.push_back(LayoutBase); LayoutBase.Offset = Offset.getQuantity();
LayoutBase.Class = Parent;
Class->Layout->Bases.push_back(LayoutBase);
}
// Dump bases. // Dump bases.
if (CXXRD) { if (CXXRD) {

9
src/Generator.Tests/AST/TestAST.cs

@ -417,5 +417,12 @@ namespace CppSharp.Generator.Tests.AST
Assert.That(template.Specializations.Last().Visit(cppTypePrinter), Assert.That(template.Specializations.Last().Visit(cppTypePrinter),
Is.EqualTo("TestSpecializationArguments<const TestASTEnumItemByName>")); Is.EqualTo("TestSpecializationArguments<const TestASTEnumItemByName>"));
} }
}
[Test]
public void TestLayoutBase()
{
var @class = AstContext.FindCompleteClass("TestComments");
Assert.That(@class.Layout.Bases.Count, Is.EqualTo(0));
}
}
} }

Loading…
Cancel
Save