diff --git a/test/libsolidity/semanticTests/smoke_test.sol b/test/libsolidity/semanticTests/smoke_test.sol index 82f38656f..23ad109a0 100644 --- a/test/libsolidity/semanticTests/smoke_test.sol +++ b/test/libsolidity/semanticTests/smoke_test.sol @@ -101,7 +101,7 @@ contract C { // g1() -> FAILURE // h(uint256,uint256): 1, -2 -> 3 // j(bool): true -> false -// k(bytes32): 0x1001 -> 0x1001, 0x1001 +// k(bytes32): 0x10001 -> 0x10001, 0x10001 // l(): hex"4200efef" -> 8 // m(bytes): 32, 32, 0x20 -> 32, 32, 0x20 // m(bytes): 32, 3, hex"AB33BB" -> 32, 3, left(0xAB33BB) diff --git a/test/libsolidity/util/BytesUtils.cpp b/test/libsolidity/util/BytesUtils.cpp index 61ecead30..82d70dcb9 100644 --- a/test/libsolidity/util/BytesUtils.cpp +++ b/test/libsolidity/util/BytesUtils.cpp @@ -98,10 +98,7 @@ bytes BytesUtils::convertHexNumber(string const& _literal) { try { - if (_literal.size() % 2) - throw Error(Error::Type::ParserError, "Hex number encoding invalid."); - else - return fromHex(_literal); + return fromHex(_literal); } catch (std::exception const&) { @@ -161,7 +158,9 @@ string BytesUtils::formatBoolean(bytes const& _bytes) string BytesUtils::formatHex(bytes const& _bytes) { + soltestAssert(!_bytes.empty() && _bytes.size() <= 32, ""); u256 value = fromBigEndian(_bytes); + return toCompactHexWithPrefix(value); } diff --git a/test/libsolidity/util/TestFileParserTests.cpp b/test/libsolidity/util/TestFileParserTests.cpp index 21e185bae..72ac9210d 100644 --- a/test/libsolidity/util/TestFileParserTests.cpp +++ b/test/libsolidity/util/TestFileParserTests.cpp @@ -404,6 +404,27 @@ BOOST_AUTO_TEST_CASE(call_arguments_string) ); } + +BOOST_AUTO_TEST_CASE(call_hex_number) +{ + char const* source = R"( + // f(bytes32, bytes32): 0x616, 0x1042 -> 1 + )"; + auto const calls = parse(source); + BOOST_REQUIRE_EQUAL(calls.size(), 1); + testFunctionCall( + calls.at(0), + Mode::SingleLine, + "f(bytes32,bytes32)", + false, + fmt::encodeArgs( + fromHex("0x616"), + fromHex("0x1042") + ), + fmt::encodeArgs(1) + ); +} + BOOST_AUTO_TEST_CASE(call_return_string) { char const* source = R"( @@ -786,14 +807,6 @@ BOOST_AUTO_TEST_CASE(call_ether_type_invalid) BOOST_REQUIRE_THROW(parse(source), langutil::Error); } -BOOST_AUTO_TEST_CASE(call_hex_number_invalid) -{ - char const* source = R"( - // f(bytes32, bytes32): 0x616, 0x042 -> 1 - )"; - BOOST_REQUIRE_THROW(parse(source), langutil::Error); -} - BOOST_AUTO_TEST_CASE(call_signed_bool_invalid) { char const* source = R"( diff --git a/test/libsolidity/util/TestFunctionCallTests.cpp b/test/libsolidity/util/TestFunctionCallTests.cpp index 090e95399..9f67c7b91 100644 --- a/test/libsolidity/util/TestFunctionCallTests.cpp +++ b/test/libsolidity/util/TestFunctionCallTests.cpp @@ -139,7 +139,8 @@ BOOST_AUTO_TEST_CASE(format_hex_singleline) BOOST_REQUIRE_EQUAL(test.format(), "// f(bytes32): 0x31 -> 0x31"); bytes actualResult = fromHex("0x32"); - bytes actualBytes = actualResult + bytes(32 - actualResult.size(), 0); + bytes actualBytes = bytes(32 - actualResult.size(), 0) + actualResult; + test.setRawBytes(actualBytes); test.setFailure(false);