From a115bd9a51acfeac976d9e5ef31e9409a0eb4cb0 Mon Sep 17 00:00:00 2001 From: Elias Holzer Date: Fri, 11 Apr 2014 16:33:10 +0200 Subject: [PATCH] Overload comparison operators only if their native counterpart return bool. --- .../Passes/CheckOperatorsOverloads.cs | 19 +++++++++++-------- tests/Basic/Basic.h | 6 ++++++ 2 files changed, 17 insertions(+), 8 deletions(-) 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);