aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-03-08 23:10:40 +0800
committerGitHub <noreply@github.com>2017-03-08 23:10:40 +0800
commit69a06fe1633c3e5204e6ae4276dd985eae29acfe (patch)
tree6aea223a9be80c9e26c8692d5ae4dfbb58d030eb
parent78f7dd23446fb0bd4bff1847d560df4fac0e1159 (diff)
parentc7d61a2c6afb88787174bbb6a7bce934deefef70 (diff)
downloaddexon-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.md1
-rw-r--r--libsolidity/analysis/TypeChecker.cpp5
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp12
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"(