mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #4042 from ethereum/revert-4003-bool_vars_comparison
Revert "BREAKING: Bool variables should not allow arithmetic comparison"
This commit is contained in:
commit
64fc3d5d00
@ -1,8 +1,3 @@
|
|||||||
### 0.5.0 (unreleased)
|
|
||||||
Features:
|
|
||||||
* Type Checker: Disallow arithmetic operations for Boolean variables.
|
|
||||||
|
|
||||||
|
|
||||||
### 0.4.24 (unreleased)
|
### 0.4.24 (unreleased)
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
|
@ -1359,7 +1359,7 @@ TypePointer BoolType::binaryOperatorResult(Token::Value _operator, TypePointer c
|
|||||||
{
|
{
|
||||||
if (category() != _other->category())
|
if (category() != _other->category())
|
||||||
return TypePointer();
|
return TypePointer();
|
||||||
if (_operator == Token::Equal || _operator == Token::NotEqual || _operator == Token::And || _operator == Token::Or)
|
if (Token::isCompareOp(_operator) || _operator == Token::And || _operator == Token::Or)
|
||||||
return _other;
|
return _other;
|
||||||
else
|
else
|
||||||
return TypePointer();
|
return TypePointer();
|
||||||
|
@ -472,7 +472,11 @@ void SMTChecker::compareOperation(BinaryOperation const& _op)
|
|||||||
solUnimplementedAssert(SSAVariable::isBool(_op.annotation().commonType->category()), "Operation not yet supported");
|
solUnimplementedAssert(SSAVariable::isBool(_op.annotation().commonType->category()), "Operation not yet supported");
|
||||||
value = make_shared<smt::Expression>(
|
value = make_shared<smt::Expression>(
|
||||||
op == Token::Equal ? (left == right) :
|
op == Token::Equal ? (left == right) :
|
||||||
/*op == Token::NotEqual*/ (left != right)
|
op == Token::NotEqual ? (left != right) :
|
||||||
|
op == Token::LessThan ? (!left && right) :
|
||||||
|
op == Token::LessThanOrEqual ? (!left || right) :
|
||||||
|
op == Token::GreaterThan ? (left && !right) :
|
||||||
|
/*op == Token::GreaterThanOrEqual*/ (left || !right)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// TODO: check that other values for op are not possible.
|
// TODO: check that other values for op are not possible.
|
||||||
|
@ -388,6 +388,35 @@ BOOST_AUTO_TEST_CASE(bool_simple)
|
|||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
CHECK_SUCCESS_NO_WARNINGS(text);
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f(bool x) public pure {
|
||||||
|
bool y;
|
||||||
|
assert(x <= y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_WARNING(text, "Assertion violation happens here");
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f(bool x) public pure {
|
||||||
|
bool y;
|
||||||
|
assert(x >= y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f(bool x) public pure {
|
||||||
|
require(x);
|
||||||
|
bool y;
|
||||||
|
assert(x > y);
|
||||||
|
assert(y < x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_SUCCESS_NO_WARNINGS(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(bool_int_mixed)
|
BOOST_AUTO_TEST_CASE(bool_int_mixed)
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
contract C {
|
|
||||||
function f(bool a, bool b) public pure {
|
|
||||||
bool c;
|
|
||||||
// OK
|
|
||||||
c = !a;
|
|
||||||
c = !b;
|
|
||||||
c = a == b;
|
|
||||||
c = a != b;
|
|
||||||
c = a || b;
|
|
||||||
c = a && b;
|
|
||||||
|
|
||||||
// Not OK
|
|
||||||
c = a > b;
|
|
||||||
c = a < b;
|
|
||||||
c = a >= b;
|
|
||||||
c = a <= b;
|
|
||||||
c = a & b;
|
|
||||||
c = a | b;
|
|
||||||
c = a ^ b;
|
|
||||||
c = ~a;
|
|
||||||
c = ~b;
|
|
||||||
c = a + b;
|
|
||||||
c = a - b;
|
|
||||||
c = -a;
|
|
||||||
c = -b;
|
|
||||||
c = a * b;
|
|
||||||
c = a / b;
|
|
||||||
c = a ** b;
|
|
||||||
c = a % b;
|
|
||||||
c = a << b;
|
|
||||||
c = a >> b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ----
|
|
||||||
// TypeError: (231-236): Operator > not compatible with types bool and bool
|
|
||||||
// TypeError: (250-255): Operator < not compatible with types bool and bool
|
|
||||||
// TypeError: (269-275): Operator >= not compatible with types bool and bool
|
|
||||||
// TypeError: (289-295): Operator <= not compatible with types bool and bool
|
|
||||||
// TypeError: (309-314): Operator & not compatible with types bool and bool
|
|
||||||
// TypeError: (328-333): Operator | not compatible with types bool and bool
|
|
||||||
// TypeError: (347-352): Operator ^ not compatible with types bool and bool
|
|
||||||
// TypeError: (366-368): Unary operator ~ cannot be applied to type bool
|
|
||||||
// TypeError: (382-384): Unary operator ~ cannot be applied to type bool
|
|
||||||
// TypeError: (398-403): Operator + not compatible with types bool and bool
|
|
||||||
// TypeError: (417-422): Operator - not compatible with types bool and bool
|
|
||||||
// TypeError: (436-438): Unary operator - cannot be applied to type bool
|
|
||||||
// TypeError: (452-454): Unary operator - cannot be applied to type bool
|
|
||||||
// TypeError: (468-473): Operator * not compatible with types bool and bool
|
|
||||||
// TypeError: (487-492): Operator / not compatible with types bool and bool
|
|
||||||
// TypeError: (506-512): Operator ** not compatible with types bool and bool
|
|
||||||
// TypeError: (526-531): Operator % not compatible with types bool and bool
|
|
||||||
// TypeError: (545-551): Operator << not compatible with types bool and bool
|
|
||||||
// TypeError: (565-571): Operator >> not compatible with types bool and bool
|
|
Loading…
Reference in New Issue
Block a user