Browse Source

Corrected the overloading of << and >> by making sure the second parameter is implicitly convertible to int.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/39/head
Dimitar Dobrev 12 years ago
parent
commit
90732c6ca7
  1. 14
      src/Generator/Passes/CheckOperatorsOverloads.cs

14
src/Generator/Passes/CheckOperatorsOverloads.cs

@ -43,7 +43,7 @@ namespace CppSharp.Passes
{ {
foreach (var @operator in @class.Operators) foreach (var @operator in @class.Operators)
{ {
if (!IsValidOperatorOverload(@operator.OperatorKind)) if (!IsValidOperatorOverload(@operator))
{ {
Driver.Diagnostics.EmitError(DiagnosticId.InvalidOperatorOverload, Driver.Diagnostics.EmitError(DiagnosticId.InvalidOperatorOverload,
"Invalid operator overload {0}::{1}", "Invalid operator overload {0}::{1}",
@ -130,11 +130,11 @@ namespace CppSharp.Passes
return CXXOperatorKind.None; return CXXOperatorKind.None;
} }
static bool IsValidOperatorOverload(CXXOperatorKind kind) static bool IsValidOperatorOverload(Method @operator)
{ {
// These follow the order described in MSDN (Overloadable Operators). // These follow the order described in MSDN (Overloadable Operators).
switch (kind) switch (@operator.OperatorKind)
{ {
// These unary operators can be overloaded // These unary operators can be overloaded
case CXXOperatorKind.Plus: case CXXOperatorKind.Plus:
@ -151,8 +151,6 @@ namespace CppSharp.Passes
case CXXOperatorKind.Amp: case CXXOperatorKind.Amp:
case CXXOperatorKind.Pipe: case CXXOperatorKind.Pipe:
case CXXOperatorKind.Caret: case CXXOperatorKind.Caret:
case CXXOperatorKind.LessLess:
case CXXOperatorKind.GreaterGreater:
// The comparison operators can be overloaded // The comparison operators can be overloaded
case CXXOperatorKind.EqualEqual: case CXXOperatorKind.EqualEqual:
@ -163,6 +161,12 @@ namespace CppSharp.Passes
case CXXOperatorKind.GreaterEqual: case CXXOperatorKind.GreaterEqual:
return true; return true;
case CXXOperatorKind.LessLess:
case CXXOperatorKind.GreaterGreater:
PrimitiveType primitiveType;
return @operator.Parameters.Last().Type.IsPrimitiveType(out primitiveType) &&
primitiveType == PrimitiveType.Int32;
// Assignment operators cannot be overloaded // Assignment operators cannot be overloaded
case CXXOperatorKind.PlusEqual: case CXXOperatorKind.PlusEqual:
case CXXOperatorKind.MinusEqual: case CXXOperatorKind.MinusEqual:

Loading…
Cancel
Save