diff options
author | chriseth <chris@ethereum.org> | 2017-03-08 23:10:40 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-08 23:10:40 +0800 |
commit | 69a06fe1633c3e5204e6ae4276dd985eae29acfe (patch) | |
tree | 6aea223a9be80c9e26c8692d5ae4dfbb58d030eb | |
parent | 78f7dd23446fb0bd4bff1847d560df4fac0e1159 (diff) | |
parent | c7d61a2c6afb88787174bbb6a7bce934deefef70 (diff) | |
download | dexon-solidity-69a06fe1633c3e5204e6ae4276dd985eae29acfe.tar dexon-solidity-69a06fe1633c3e5204e6ae4276dd985eae29acfe.tar.gz dexon-solidity-69a06fe1633c3e5204e6ae4276dd985eae29acfe.tar.bz2 dexon-solidity-69a06fe1633c3e5204e6ae4276dd985eae29acfe.tar.lz dexon-solidity-69a06fe1633c3e5204e6ae4276dd985eae29acfe.tar.xz dexon-solidity-69a06fe1633c3e5204e6ae4276dd985eae29acfe.tar.zst dexon-solidity-69a06fe1633c3e5204e6ae4276dd985eae29acfe.zip |
Merge pull request #1749 from ethereum/compoundForTuples
Disallow compound assignment for tuples.
-rw-r--r-- | Changelog.md | 1 | ||||
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 5 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 12 |
3 files changed, 18 insertions, 0 deletions
diff --git a/Changelog.md b/Changelog.md index 178bd39f..8900eab7 100644 --- a/Changelog.md +++ b/Changelog.md @@ -12,6 +12,7 @@ Bugfixes: * Commandline interface: Do not try creating paths ``.`` and ``..``. * Parser: Disallow octal literals. * Type system: Fix a crash caused by continuing on fatal errors in the code. + * Type system: Disallow compound assignment for tuples. * Type system: Detect cyclic dependencies between constants. * Type system: Disallow arrays with negative length. * Type system: Fix a crash related to invalid binary operators. diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 93b183a2..acceffda 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -947,6 +947,11 @@ bool TypeChecker::visit(Assignment const& _assignment) _assignment.annotation().type = t; if (TupleType const* tupleType = dynamic_cast<TupleType const*>(t.get())) { + if (_assignment.assignmentOperator() != Token::Assign) + typeError( + _assignment.location(), + "Compound assignment is not allowed for tuple types." + ); // Sequenced assignments of tuples is not valid, make the result a "void" type. _assignment.annotation().type = make_shared<TupleType>(); expectType(_assignment.rightHandSide(), *tupleType); diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 3d82fc70..da3e81ed 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -2992,6 +2992,18 @@ BOOST_AUTO_TEST_CASE(tuple_assignment_from_void_function) CHECK_ERROR(text, TypeError, "Cannot declare variable with void (empty tuple) type."); } +BOOST_AUTO_TEST_CASE(tuple_compound_assignment) +{ + char const* text = R"( + contract C { + function f() returns (uint a, uint b) { + (a, b) += (1, 1); + } + } + )"; + CHECK_ERROR(text, TypeError, "Compound assignment is not allowed for tuple types."); +} + BOOST_AUTO_TEST_CASE(member_access_parser_ambiguity) { char const* text = R"( |