mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Support for negative literals.
This commit is contained in:
parent
b9cc3baf40
commit
08cba0653f
@ -227,7 +227,7 @@ BOOST_AUTO_TEST_CASE(arithmetics)
|
||||
BOOST_AUTO_TEST_CASE(unary_operators)
|
||||
{
|
||||
char const* sourceCode = "contract test {\n"
|
||||
" function f() { var x = !(~+-1 == 2); }"
|
||||
" function f() { var x = !(~+- 1 == 2); }"
|
||||
"}\n";
|
||||
bytes code = compileFirstExpression(sourceCode);
|
||||
|
||||
@ -347,6 +347,45 @@ BOOST_AUTO_TEST_CASE(function_call)
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(negative_literals_8bits)
|
||||
{
|
||||
// these all fit in 8 bits
|
||||
char const* sourceCode = "contract test {\n"
|
||||
" function f() { int8 x = -0 + -1 + -0x01 + -127 + -128; }\n"
|
||||
"}\n";
|
||||
bytes code = compileFirstExpression(sourceCode);
|
||||
|
||||
bytes expectation(bytes({byte(eth::Instruction::PUSH1), 0x00,
|
||||
byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
||||
bytes({byte(eth::Instruction::ADD),
|
||||
byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
||||
bytes({byte(eth::Instruction::ADD),
|
||||
byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x81) +
|
||||
bytes({byte(eth::Instruction::ADD),
|
||||
byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x80) +
|
||||
bytes({byte(eth::Instruction::ADD)}));
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(negative_literals_16bits)
|
||||
{
|
||||
// -1 should need 8 bits, -129 should need 16 bits, how many bits are used is visible
|
||||
// from the SIGNEXTEND opcodes
|
||||
char const* sourceCode = "contract test {\n"
|
||||
" function f() { int64 x = int64(-1 + -129); }\n"
|
||||
"}\n";
|
||||
bytes code = compileFirstExpression(sourceCode);
|
||||
|
||||
bytes expectation(bytes({byte(eth::Instruction::PUSH32)}) + bytes(32, 0xff) +
|
||||
bytes({byte(eth::Instruction::PUSH1), 0x00,
|
||||
byte(eth::Instruction::SIGNEXTEND),
|
||||
byte(eth::Instruction::PUSH32)}) + bytes(31, 0xff) + bytes(1, 0x7f) +
|
||||
bytes({byte(eth::Instruction::ADD),
|
||||
byte(eth::Instruction::PUSH1), 0x01,
|
||||
byte(eth::Instruction::SIGNEXTEND)}));
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
}
|
||||
|
@ -97,6 +97,27 @@ BOOST_AUTO_TEST_CASE(hex_numbers)
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(negative_numbers)
|
||||
{
|
||||
Scanner scanner(CharStream("var x = -.2 + -0x78 + -7.3 + 8.9;"));
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentToken(), Token::VAR);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::ASSIGN);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::NUMBER);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLiteral(), "-.2");
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::ADD);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::NUMBER);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLiteral(), "-0x78");
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::ADD);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::NUMBER);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLiteral(), "-7.3");
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::ADD);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::NUMBER);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLiteral(), "8.9");
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::SEMICOLON);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::EOS);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(locations)
|
||||
{
|
||||
Scanner scanner(CharStream("function_identifier has ; -0x743/*comment*/\n ident //comment"));
|
||||
@ -109,11 +130,8 @@ BOOST_AUTO_TEST_CASE(locations)
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::SEMICOLON);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().start, 24);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().end, 25);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::SUB);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().start, 26);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().end, 27);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::NUMBER);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().start, 27);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().start, 26);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().end, 32);
|
||||
BOOST_CHECK_EQUAL(scanner.next(), Token::IDENTIFIER);
|
||||
BOOST_CHECK_EQUAL(scanner.getCurrentLocation().start, 45);
|
||||
|
Loading…
Reference in New Issue
Block a user