diff options
author | Christian <c@ethdev.com> | 2014-11-04 22:01:07 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2014-11-06 09:22:24 +0800 |
commit | 29c9a7aed90e415bcf5eebb16228336576643a3f (patch) | |
tree | 5679973a3098dafbd4aa97e2a26bbb8b05932178 /ExpressionCompiler.cpp | |
parent | de493c673f2e850505d79185d104012825a7eabc (diff) | |
download | dexon-solidity-29c9a7aed90e415bcf5eebb16228336576643a3f.tar.gz dexon-solidity-29c9a7aed90e415bcf5eebb16228336576643a3f.tar.zst dexon-solidity-29c9a7aed90e415bcf5eebb16228336576643a3f.zip |
Allow implicit type conversions for comparisons.
Diffstat (limited to 'ExpressionCompiler.cpp')
-rw-r--r-- | ExpressionCompiler.cpp | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp index d23579b1..a7d87221 100644 --- a/ExpressionCompiler.cpp +++ b/ExpressionCompiler.cpp @@ -113,7 +113,7 @@ bool ExpressionCompiler::visit(BinaryOperation& _binaryOperation) { Expression& leftExpression = _binaryOperation.getLeftExpression(); Expression& rightExpression = _binaryOperation.getRightExpression(); - Type const& resultType = *_binaryOperation.getType(); + Type const& commonType = _binaryOperation.getCommonType(); Token::Value const op = _binaryOperation.getOperator(); if (op == Token::AND || op == Token::OR) @@ -121,23 +121,16 @@ bool ExpressionCompiler::visit(BinaryOperation& _binaryOperation) // special case: short-circuiting appendAndOrOperatorCode(_binaryOperation); } - else if (Token::isCompareOp(op)) - { - leftExpression.accept(*this); - rightExpression.accept(*this); - - // the types to compare have to be the same, but the resulting type is always bool - if (asserts(*leftExpression.getType() == *rightExpression.getType())) - BOOST_THROW_EXCEPTION(InternalCompilerError()); - appendCompareOperatorCode(op, *leftExpression.getType()); - } else { leftExpression.accept(*this); - cleanHigherOrderBitsIfNeeded(*leftExpression.getType(), resultType); + cleanHigherOrderBitsIfNeeded(*leftExpression.getType(), commonType); rightExpression.accept(*this); - cleanHigherOrderBitsIfNeeded(*rightExpression.getType(), resultType); - appendOrdinaryBinaryOperatorCode(op, resultType); + cleanHigherOrderBitsIfNeeded(*rightExpression.getType(), commonType); + if (Token::isCompareOp(op)) + appendCompareOperatorCode(op, commonType); + else + appendOrdinaryBinaryOperatorCode(op, commonType); } // do not visit the child nodes, we already did that explicitly |