diff --git a/src/Generator/Passes/CheckOperatorsOverloads.cs b/src/Generator/Passes/CheckOperatorsOverloads.cs index d629c265..565cf571 100644 --- a/src/Generator/Passes/CheckOperatorsOverloads.cs +++ b/src/Generator/Passes/CheckOperatorsOverloads.cs @@ -180,15 +180,18 @@ namespace CppSharp.Passes // The array indexing operator can be overloaded case CXXOperatorKind.Subscript: - // The comparison operators can be overloaded - case CXXOperatorKind.EqualEqual: - case CXXOperatorKind.ExclaimEqual: - case CXXOperatorKind.Less: - case CXXOperatorKind.Greater: - case CXXOperatorKind.LessEqual: - case CXXOperatorKind.GreaterEqual: + // The conversion operator can be overloaded case CXXOperatorKind.Conversion: - return true; + return true; + + // The comparison operators can be overloaded if their return type is bool + case CXXOperatorKind.EqualEqual: + case CXXOperatorKind.ExclaimEqual: + case CXXOperatorKind.Less: + case CXXOperatorKind.Greater: + case CXXOperatorKind.LessEqual: + case CXXOperatorKind.GreaterEqual: + return @operator.ReturnType.Type.IsPrimitiveType(PrimitiveType.Bool); // Only prefix operators can be overloaded case CXXOperatorKind.PlusPlus: diff --git a/tests/Basic/Basic.h b/tests/Basic/Basic.h index 39746873..1c10b8cb 100644 --- a/tests/Basic/Basic.h +++ b/tests/Basic/Basic.h @@ -229,6 +229,12 @@ DLL_API TestMoveOperatorToClass operator+(const TestMoveOperatorToClass& b1, return b; } +// Not a valid operator overload for Foo2 in managed code - comparison operators need to return bool. +DLL_API int operator==(const Foo2& a, const Foo2& b) +{ + return 0; +} + // Tests delegates typedef int (*DelegateInGlobalNamespace)(int);