aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/ConstantEvaluator.cpp
diff options
context:
space:
mode:
authorAlex Beregszaszi <alex@rtfs.hu>2017-10-04 17:59:21 +0800
committerAlex Beregszaszi <alex@rtfs.hu>2017-10-20 18:59:18 +0800
commit3a8324266f470b18763054ed5caa791e8e8410a7 (patch)
tree1246f7a431a8e380d0348ba239e0a412fd69182f /libsolidity/analysis/ConstantEvaluator.cpp
parent4e7d1440ab84ba0566c7c75ff61b2f9e70738ef4 (diff)
downloaddexon-solidity-3a8324266f470b18763054ed5caa791e8e8410a7.tar
dexon-solidity-3a8324266f470b18763054ed5caa791e8e8410a7.tar.gz
dexon-solidity-3a8324266f470b18763054ed5caa791e8e8410a7.tar.bz2
dexon-solidity-3a8324266f470b18763054ed5caa791e8e8410a7.tar.lz
dexon-solidity-3a8324266f470b18763054ed5caa791e8e8410a7.tar.xz
dexon-solidity-3a8324266f470b18763054ed5caa791e8e8410a7.tar.zst
dexon-solidity-3a8324266f470b18763054ed5caa791e8e8410a7.zip
More detailed errors for invalid array lengths (such as division by zero).
Diffstat (limited to 'libsolidity/analysis/ConstantEvaluator.cpp')
-rw-r--r--libsolidity/analysis/ConstantEvaluator.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/libsolidity/analysis/ConstantEvaluator.cpp b/libsolidity/analysis/ConstantEvaluator.cpp
index 6636ad97..bc3b7cf1 100644
--- a/libsolidity/analysis/ConstantEvaluator.cpp
+++ b/libsolidity/analysis/ConstantEvaluator.cpp
@@ -28,6 +28,7 @@ using namespace std;
using namespace dev;
using namespace dev::solidity;
+/// FIXME: this is pretty much a copy of TypeChecker::endVisit(BinaryOperation)
void ConstantEvaluator::endVisit(UnaryOperation const& _operation)
{
TypePointer const& subType = _operation.subExpression().annotation().type;
@@ -37,6 +38,7 @@ void ConstantEvaluator::endVisit(UnaryOperation const& _operation)
_operation.annotation().type = t;
}
+/// FIXME: this is pretty much a copy of TypeChecker::endVisit(BinaryOperation)
void ConstantEvaluator::endVisit(BinaryOperation const& _operation)
{
TypePointer const& leftType = _operation.leftExpression().annotation().type;
@@ -46,9 +48,24 @@ void ConstantEvaluator::endVisit(BinaryOperation const& _operation)
if (!dynamic_cast<RationalNumberType const*>(rightType.get()))
m_errorReporter.fatalTypeError(_operation.rightExpression().location(), "Invalid constant expression.");
TypePointer commonType = leftType->binaryOperatorResult(_operation.getOperator(), rightType);
- if (Token::isCompareOp(_operation.getOperator()))
- commonType = make_shared<BoolType>();
- _operation.annotation().type = commonType;
+ if (!commonType)
+ {
+ m_errorReporter.typeError(
+ _operation.location(),
+ "Operator " +
+ string(Token::toString(_operation.getOperator())) +
+ " not compatible with types " +
+ leftType->toString() +
+ " and " +
+ rightType->toString()
+ );
+ commonType = leftType;
+ }
+ _operation.annotation().commonType = commonType;
+ _operation.annotation().type =
+ Token::isCompareOp(_operation.getOperator()) ?
+ make_shared<BoolType>() :
+ commonType;
}
void ConstantEvaluator::endVisit(Literal const& _literal)