Skip to content

Commit 9b76362

Browse files
author
xinggang.li
committed
fix InvalidCastException when inheriting c++ struct constructors
1 parent 233d46d commit 9b76362

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,7 @@ private void VisitEnumDecl(EnumDecl enumDecl)
374374
{
375375
var typeName = GetRemappedTypeName(enumDecl, context: null, enumDecl.IntegerType, out var nativeTypeName);
376376

377-
desc = new EnumDesc()
378-
{
377+
desc = new EnumDesc() {
379378
AccessSpecifier = accessSpecifier,
380379
TypeName = typeName,
381380
EscapedName = escapedName,
@@ -662,8 +661,7 @@ private void VisitFunctionDecl(FunctionDecl functionDecl)
662661
if (needsReturnFixup)
663662
{
664663
_outputBuilder.WriteParameterSeparator();
665-
parameterDesc = new()
666-
{
664+
parameterDesc = new() {
667665
Name = "_result",
668666
Type = $"{returnTypeName}*"
669667
};
@@ -685,8 +683,7 @@ private void VisitFunctionDecl(FunctionDecl functionDecl)
685683
{
686684
_outputBuilder.WriteParameterSeparator();
687685
}
688-
var parameterDesc = new ParameterDesc
689-
{
686+
var parameterDesc = new ParameterDesc {
690687
Name = "",
691688
Type = "__arglist"
692689
};
@@ -815,9 +812,11 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI
815812
{
816813
continue;
817814
}
818-
819-
var memberRef = (Ref)cxxConstructorDecl.CursorChildren[i];
820-
var memberInit = (Stmt)cxxConstructorDecl.CursorChildren[++i];
815+
if (cxxConstructorDecl.CursorChildren[i] is not Ref memberRef
816+
|| cxxConstructorDecl.CursorChildren[++i] is not Stmt memberInit)
817+
{
818+
continue;
819+
}
821820

822821
if (memberInit is ImplicitValueInitExpr)
823822
{
@@ -827,7 +826,7 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI
827826
var memberRefName = GetRemappedCursorName(memberRef.Referenced);
828827
var memberInitName = memberInit.Spelling;
829828

830-
if (memberInit is CastExpr {SubExprAsWritten: DeclRefExpr declRefExpr})
829+
if (memberInit is CastExpr { SubExprAsWritten: DeclRefExpr declRefExpr })
831830
{
832831
memberInitName = GetRemappedCursorName(declRefExpr.Decl);
833832
}
@@ -859,6 +858,7 @@ void VisitCtorInitializers(CXXConstructorDecl cxxConstructorDecl, int firstCtorI
859858
{
860859
_outputBuilder.EndConstructorInitializer();
861860
}
861+
862862
}
863863
}
864864
}
@@ -1319,8 +1319,7 @@ void ForTypedefDecl(ParmVarDecl parmVarDecl, TypedefDecl typedefDecl)
13191319
escapedName += index;
13201320
}
13211321

1322-
var desc = new ParameterDesc
1323-
{
1322+
var desc = new ParameterDesc {
13241323
Name = escapedName,
13251324
Type = typeName,
13261325
NativeTypeName = nativeTypeName,
@@ -2139,8 +2138,7 @@ void OutputVtblEntry(CXXRecordDecl cxxRecordDecl, CXXMethodDecl cxxMethodDecl)
21392138
var remappedName = FixupNameForMultipleHits(cxxMethodDecl);
21402139
var escapedName = EscapeAndStripMethodName(remappedName);
21412140

2142-
var desc = new FieldDesc
2143-
{
2141+
var desc = new FieldDesc {
21442142
AccessSpecifier = AccessSpecifier.Public,
21452143
NativeTypeName = nativeTypeName,
21462144
EscapedName = escapedName,
@@ -2954,7 +2952,7 @@ void VisitConstantOrIncompleteArrayFieldDecl(RecordDecl recordDecl, FieldDecl co
29542952
var arraySize = Math.Max((arrayType as ConstantArrayType)?.Size ?? 0, 1);
29552953
var totalSize = arraySize;
29562954
var totalSizeString = $"{arraySize}";
2957-
var sizePerDimension = new List<(long index, long size)>() {(0, arraySize) };
2955+
var sizePerDimension = new List<(long index, long size)>() { (0, arraySize) };
29582956

29592957
while (IsTypeConstantOrIncompleteArray(recordDecl, elementType, out var subArrayType))
29602958
{

0 commit comments

Comments
 (0)