Merge pull request #4466 from ethereum/tupleNotEmpty

Disallow empty tuple components.
This commit is contained in:
chriseth
2018-07-10 21:03:30 +02:00
committed by GitHub
10 changed files with 27 additions and 49 deletions
+1 -1
View File
@@ -7916,7 +7916,7 @@ BOOST_AUTO_TEST_CASE(string_tuples)
return (h(), "def");
}
function h() public returns (string) {
return ("abc",);
return ("abc");
}
}
)";
@@ -1,13 +1,13 @@
contract C {
function f() public {
uint a = (1);
(uint b,) = (uint8(1),);
(uint b,) = uint8(1);
(uint c, uint d) = (uint32(1), 2 + a);
(uint e,) = (uint64(1), 2, b);
a;b;c;d;e;
}
}
// ----
// Warning: (69-92): Different number of components on the left hand side (2) than on the right hand side (1).
// Warning: (149-178): Different number of components on the left hand side (2) than on the right hand side (3).
// Warning: (17-204): Function state mutability can be restricted to pure
// Warning: (69-89): Different number of components on the left hand side (2) than on the right hand side (1).
// Warning: (146-175): Different number of components on the left hand side (2) than on the right hand side (3).
// Warning: (17-201): Function state mutability can be restricted to pure
@@ -1,16 +1,16 @@
contract C {
function f() public {
uint a = (1);
(uint b,) = (1,);
(uint b,) = 1;
(uint c, uint d) = (1, 2 + a);
(uint e,) = (1, 2, b);
(a) = 3;
}
}
// ----
// Warning: (54-70): Different number of components on the left hand side (2) than on the right hand side (1).
// Warning: (107-128): Different number of components on the left hand side (2) than on the right hand side (3).
// Warning: (75-81): Unused local variable.
// Warning: (83-89): Unused local variable.
// Warning: (108-114): Unused local variable.
// Warning: (14-143): Function state mutability can be restricted to pure
// Warning: (54-67): Different number of components on the left hand side (2) than on the right hand side (1).
// Warning: (104-125): Different number of components on the left hand side (2) than on the right hand side (3).
// Warning: (72-78): Unused local variable.
// Warning: (80-86): Unused local variable.
// Warning: (105-111): Unused local variable.
// Warning: (14-140): Function state mutability can be restricted to pure
@@ -8,5 +8,5 @@ contract C {
}
}
// ----
// Warning: (162-165): Tuple component cannot be empty.
// Warning: (181-184): Tuple component cannot be empty.
// TypeError: (162-165): Tuple component cannot be empty.
// TypeError: (181-184): Tuple component cannot be empty.
@@ -1,11 +0,0 @@
pragma experimental "v0.5.0";
contract C {
function f() private pure {}
function a() public pure {
bool x = true;
bool y = true;
(x) ? (f(), y = false) : (f(), y = false);
}
}
// ----
// TypeError: (168-171): Tuple component cannot be empty.
@@ -8,6 +8,6 @@ contract C {
}
}
// ----
// Warning: (146-149): Tuple component cannot be empty.
// Warning: (151-154): Tuple component cannot be empty.
// TypeError: (146-149): Tuple component cannot be empty.
// TypeError: (151-154): Tuple component cannot be empty.
// TypeError: (145-155): Type tuple(tuple(),tuple()) is not implicitly convertible to expected type tuple(uint256,uint256).
@@ -1,11 +0,0 @@
pragma experimental "v0.5.0";
contract C {
function f() private pure {}
function a() public {
uint x;
uint y;
(x, y) = (f(), f());
}
}
// ----
// TypeError: (152-155): Tuple component cannot be empty.
@@ -0,0 +1,8 @@
contract C {
function f() public pure {
uint a;
(a,) = (uint(1),);
}
}
// ----
// TypeError: (60-70): Tuple component cannot be empty.