From 9b76362a37490e9ffd0d201b0e304f5a21a21e6c Mon Sep 17 00:00:00 2001 From: "xinggang.li" Date: Sun, 27 Apr 2025 19:01:31 +0800 Subject: [PATCH] fix InvalidCastException when inheriting c++ struct constructors --- .../PInvokeGenerator.VisitDecl.cs | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs index 2e37bb02..6c21cf95 100644 --- a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs +++ b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs @@ -374,8 +374,7 @@ private void VisitEnumDecl(EnumDecl enumDecl) { var typeName = GetRemappedTypeName(enumDecl, context: null, enumDecl.IntegerType, out var nativeTypeName); - desc = new EnumDesc() - { + desc = new EnumDesc() { AccessSpecifier = accessSpecifier, TypeName = typeName, EscapedName = escapedName, @@ -662,8 +661,7 @@ private void VisitFunctionDecl(FunctionDecl functionDecl) if (needsReturnFixup) { _outputBuilder.WriteParameterSeparator(); - parameterDesc = new() - { + parameterDesc = new() { Name = "_result", Type = $"{returnTypeName}*" }; @@ -685,8 +683,7 @@ private void VisitFunctionDecl(FunctionDecl functionDecl) { _outputBuilder.WriteParameterSeparator(); } - var parameterDesc = new ParameterDesc - { + var parameterDesc = new ParameterDesc { Name = "", Type = "__arglist" }; @@ -815,9 +812,11 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI { continue; } - - var memberRef = (Ref)cxxConstructorDecl.CursorChildren[i]; - var memberInit = (Stmt)cxxConstructorDecl.CursorChildren[++i]; + if (cxxConstructorDecl.CursorChildren[i] is not Ref memberRef + || cxxConstructorDecl.CursorChildren[++i] is not Stmt memberInit) + { + continue; + } if (memberInit is ImplicitValueInitExpr) { @@ -827,7 +826,7 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI var memberRefName = GetRemappedCursorName(memberRef.Referenced); var memberInitName = memberInit.Spelling; - if (memberInit is CastExpr {SubExprAsWritten: DeclRefExpr declRefExpr}) + if (memberInit is CastExpr { SubExprAsWritten: DeclRefExpr declRefExpr }) { memberInitName = GetRemappedCursorName(declRefExpr.Decl); } @@ -859,6 +858,7 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI { _outputBuilder.EndConstructorInitializer(); } + } } } @@ -1319,8 +1319,7 @@ void ForTypedefDecl(ParmVarDecl parmVarDecl, TypedefDecl typedefDecl) escapedName += index; } - var desc = new ParameterDesc - { + var desc = new ParameterDesc { Name = escapedName, Type = typeName, NativeTypeName = nativeTypeName, @@ -2139,8 +2138,7 @@ void OutputVtblEntry(CXXRecordDecl cxxRecordDecl, CXXMethodDecl cxxMethodDecl) var remappedName = FixupNameForMultipleHits(cxxMethodDecl); var escapedName = EscapeAndStripMethodName(remappedName); - var desc = new FieldDesc - { + var desc = new FieldDesc { AccessSpecifier = AccessSpecifier.Public, NativeTypeName = nativeTypeName, EscapedName = escapedName, @@ -2954,7 +2952,7 @@ void VisitConstantOrIncompleteArrayFieldDecl(RecordDecl recordDecl, FieldDecl co var arraySize = Math.Max((arrayType as ConstantArrayType)?.Size ?? 0, 1); var totalSize = arraySize; var totalSizeString = $"{arraySize}"; - var sizePerDimension = new List<(long index, long size)>() {(0, arraySize) }; + var sizePerDimension = new List<(long index, long size)>() { (0, arraySize) }; while (IsTypeConstantOrIncompleteArray(recordDecl, elementType, out var subArrayType)) {