From 165857b1d40ecb8a1bcf40eec9e371370ebe2541 Mon Sep 17 00:00:00 2001 From: Balajiganapathi S Date: Sat, 28 Oct 2017 16:33:11 +0530 Subject: Allow constant integer variables as array lengths. --- libsolidity/analysis/ConstantEvaluator.cpp | 18 ++++++++++++++++++ libsolidity/analysis/ConstantEvaluator.h | 1 + 2 files changed, 19 insertions(+) (limited to 'libsolidity') diff --git a/libsolidity/analysis/ConstantEvaluator.cpp b/libsolidity/analysis/ConstantEvaluator.cpp index bc3b7cf1..50044eb6 100644 --- a/libsolidity/analysis/ConstantEvaluator.cpp +++ b/libsolidity/analysis/ConstantEvaluator.cpp @@ -74,3 +74,21 @@ void ConstantEvaluator::endVisit(Literal const& _literal) if (!_literal.annotation().type) m_errorReporter.fatalTypeError(_literal.location(), "Invalid literal value."); } + +void ConstantEvaluator::endVisit(Identifier const& _identifier) +{ + VariableDeclaration const *variableDeclaration = dynamic_cast(_identifier.annotation().referencedDeclaration); + if (!variableDeclaration) + return; + if (!variableDeclaration->isConstant()) + m_errorReporter.fatalTypeError(_identifier.location(), "Identifier must be declared constant."); + + ASTPointer value = variableDeclaration->value(); + if (value) + { + if (!value->annotation().type) + ConstantEvaluator e(*value, m_errorReporter); + + _identifier.annotation().type = value->annotation().type; + } +} diff --git a/libsolidity/analysis/ConstantEvaluator.h b/libsolidity/analysis/ConstantEvaluator.h index 90bceb5d..42ccfe7e 100644 --- a/libsolidity/analysis/ConstantEvaluator.h +++ b/libsolidity/analysis/ConstantEvaluator.h @@ -48,6 +48,7 @@ private: virtual void endVisit(BinaryOperation const& _operation); virtual void endVisit(UnaryOperation const& _operation); virtual void endVisit(Literal const& _literal); + virtual void endVisit(Identifier const& _identifier); ErrorReporter& m_errorReporter; }; -- cgit v1.2.3