Browse Source

Fix clang assert

pull/1919/head
duckdoom5 5 months ago
parent
commit
b2786f8d9d
  1. 16
      src/CppParser/Bootstrap/StmtCodeGenerators.cs
  2. 3
      src/CppParser/ParseExpr.cpp

16
src/CppParser/Bootstrap/StmtCodeGenerators.cs

@ -341,8 +341,20 @@ namespace CppSharp
WriteLine($"_S->{fieldName} = static_cast<AST::{typeName}>(" + WriteLine($"_S->{fieldName} = static_cast<AST::{typeName}>(" +
$"WalkStatement(S->{methodName}()));"); $"WalkStatement(S->{methodName}()));");
else if (typeName.Contains("Expr")) else if (typeName.Contains("Expr"))
WriteLine($"_S->{fieldName} = static_cast<AST::{typeName}>(" + {
$"WalkExpression(S->{methodName}()));"); var expr = $"_S->{fieldName} = static_cast<AST::{typeName}>(WalkExpression(S->{methodName}()));";
if (fieldName == "base" && typeName is "CXXDependentScopeMemberExpr")
{
// Clang asserts that 'getBase()' is not called when 'isImplicitAccess()' returns true
WriteLine("if (!S->isImplicitAccess())");
WriteLineIndent(expr);
}
else
{
WriteLine(expr);
}
}
else if (fieldName == "guidDecl") else if (fieldName == "guidDecl")
WriteLine($"_S->{fieldName} = S->getGuidDecl()->getNameAsString();"); WriteLine($"_S->{fieldName} = S->getGuidDecl()->getNameAsString();");
else if (typeName.Contains("Decl") || typeName.Contains("Method") || else if (typeName.Contains("Decl") || typeName.Contains("Method") ||

3
src/CppParser/ParseExpr.cpp

@ -2426,7 +2426,8 @@ AST::Expr* Parser::WalkExpression(const clang::Expr* Expr)
_S->refersToMatrixElement = S->refersToMatrixElement(); _S->refersToMatrixElement = S->refersToMatrixElement();
_S->hasPlaceholderType = S->hasPlaceholderType(); _S->hasPlaceholderType = S->hasPlaceholderType();
_S->isImplicitAccess = S->isImplicitAccess(); _S->isImplicitAccess = S->isImplicitAccess();
_S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase())); if (!S->isImplicitAccess())
_S->base = static_cast<AST::Expr*>(WalkExpression(S->getBase()));
_S->baseType = GetQualifiedType(S->getBaseType()); _S->baseType = GetQualifiedType(S->getBaseType());
_S->isArrow = S->isArrow(); _S->isArrow = S->isArrow();
_S->firstQualifierFoundInScope = static_cast<AST::Declaration*>(WalkDeclaration(S->getFirstQualifierFoundInScope())); _S->firstQualifierFoundInScope = static_cast<AST::Declaration*>(WalkDeclaration(S->getFirstQualifierFoundInScope()));

Loading…
Cancel
Save