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);