mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add tests for multi variable declaration statement.
This commit is contained in:
parent
67d208d144
commit
c781baf733
@ -7610,6 +7610,33 @@ BOOST_AUTO_TEST_CASE(multi_variable_declaration)
|
|||||||
ABI_CHECK(callContractFunction("f()", encodeArgs()), encodeArgs(true));
|
ABI_CHECK(callContractFunction("f()", encodeArgs()), encodeArgs(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(typed_multi_variable_declaration)
|
||||||
|
{
|
||||||
|
char const* sourceCode = R"(
|
||||||
|
contract C {
|
||||||
|
struct S { uint x; }
|
||||||
|
S s;
|
||||||
|
function g() internal returns (uint, S storage, uint) {
|
||||||
|
s.x = 7;
|
||||||
|
return (1, s, 2);
|
||||||
|
}
|
||||||
|
function f() returns (bool) {
|
||||||
|
(uint x1, S storage y1, uint z1) = g();
|
||||||
|
if (x1 != 1 || y1.x != 7 || z1 != 2) return false;
|
||||||
|
(, S storage y2,) = g();
|
||||||
|
if (y2.x != 7) return false;
|
||||||
|
(uint x2,,) = g();
|
||||||
|
if (x2 != 1) return false;
|
||||||
|
(,,uint z2) = g();
|
||||||
|
if (z2 != 2) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
compileAndRun(sourceCode);
|
||||||
|
ABI_CHECK(callContractFunction("f()", encodeArgs()), encodeArgs(true));
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(tuples)
|
BOOST_AUTO_TEST_CASE(tuples)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
contract C {
|
||||||
|
function f() internal returns (uint) {
|
||||||
|
(uint a) = f();
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
contract D {
|
||||||
|
struct S { uint a; uint b; }
|
||||||
|
}
|
||||||
|
contract C {
|
||||||
|
function f() internal returns (uint, uint, uint, D.S[20] storage, uint) {
|
||||||
|
(,,,D.S[10*2] storage x,) = f();
|
||||||
|
x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning: (110-117): This variable is of storage pointer type and might be returned without assignment. This can cause storage corruption. Assign the variable (potentially from itself) to remove this warning.
|
@ -0,0 +1,8 @@
|
|||||||
|
contract C {
|
||||||
|
function f() internal returns (uint, uint, uint, uint) {
|
||||||
|
var (uint a, uint b,,) = f();
|
||||||
|
a; b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// ParserError: (81-85): Expected identifier but got 'uint'
|
@ -0,0 +1,9 @@
|
|||||||
|
contract C {
|
||||||
|
function f() internal returns (string memory, uint, uint, uint) {
|
||||||
|
(uint a, string memory b,,) = f();
|
||||||
|
a; b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// TypeError: (85-118): Type string memory is not implicitly convertible to expected type uint256.
|
||||||
|
// TypeError: (85-118): Type uint256 is not implicitly convertible to expected type string memory.
|
@ -0,0 +1,12 @@
|
|||||||
|
pragma experimental "v0.5.0";
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
function f() internal {
|
||||||
|
{
|
||||||
|
(uint a, uint b, uint c) = (1, 2, 3);
|
||||||
|
}
|
||||||
|
a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// DeclarationError: (130-131): Undeclared identifier.
|
@ -0,0 +1,13 @@
|
|||||||
|
pragma experimental "v0.5.0";
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
function f() internal {
|
||||||
|
{
|
||||||
|
(uint a, uint b, uint c) = (a, b, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// DeclarationError: (110-111): Undeclared identifier. Did you mean "a"?
|
||||||
|
// DeclarationError: (113-114): Undeclared identifier. Did you mean "b"?
|
||||||
|
// DeclarationError: (116-117): Undeclared identifier. Did you mean "c"?
|
@ -0,0 +1,12 @@
|
|||||||
|
contract C {
|
||||||
|
function f() internal returns (uint, uint, uint, uint) {
|
||||||
|
(uint a, uint b,,) = f();
|
||||||
|
a; b;
|
||||||
|
}
|
||||||
|
function g() internal returns (bytes memory, string storage) {
|
||||||
|
(bytes memory a, string storage b) = g();
|
||||||
|
a; b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning: (163-169): This variable is of storage pointer type and might be returned without assignment. This can cause storage corruption. Assign the variable (potentially from itself) to remove this warning.
|
@ -0,0 +1,9 @@
|
|||||||
|
contract C {
|
||||||
|
struct S { function() returns (S storage)[] x; }
|
||||||
|
S s;
|
||||||
|
function f() internal pure returns (uint, uint, uint, S storage, uint, uint) {
|
||||||
|
(,,,s.x[2](),,) = f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// TypeError: (160-168): Expression has to be an lvalue.
|
Loading…
Reference in New Issue
Block a user