Skip to content

Commit d2f5c26

Browse files
IIFEBuild Agent
andauthored
By reference enum param fixes (#1321)
Fix generated C++/CLI of pointers to enums Co-authored-by: Build Agent <[email protected]>
1 parent 574fbca commit d2f5c26

File tree

5 files changed

+39
-7
lines changed

5 files changed

+39
-7
lines changed

src/Generator/Generators/CLI/CLIMarshal.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,10 +517,15 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
517517
Enumeration @enum;
518518
if (pointee.TryGetEnum(out @enum))
519519
{
520-
var isRef = Context.Parameter.Usage == ParameterUsage.Out ||
520+
var isRef = Context.Parameter.Type.IsReference() ||
521+
Context.Parameter.Usage == ParameterUsage.Out ||
521522
Context.Parameter.Usage == ParameterUsage.InOut;
522523

523-
ArgumentPrefix.Write("&");
524+
if(!isRef)
525+
{
526+
ArgumentPrefix.Write("&");
527+
}
528+
524529
Context.Return.Write("(::{0}){1}{2}", @enum.QualifiedOriginalName,
525530
isRef ? string.Empty : "*", Context.Parameter.Name);
526531
return true;

src/Generator/Generators/CLI/CLITypePrinter.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,12 @@ public override TypePrinterResult VisitPointerType(PointerType pointer,
146146
Enumeration @enum;
147147
if (pointee.TryGetEnum(out @enum))
148148
{
149-
var typeName = @enum.Visit(this);
149+
var typeName = VisitDeclaration(@enum, quals);
150150

151151
// Skip one indirection if passed by reference
152-
if (Parameter != null && (Parameter.IsOut || Parameter.IsInOut)
153-
&& pointee == finalPointee)
152+
if (Parameter != null && (Parameter.Type.IsReference()
153+
|| ((Parameter.IsOut || Parameter.IsInOut)
154+
&& pointee == finalPointee)))
154155
return typeName;
155156

156157
return $"{typeName}*";

tests/CLI/CLI.Tests.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,13 @@ public void TestStdString()
1717
{
1818
Assert.AreEqual("test_test", new Date(0, 0, 0).TestStdString("test"));
1919
}
20+
21+
[Test]
22+
public void TestByRefEnumParam()
23+
{
24+
using (var byRefEnumParam = new TestByRefEnumParam())
25+
{
26+
Assert.AreEqual(EnumParam.E1, byRefEnumParam.GetPassedEnumParam(EnumParam.E1));
27+
}
28+
}
2029
}

tests/CLI/CLI.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,9 @@ IncompleteStruct* createIncompleteStruct()
2525
DLL_API void useIncompleteStruct(IncompleteStruct * a)
2626
{
2727
return;
28-
}
28+
}
29+
30+
EnumParam TestByRefEnumParam::GetPassedEnumParam(EnumParam & e)
31+
{
32+
return e;
33+
}

tests/CLI/CLI.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,16 @@ struct CompleteIncompleteStruct;
5555
typedef struct IncompleteStruct IncompleteStruct;
5656

5757
DLL_API IncompleteStruct* createIncompleteStruct();
58-
DLL_API void useIncompleteStruct(IncompleteStruct* a);
58+
DLL_API void useIncompleteStruct(IncompleteStruct* a);
59+
60+
enum EnumParam
61+
{
62+
E1,
63+
E2
64+
};
65+
66+
class DLL_API TestByRefEnumParam
67+
{
68+
public:
69+
EnumParam GetPassedEnumParam(EnumParam& e);
70+
};

0 commit comments

Comments
 (0)