From b2786f8d9d8d5c817dc5c1b559e3f848eba91ce7 Mon Sep 17 00:00:00 2001 From: duckdoom5 Date: Tue, 4 Mar 2025 10:49:27 +0100 Subject: [PATCH] Fix clang assert --- src/CppParser/Bootstrap/StmtCodeGenerators.cs | 16 ++++++++++++++-- src/CppParser/ParseExpr.cpp | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/CppParser/Bootstrap/StmtCodeGenerators.cs b/src/CppParser/Bootstrap/StmtCodeGenerators.cs index 77ed94f1..fef1a24e 100644 --- a/src/CppParser/Bootstrap/StmtCodeGenerators.cs +++ b/src/CppParser/Bootstrap/StmtCodeGenerators.cs @@ -341,8 +341,20 @@ namespace CppSharp WriteLine($"_S->{fieldName} = static_cast(" + $"WalkStatement(S->{methodName}()));"); else if (typeName.Contains("Expr")) - WriteLine($"_S->{fieldName} = static_cast(" + - $"WalkExpression(S->{methodName}()));"); + { + var expr = $"_S->{fieldName} = static_cast(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") WriteLine($"_S->{fieldName} = S->getGuidDecl()->getNameAsString();"); else if (typeName.Contains("Decl") || typeName.Contains("Method") || diff --git a/src/CppParser/ParseExpr.cpp b/src/CppParser/ParseExpr.cpp index 357d43b0..4e1bec7a 100644 --- a/src/CppParser/ParseExpr.cpp +++ b/src/CppParser/ParseExpr.cpp @@ -2426,7 +2426,8 @@ AST::Expr* Parser::WalkExpression(const clang::Expr* Expr) _S->refersToMatrixElement = S->refersToMatrixElement(); _S->hasPlaceholderType = S->hasPlaceholderType(); _S->isImplicitAccess = S->isImplicitAccess(); - _S->base = static_cast(WalkExpression(S->getBase())); + if (!S->isImplicitAccess()) + _S->base = static_cast(WalkExpression(S->getBase())); _S->baseType = GetQualifiedType(S->getBaseType()); _S->isArrow = S->isArrow(); _S->firstQualifierFoundInScope = static_cast(WalkDeclaration(S->getFirstQualifierFoundInScope()));