From 86005ab45c3db8093e03a93fdc2721918e3a0003 Mon Sep 17 00:00:00 2001
From: josetr <37419832+josetr@users.noreply.github.com>
Date: Thu, 30 Jun 2022 21:04:57 +0100
Subject: [PATCH] Fix FunctionToStaticMethod bug

---
 src/Generator/Passes/CheckAbiParameters.cs      |  3 ++-
 src/Generator/Passes/MoveFunctionToClassPass.cs |  3 ++-
 tests/CSharp/CSharp.Tests.cs                    | 10 ++++++++++
 tests/CSharp/CSharp.cpp                         |  6 ++++++
 tests/CSharp/CSharp.h                           |  8 ++++++++
 5 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/Generator/Passes/CheckAbiParameters.cs b/src/Generator/Passes/CheckAbiParameters.cs
index 701c607c..a6360960 100644
--- a/src/Generator/Passes/CheckAbiParameters.cs
+++ b/src/Generator/Passes/CheckAbiParameters.cs
@@ -1,5 +1,6 @@
 using CppSharp.AST;
 using CppSharp.AST.Extensions;
+using CppSharp.Extensions;
 using System.Linq;
 
 namespace CppSharp.Passes
@@ -32,7 +33,7 @@ namespace CppSharp.Passes
 
             var isReturnIndirect = function.IsReturnIndirect || (
                     Context.ParserOptions.IsMicrosoftAbi &&
-                    function is Method &&
+                    function is Method m && m.IsNativeMethod() &&
                     !function.ReturnType.Type.Desugar().IsAddress() &&
                     function.ReturnType.Type.Desugar().TryGetDeclaration(out Class returnTypeDecl) &&
                     returnTypeDecl.IsPOD &&
diff --git a/src/Generator/Passes/MoveFunctionToClassPass.cs b/src/Generator/Passes/MoveFunctionToClassPass.cs
index b6b11c61..00a2ddc8 100644
--- a/src/Generator/Passes/MoveFunctionToClassPass.cs
+++ b/src/Generator/Passes/MoveFunctionToClassPass.cs
@@ -23,7 +23,8 @@ namespace CppSharp.Passes
                 Namespace = @class,
                 OperatorKind = function.OperatorKind,
                 OriginalFunction = null,
-                IsStatic = true
+                Conversion = MethodConversionKind.FunctionToStaticMethod,
+                IsStatic = true,
             };
 
             if (method.IsOperator)
diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs
index 5aa39e73..41394621 100644
--- a/tests/CSharp/CSharp.Tests.cs
+++ b/tests/CSharp/CSharp.Tests.cs
@@ -1883,4 +1883,14 @@ public unsafe class CSharpTests
             Assert.That((short)c, Is.EqualTo(100));
         }
     }
+
+    [Test]
+    public void TestFunctionToInstanceMethod()
+    {
+        Assert.That(CSharp.CSharp.TestFunctionToInstanceMethod(new FTIStruct()).A, Is.EqualTo(6));
+        Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6));
+        Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodRefStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6));
+        Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodConstStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6));
+        Assert.That(CSharp.CSharp.TestFunctionToInstanceMethodConstRefStruct(new FTIStruct(), new FTIStruct() { A = 6 }), Is.EqualTo(6));
+    }
 }
diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp
index 64716b44..372a0e82 100644
--- a/tests/CSharp/CSharp.cpp
+++ b/tests/CSharp/CSharp.cpp
@@ -1685,3 +1685,9 @@ const unsigned StructWithEmbeddedArrayOfStructObjectAlignmentOffsets[2]
     offsetof(StructWithEmbeddedArrayOfStructObjectAlignment, boolean),
     offsetof(StructWithEmbeddedArrayOfStructObjectAlignment, embedded_struct),
 };
+
+DLL_API FTIStruct TestFunctionToInstanceMethod(FTIStruct* bb) { return { 6 }; }
+DLL_API int TestFunctionToInstanceMethodStruct(FTIStruct* bb, FTIStruct defaultValue) { return defaultValue.a; }
+DLL_API int TestFunctionToInstanceMethodRefStruct(FTIStruct* bb, FTIStruct& defaultValue) { return defaultValue.a; }
+DLL_API int TestFunctionToInstanceMethodConstStruct(FTIStruct* bb, const FTIStruct defaultValue) { return defaultValue.a; }
+DLL_API int TestFunctionToInstanceMethodConstRefStruct(FTIStruct* bb, const FTIStruct& defaultValue) { return defaultValue.a; }
diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h
index faffaf76..2ccd8482 100644
--- a/tests/CSharp/CSharp.h
+++ b/tests/CSharp/CSharp.h
@@ -1526,3 +1526,11 @@ DLL_API const char* TestCSharpString(const char* in, CS_OUT const char** out);
 DLL_API const wchar_t* TestCSharpStringWide(const wchar_t* in, CS_OUT const wchar_t** out);
 DLL_API const char16_t* TestCSharpString16(const char16_t* in, CS_OUT const char16_t** out);    
 DLL_API const char32_t* TestCSharpString32(const char32_t* in, CS_OUT const char32_t** out);
+
+struct DLL_API FTIStruct { int a; };
+
+DLL_API FTIStruct TestFunctionToInstanceMethod(FTIStruct* bb);
+DLL_API int TestFunctionToInstanceMethodStruct(FTIStruct* bb, FTIStruct defaultValue);
+DLL_API int TestFunctionToInstanceMethodRefStruct(FTIStruct* bb, FTIStruct& defaultValue);
+DLL_API int TestFunctionToInstanceMethodConstStruct(FTIStruct* bb, const FTIStruct defaultValue);
+DLL_API int TestFunctionToInstanceMethodConstRefStruct(FTIStruct* bb, const FTIStruct& defaultValue);