Fix ConstantEvaluator to correctly handle single element tuples.

This commit is contained in:
Daniel Kirchner 2018-04-11 17:27:06 +02:00
parent fdcbf1337a
commit cb548f6f53
6 changed files with 43 additions and 0 deletions

View File

@ -4,6 +4,7 @@ Features:
* Code Generator: Initialize arrays without using ``msize()``.
* Code Generator: More specialized and thus optimized implementation for ``x.push(...)``
* Commandline interface: Error when missing or inaccessible file detected. Suppress it with the ``--ignore-missing`` flag.
* Constant Evaluator: Fix evaluation of single element tuples.
* General: Limit the number of errors output in a single run to 256.
* General: Support accessing dynamic return data in post-byzantium EVMs.
* Interfaces: Allow overriding external functions in interfaces with public in an implementing contract.

View File

@ -87,6 +87,12 @@ void ConstantEvaluator::endVisit(Identifier const& _identifier)
setType(_identifier, type(*value));
}
void ConstantEvaluator::endVisit(TupleExpression const& _tuple)
{
if (!_tuple.isInlineArray() && _tuple.components().size() == 1)
setType(_tuple, type(*_tuple.components().front()));
}
void ConstantEvaluator::setType(ASTNode const& _node, TypePointer const& _type)
{
if (_type && _type->category() == Type::Category::RationalNumber)

View File

@ -56,6 +56,7 @@ private:
virtual void endVisit(UnaryOperation const& _operation);
virtual void endVisit(Literal const& _literal);
virtual void endVisit(Identifier const& _identifier);
virtual void endVisit(TupleExpression const& _tuple);
void setType(ASTNode const& _node, TypePointer const& _type);
TypePointer type(ASTNode const& _node);

View File

@ -0,0 +1,5 @@
contract C {
uint[[2]] a15;
}
// ----
// TypeError: (22-25): Invalid array length, expected integer literal or constant expression.

View File

@ -0,0 +1,25 @@
contract C {
uint constant L1 = (2);
uint constant L2 = ((2));
uint constant L3 = ((((2))));
uint constant L4 = (2 + 1);
uint constant L5 = ((2 + 1));
uint constant L6 = (((2) + ((1))));
uint constant L7 = (2 + 1) / 1;
uint constant L8 = (2 + ((1))) / (1);
uint[L1] a1;
uint[L2] a2;
uint[L3] a3;
uint[L4] a4;
uint[L5] a5;
uint[L6] a6;
uint[L7] a7;
uint[L8] a8;
uint[(2)] a9;
uint[(2 + 1)] a10;
uint[(2 + 1) + 1] a11;
uint[((2) + 1) + 1] a12;
uint[(2 + 1) + ((1))] a13;
uint[(((2) + 1)) + (((1)))] a14;
uint[((((2) + 1)) + (((1))))%1] a15;
}

View File

@ -0,0 +1,5 @@
contract C {
uint[(1,2)] a15;
}
// ----
// TypeError: (22-27): Invalid array length, expected integer literal or constant expression.