Skip to content

Commit 5c58a59

Browse files
committed
Generate valid C# for public fields of typedef-ed primitive pointer
Fixes #1611. Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 954a0cf commit 5c58a59

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

src/Generator/Generators/CSharp/CSharpSources.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,7 +1368,8 @@ private void GenerateFieldGetter(Field field, Class @class, QualifiedType return
13681368
var name = ((Class) field.Namespace).Layout.Fields.First(
13691369
f => f.FieldPtr == field.OriginalPtr).Name;
13701370
string returnVar;
1371-
var arrayType = field.Type.Desugar() as ArrayType;
1371+
Type fieldType = field.Type.Desugar();
1372+
var arrayType = fieldType as ArrayType;
13721373
if (@class.IsValueType)
13731374
{
13741375
if (arrayType != null)
@@ -1385,8 +1386,8 @@ private void GenerateFieldGetter(Field field, Class @class, QualifiedType return
13851386
// Class field getter should return a reference object instead of a copy. Wrapping `returnVar` in
13861387
// IntPtr ensures that non-copying object constructor is invoked.
13871388
Class typeClass;
1388-
if (field.Type.TryGetClass(out typeClass) && !typeClass.IsValueType &&
1389-
!ASTUtils.IsMappedToPrimitive(Context.TypeMaps, field.Type))
1389+
if (fieldType.TryGetClass(out typeClass) && !typeClass.IsValueType &&
1390+
!ASTUtils.IsMappedToPrimitive(Context.TypeMaps, fieldType))
13901391
returnVar = $"new {TypePrinter.IntPtrType}(&{returnVar})";
13911392
}
13921393

@@ -1410,9 +1411,9 @@ private void GenerateFieldGetter(Field field, Class @class, QualifiedType return
14101411
Write("return ");
14111412

14121413
var @return = marshal.Context.Return.ToString();
1413-
if (field.Type.IsPointer())
1414+
if (fieldType.IsPointer())
14141415
{
1415-
var final = field.Type.GetFinalPointee().Desugar(resolveTemplateSubstitution: false);
1416+
var final = fieldType.GetFinalPointee().Desugar(resolveTemplateSubstitution: false);
14161417
var templateSubstitution = final as TemplateParameterSubstitutionType;
14171418
if (templateSubstitution != null && returnType.Type.IsDependent)
14181419
Write($"({templateSubstitution.ReplacedParameter.Parameter.Name}) (object) ");
@@ -1422,13 +1423,13 @@ private void GenerateFieldGetter(Field field, Class @class, QualifiedType return
14221423
!final.IsPrimitiveType(PrimitiveType.Char16) &&
14231424
!final.IsPrimitiveType(PrimitiveType.Char32)) ||
14241425
(!Context.Options.MarshalCharAsManagedChar &&
1425-
!((PointerType) field.Type).QualifiedPointee.Qualifiers.IsConst)) &&
1426+
!((PointerType) fieldType).QualifiedPointee.Qualifiers.IsConst)) &&
14261427
templateSubstitution == null) ||
1427-
(!((PointerType) field.Type).QualifiedPointee.Qualifiers.IsConst &&
1428+
(!((PointerType) fieldType).QualifiedPointee.Qualifiers.IsConst &&
14281429
(final.IsPrimitiveType(PrimitiveType.WideChar) ||
14291430
final.IsPrimitiveType(PrimitiveType.Char16) ||
14301431
final.IsPrimitiveType(PrimitiveType.Char32))))
1431-
Write($"({field.Type.GetPointee().Desugar()}*) ");
1432+
Write($"({fieldType.GetPointee().Desugar()}*) ");
14321433
}
14331434
WriteLine($"{@return};");
14341435

tests/Common/Common.Tests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public unsafe void TestCodeGeneration()
2424
Assert.That(foo.B, Is.EqualTo(5));
2525
Bar bar = foo;
2626
Assert.IsTrue(Bar.Item.Item1 == bar);
27+
foo.FieldOfTypedefPrimitivePointer = null;
2728

2829
using (var hasOverloadsWithDifferentPointerKindsToSameType =
2930
new HasOverloadsWithDifferentPointerKindsToSameType())

tests/Common/Common.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ class DLL_API Foo
108108

109109
typedef Foo* FooPtr;
110110

111+
typedef uint8_t* typedefPrimitivePointer;
112+
typedefPrimitivePointer fieldOfTypedefPrimitivePointer;
113+
111114
void TakesTypedefedPtr(FooPtr date);
112115
int TakesRef(const Foo& other);
113116

0 commit comments

Comments
 (0)