Skip to content

Commit dbfa51b

Browse files
Merge pull request #831 from tannergooding/fix-inline-array-subscript-addressof
Don't take the address of a subscripted inline-array field
2 parents 9f8f8ca + 67cac8a commit dbfa51b

18 files changed

Lines changed: 28 additions & 9 deletions

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitStmt.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1530,7 +1530,9 @@ private void VisitImplicitCastExpr(ImplicitCastExpr implicitCastExpr)
15301530
// value type, which has no implicit pointer conversion, so take its address to
15311531
// bind it to a pointer. A compatible-mode fixed buffer decays on its own, and
15321532
// array locals (managed arrays) or string literals must not be addressed here.
1533-
if (!Config.GenerateCompatibleCode && (subExpr is MemberExpr) && (subExpr.Type.CanonicalType is ConstantArrayType) && (implicitCastExpr.Type.CanonicalType is PointerType))
1533+
// A subscripted field (`arr[i]`) indexes the inline array in place, so the decay
1534+
// there is an lvalue that must not be addressed.
1535+
if (!Config.GenerateCompatibleCode && (subExpr is MemberExpr) && (subExpr.Type.CanonicalType is ConstantArrayType) && (implicitCastExpr.Type.CanonicalType is PointerType) && !IsPrevContextStmt<ArraySubscriptExpr>(out _, out _))
15341536
{
15351537
outputBuilder.Write('&');
15361538
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Compatible.Unix.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public static unsafe partial class Methods
1616
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
1717
{
1818
MyOtherFunction(pStruct->Data);
19+
pStruct->Data[15] = 1;
1920
}
2021
}
2122
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Compatible.Windows.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public static unsafe partial class Methods
1616
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
1717
{
1818
MyOtherFunction(pStruct->Data);
19+
pStruct->Data[15] = 1;
1920
}
2021
}
2122
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Default.Unix.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static unsafe partial class Methods
2323
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
2424
{
2525
MyOtherFunction(&pStruct->Data);
26+
pStruct->Data[15] = 1;
2627
}
2728
}
2829
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Default.Windows.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static unsafe partial class Methods
2323
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
2424
{
2525
MyOtherFunction(&pStruct->Data);
26+
pStruct->Data[15] = 1;
2627
}
2728
}
2829
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Latest.Unix.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static unsafe partial class Methods
2323
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
2424
{
2525
MyOtherFunction(&pStruct->Data);
26+
pStruct->Data[15] = 1;
2627
}
2728
}
2829
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Latest.Windows.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static unsafe partial class Methods
2323
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
2424
{
2525
MyOtherFunction(&pStruct->Data);
26+
pStruct->Data[15] = 1;
2627
}
2728
}
2829
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Preview.Unix.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static unsafe partial class Methods
2323
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
2424
{
2525
MyOtherFunction(&pStruct->Data);
26+
pStruct->Data[15] = 1;
2627
}
2728
}
2829
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.CSharp.Preview.Windows.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static unsafe partial class Methods
2323
public static void MyFunction([NativeTypeName("struct MyStruct *")] MyStruct* pStruct)
2424
{
2525
MyOtherFunction(&pStruct->Data);
26+
pStruct->Data[15] = 1;
2627
}
2728
}
2829
}

tests/ClangSharp.PInvokeGenerator.UnitTests/Baseline/Baselines/FunctionDeclarationBodyImport/ArrayFieldToPointerArgumentTest.Xml.Compatible.Unix.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
<param name="pStruct">
1919
<type>MyStruct*</type>
2020
</param>
21-
<code>MyOtherFunction(pStruct-&gt;Data);</code>
21+
<code>MyOtherFunction(pStruct-&gt;Data);
22+
pStruct-&gt;Data[15] = 1;</code>
2223
</function>
2324
</class>
2425
</namespace>

0 commit comments

Comments
 (0)