Merge pull request #3775 from federicobond/improve-error-fractional-shift

Improve error message when attempting to shift by fractional number
This commit is contained in:
chriseth 2018-03-28 11:16:44 +02:00 committed by GitHub
commit 3bb54e8bd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 1 deletions

View File

@ -12,6 +12,7 @@ Bugfixes:
* Commandline interface: Support ``--evm-version constantinople`` properly.
* DocString Parser: Fix error message for empty descriptions.
* Standard JSON: Support ``constantinople`` as ``evmVersion`` properly.
* Type System: Improve error message when attempting to shift by a fractional amount.
* Type System: Make external library functions accessible.
### 0.4.21 (2018-03-07)

View File

@ -327,7 +327,7 @@ bool isValidShiftAndAmountType(Token::Value _operator, Type const& _shiftAmountT
else if (IntegerType const* otherInt = dynamic_cast<decltype(otherInt)>(&_shiftAmountType))
return !otherInt->isAddress();
else if (RationalNumberType const* otherRat = dynamic_cast<decltype(otherRat)>(&_shiftAmountType))
return otherRat->integerType() && !otherRat->integerType()->isSigned();
return !otherRat->isFractional() && otherRat->integerType() && !otherRat->integerType()->isSigned();
else
return false;
}

View File

@ -5643,6 +5643,16 @@ BOOST_AUTO_TEST_CASE(shift_constant_right_excessive_rvalue)
CHECK_ERROR(text, TypeError, "Operator >> not compatible with types int_const 66 and int_const 4294967296");
}
BOOST_AUTO_TEST_CASE(shift_constant_right_fractional)
{
char const* text = R"(
contract C {
uint public a = 0x42 >> (1 / 2);
}
)";
CHECK_ERROR(text, TypeError, "Operator >> not compatible with types int_const 66 and rational_const 1 / 2");
}
BOOST_AUTO_TEST_CASE(inline_assembly_unbalanced_positive_stack)
{
char const* text = R"(