Destructuring assignments.

This commit is contained in:
chriseth
2015-10-15 17:38:42 +02:00
parent 7ebd536e79
commit 039b2a764f
11 changed files with 389 additions and 105 deletions
+42 -5
View File
@@ -5693,14 +5693,14 @@ BOOST_AUTO_TEST_CASE(tuples)
data[0] = 3;
uint a; uint b;
(a, b) = this.h();
if (a != 1 || b != 2) return 1;
if (a != 5 || b != 6) return 1;
uint[] storage c;
(a, b, c) = g();
if (a != 5 || b != 6 || c[0] != 3) return 2;
if (a != 1 || b != 2 || c[0] != 3) return 2;
(a, b) = (b, a);
if (a != 6 || b != 5) return 3;
(a, , b, ) = (8, 9, 10, 11, 12);
if (a != 8 || b != 10) return 3;
if (a != 2 || b != 1) return 3;
// (a, , b, ) = (8, 9, 10, 11, 12);
// if (a != 8 || b != 10) return 3;
}
}
)";
@@ -5708,6 +5708,42 @@ BOOST_AUTO_TEST_CASE(tuples)
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0)));
}
BOOST_AUTO_TEST_CASE(destructuring_assignment)
{
char const* sourceCode = R"(
contract C {
uint x = 7;
bytes data;
uint[] y;
uint[] arrayData;
function returnsArray() returns (uint[]) {
arrayData.length = 9;
arrayData[2] = 5;
arrayData[7] = 4;
return arrayData;
}
function f(bytes s) returns (uint) {
uint loc;
uint[] memArray;
(loc, x, y, data, arrayData[3]) = (8, 4, returnsArray(), s, 2);
if (loc != 8) return 1;
if (x != 4) return 2;
if (y.length != 9) return 3;
if (y[2] != 5) return 4;
if (y[7] != 4) return 5;
if (data.length != s.length) return 6;
if (data[3] != s[3]) return 7;
if (arrayData[3] != 2) return 8;
(memArray, loc) = (arrayData, 3);
if (loc != 3) return 9;
if (memArray.length != arrayData.length) return 10;
}
}
)";
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunction("f(bytes)", u256(0x20), u256(5), string("abcde")) == encodeArgs(u256(0)));
}
BOOST_AUTO_TEST_CASE(destructuring_assignment_wildcard)
{
char const* sourceCode = R"(
@@ -5732,6 +5768,7 @@ BOOST_AUTO_TEST_CASE(destructuring_assignment_wildcard)
compileAndRun(sourceCode);
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0)));
}
BOOST_AUTO_TEST_SUITE_END()
}