From 43e42482a7c4b96e38d5f0594cbce3925bc26fb3 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 25 Oct 2016 02:14:56 +0100 Subject: [PATCH 01/18] LLL: document optimise flag --- lllc/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lllc/main.cpp b/lllc/main.cpp index 06611af0d..380a0ba26 100644 --- a/lllc/main.cpp +++ b/lllc/main.cpp @@ -41,6 +41,7 @@ void help() << " -x,--hex Parse, compile and assemble; output byte code in hex." << endl << " -a,--assembly Only parse and compile; show assembly." << endl << " -t,--parse-tree Only parse; show parse tree." << endl + << " -o,--optimise Turn on/off the optimiser; on by default." << endl << " -h,--help Show this help message and exit." << endl << " -V,--version Show the version and exit." << endl; exit(0); From 3a6ac6226cae21c3c00fae1acf4481d8101f5371 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 25 Oct 2016 02:15:21 +0100 Subject: [PATCH 02/18] LLL: turn off optimiser by default --- lllc/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lllc/main.cpp b/lllc/main.cpp index 380a0ba26..3821d6a3c 100644 --- a/lllc/main.cpp +++ b/lllc/main.cpp @@ -41,7 +41,7 @@ void help() << " -x,--hex Parse, compile and assemble; output byte code in hex." << endl << " -a,--assembly Only parse and compile; show assembly." << endl << " -t,--parse-tree Only parse; show parse tree." << endl - << " -o,--optimise Turn on/off the optimiser; on by default." << endl + << " -o,--optimise Turn on/off the optimiser; off by default." << endl << " -h,--help Show this help message and exit." << endl << " -V,--version Show the version and exit." << endl; exit(0); @@ -82,7 +82,7 @@ enum Mode { Binary, Hex, Assembly, ParseTree, Disassemble }; int main(int argc, char** argv) { setDefaultOrCLocale(); - unsigned optimise = 1; + unsigned optimise = 0; string infile; Mode mode = Hex; From 0da309d460c77277135cffcaa8b2bf75976d3869 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 25 Oct 2016 12:43:12 +0100 Subject: [PATCH 03/18] LLL: change -o to be a flag --- lllc/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lllc/main.cpp b/lllc/main.cpp index 3821d6a3c..f8677be02 100644 --- a/lllc/main.cpp +++ b/lllc/main.cpp @@ -99,8 +99,8 @@ int main(int argc, char** argv) mode = Assembly; else if (arg == "-t" || arg == "--parse-tree") mode = ParseTree; - else if ((arg == "-o" || arg == "--optimise") && argc > i + 1) - optimise = atoi(argv[++i]); + else if (arg == "-o" || arg == "--optimise") + optimise = 1; else if (arg == "-d" || arg == "--disassemble") mode = Disassemble; else if (arg == "-V" || arg == "--version") From 5ddb92b8ccdb27f3874516bbc0229be6e16d05d7 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 25 Oct 2016 15:39:38 +0200 Subject: [PATCH 04/18] Version bump for develop. --- CMakeLists.txt | 2 +- Changelog.md | 6 ++++++ docs/conf.py | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 624402657..7e38083b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ include(EthPolicy) eth_policy() # project name and version should be set after cmake_policy CMP0048 -set(PROJECT_VERSION "0.4.3") +set(PROJECT_VERSION "0.4.4") project(solidity VERSION ${PROJECT_VERSION}) # Let's find our dependencies diff --git a/Changelog.md b/Changelog.md index b399c71aa..a24ac211c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,9 @@ +### 0.4.4 (unreleased) + +Features: + +Bugfixes: + ### 0.4.3 (2016-10-25) Features: diff --git a/docs/conf.py b/docs/conf.py index 4d22c9bd9..ebc771246 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -56,9 +56,9 @@ copyright = '2016, Ethereum' # built documents. # # The short X.Y version. -version = '0.4.3' +version = '0.4.4' # The full version, including alpha/beta/rc tags. -release = '0.4.3-develop' +release = '0.4.4-develop' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 578b02bb37bf7cc2fa8cdcb745eaeef5591ea27e Mon Sep 17 00:00:00 2001 From: Yoichi Hirai Date: Mon, 24 Oct 2016 18:40:22 +0200 Subject: [PATCH 05/18] Add tests for #1246 --- .../SolidityNameAndTypeResolution.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 9fe91cca5..640cc1080 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -2098,6 +2098,22 @@ BOOST_AUTO_TEST_CASE(integer_boolean_operators) BOOST_CHECK(expectError(sourceCode3) == Error::Type::TypeError); } +BOOST_AUTO_TEST_CASE(exp_signed_variable) +{ + char const* sourceCode1 = R"( + contract test { function() { uint x = 3; int y = -4; x ** y; } } + )"; + BOOST_CHECK(expectError(sourceCode1) == Error::Type::TypeError); + char const* sourceCode2 = R"( + contract test { function() { uint x = 3; int y = -4; y ** x; } } + )"; + BOOST_CHECK(expectError(sourceCode2) == Error::Type::TypeError); + char const* sourceCode3 = R"( + contract test { function() { int x = -3; int y = -4; x ** y; } } + )"; + BOOST_CHECK(expectError(sourceCode3) == Error::Type::TypeError); +} + BOOST_AUTO_TEST_CASE(reference_compare_operators) { char const* sourceCode1 = R"( From 3ca5900b8c0b69d640ef46388b0d2250275356fc Mon Sep 17 00:00:00 2001 From: Yoichi Hirai Date: Mon, 24 Oct 2016 20:12:31 +0200 Subject: [PATCH 06/18] ast: ban signed EXP, fixing #1246 --- Changelog.md | 1 + libsolidity/ast/Types.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index a24ac211c..8fa54c818 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@ Features: Bugfixes: + * Type checker: forbid signed exponential that led to an incorrect use of EXP opcode. ### 0.4.3 (2016-10-25) diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 7cfed3c88..7fe97fa76 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -349,11 +349,14 @@ TypePointer IntegerType::binaryOperatorResult(Token::Value _operator, TypePointe return commonType; if (Token::isBooleanOp(_operator)) return TypePointer(); - // Nothing else can be done with addresses if (auto intType = dynamic_pointer_cast(commonType)) { + // Nothing else can be done with addresses if (intType->isAddress()) return TypePointer(); + // Signed EXP is not allowed + if (Token::Exp == _operator && intType->isSigned()) + return TypePointer(); } else if (auto fixType = dynamic_pointer_cast(commonType)) if (Token::Exp == _operator) From 5a981b59c3519257027a107898c06693c126c7b5 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 26 Oct 2016 01:10:55 +0100 Subject: [PATCH 07/18] LLL: replace (1 0 sub) with literal value --- liblll/CodeFragment.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/liblll/CodeFragment.cpp b/liblll/CodeFragment.cpp index 9dcac845d..02351c3fa 100644 --- a/liblll/CodeFragment.cpp +++ b/liblll/CodeFragment.cpp @@ -547,9 +547,7 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) requireDeposit(0, 1); m_asm.append(code[0].m_asm, 1); - m_asm.append((u256)1); - m_asm.append((u256)0); - m_asm.append(Instruction::SUB); + m_asm.append(bigint(u256(0) - 1); m_asm.append(Instruction::SUB); } else if (us == "SEQ") From ee3cfd8f528c9c950ab416b22d34ddfee978f999 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 26 Oct 2016 01:12:15 +0100 Subject: [PATCH 08/18] LLL: use NOT for ~ --- liblll/CodeFragment.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/liblll/CodeFragment.cpp b/liblll/CodeFragment.cpp index 02351c3fa..ce3024f67 100644 --- a/liblll/CodeFragment.cpp +++ b/liblll/CodeFragment.cpp @@ -332,7 +332,7 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) std::map const c_arith = { { "+", Instruction::ADD }, { "-", Instruction::SUB }, { "*", Instruction::MUL }, { "/", Instruction::DIV }, { "%", Instruction::MOD }, { "&", Instruction::AND }, { "|", Instruction::OR }, { "^", Instruction::XOR } }; std::map> const c_binary = { { "<", { Instruction::LT, false } }, { "<=", { Instruction::GT, true } }, { ">", { Instruction::GT, false } }, { ">=", { Instruction::LT, true } }, { "S<", { Instruction::SLT, false } }, { "S<=", { Instruction::SGT, true } }, { "S>", { Instruction::SGT, false } }, { "S>=", { Instruction::SLT, true } }, { "=", { Instruction::EQ, false } }, { "!=", { Instruction::EQ, true } } }; - std::map const c_unary = { { "!", Instruction::ISZERO } }; + std::map const c_unary = { { "!", Instruction::ISZERO }, { "~", Instruction::NOT } }; vector code; CompilerState ns = _s; @@ -541,15 +541,6 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) // At end now. m_asm.append(end); } - else if (us == "~") - { - requireSize(1); - requireDeposit(0, 1); - - m_asm.append(code[0].m_asm, 1); - m_asm.append(bigint(u256(0) - 1); - m_asm.append(Instruction::SUB); - } else if (us == "SEQ") { unsigned ii = 0; From 6cb9c369774f9a1fc39bbaefcb3e50a5b4b68bef Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 26 Oct 2016 01:16:29 +0100 Subject: [PATCH 09/18] LLL: reorder arithmetic/binary instruction list for readability --- liblll/CodeFragment.cpp | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/liblll/CodeFragment.cpp b/liblll/CodeFragment.cpp index ce3024f67..eadb01406 100644 --- a/liblll/CodeFragment.cpp +++ b/liblll/CodeFragment.cpp @@ -330,9 +330,32 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) if (nonStandard) return; - std::map const c_arith = { { "+", Instruction::ADD }, { "-", Instruction::SUB }, { "*", Instruction::MUL }, { "/", Instruction::DIV }, { "%", Instruction::MOD }, { "&", Instruction::AND }, { "|", Instruction::OR }, { "^", Instruction::XOR } }; - std::map> const c_binary = { { "<", { Instruction::LT, false } }, { "<=", { Instruction::GT, true } }, { ">", { Instruction::GT, false } }, { ">=", { Instruction::LT, true } }, { "S<", { Instruction::SLT, false } }, { "S<=", { Instruction::SGT, true } }, { "S>", { Instruction::SGT, false } }, { "S>=", { Instruction::SLT, true } }, { "=", { Instruction::EQ, false } }, { "!=", { Instruction::EQ, true } } }; - std::map const c_unary = { { "!", Instruction::ISZERO }, { "~", Instruction::NOT } }; + std::map const c_arith = { + { "+", Instruction::ADD }, + { "-", Instruction::SUB }, + { "*", Instruction::MUL }, + { "/", Instruction::DIV }, + { "%", Instruction::MOD }, + { "&", Instruction::AND }, + { "|", Instruction::OR }, + { "^", Instruction::XOR } + }; + std::map> const c_binary = { + { "<", { Instruction::LT, false } }, + { "<=", { Instruction::GT, true } }, + { ">", { Instruction::GT, false } }, + { ">=", { Instruction::LT, true } }, + { "S<", { Instruction::SLT, false } }, + { "S<=", { Instruction::SGT, true } }, + { "S>", { Instruction::SGT, false } }, + { "S>=", { Instruction::SLT, true } }, + { "=", { Instruction::EQ, false } }, + { "!=", { Instruction::EQ, true } } + }; + std::map const c_unary = { + { "!", Instruction::ISZERO }, + { "~", Instruction::NOT } + }; vector code; CompilerState ns = _s; From 7ac53f5305d83d3f2a220d30753f82341311392c Mon Sep 17 00:00:00 2001 From: Daniel Ellison Date: Wed, 26 Oct 2016 09:24:01 -0400 Subject: [PATCH 10/18] Added support for `until`, the inverse of `while`. --- liblll/CodeFragment.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/liblll/CodeFragment.cpp b/liblll/CodeFragment.cpp index eadb01406..e76f49748 100644 --- a/liblll/CodeFragment.cpp +++ b/liblll/CodeFragment.cpp @@ -472,14 +472,15 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) m_asm << end.tag(); m_asm.donePaths(); } - else if (us == "WHILE") + else if (us == "WHILE" || us == "UNTIL") { requireSize(2); requireDeposit(0, 1); auto begin = m_asm.append(); m_asm.append(code[0].m_asm); - m_asm.append(Instruction::ISZERO); + if (us == "WHILE") + m_asm.append(Instruction::ISZERO); auto end = m_asm.appendJumpI(); m_asm.append(code[1].m_asm, 0); m_asm.appendJump(begin); From e8b45d26fba56c57a28f1b41d5c105725d9300dd Mon Sep 17 00:00:00 2001 From: Eric Tillberg Date: Wed, 26 Oct 2016 13:23:53 -0400 Subject: [PATCH 11/18] Update index.rst --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 3b47ce784..9bee15154 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,7 +5,7 @@ Solidity is a contract-oriented, high-level language whose syntax is similar to and it is designed to target the Ethereum Virtual Machine. Solidity is statically typed, supports inheritance, libraries and complex -user-defines types among other features. +user-defined types among other features. As you will see, it is possible to create contracts for voting, crowdfunding, blind auctions, multi-signature wallets and more. From d7cfc6399bfc2bf19ad55158eb36d86820534d48 Mon Sep 17 00:00:00 2001 From: Eric Tillberg Date: Wed, 26 Oct 2016 13:43:51 -0400 Subject: [PATCH 12/18] Update installing-solidity.rst --- docs/installing-solidity.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installing-solidity.rst b/docs/installing-solidity.rst index 44ee34f4a..ec40e8224 100644 --- a/docs/installing-solidity.rst +++ b/docs/installing-solidity.rst @@ -12,7 +12,7 @@ Versioning Solidity versions follow `semantic versioning `_ and in addition to releases, **nightly development builds** are also made available. The nightly builds are not guaranteed to be working and despite best efforts they might contain undocumented -and/or broken changes. We recommend to use the latest release. Package installers below +and/or broken changes. We recommend using the latest release. Package installers below will use the latest release. Browser-Solidity From 274c76fc5ee92118271d59bdfd80bf144d03c103 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 27 Oct 2016 13:45:33 +0100 Subject: [PATCH 13/18] LLL: introduce panic keyword --- liblll/CodeFragment.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/liblll/CodeFragment.cpp b/liblll/CodeFragment.cpp index eadb01406..d4b89b70d 100644 --- a/liblll/CodeFragment.cpp +++ b/liblll/CodeFragment.cpp @@ -579,6 +579,10 @@ void CodeFragment::constructOperation(sp::utree const& _t, CompilerState& _s) m_asm.append(i.m_asm); m_asm.popTo(1); } + else if (us == "PANIC") + { + m_asm.appendJump(m_asm.errorTag()); + } else if (us.find_first_of("1234567890") != 0 && us.find_first_not_of("QWERTYUIOPASDFGHJKLZXCVBNM1234567890_") == string::npos) m_asm.append((u256)varAddress(s)); else From 81254e0eb7a987da101a1f9cef7e9d7a2fd8f5fb Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 27 Oct 2016 16:29:42 +0200 Subject: [PATCH 14/18] Fix cmake empty string replace. --- cmake/EthCompilerSettings.cmake | 12 ++++++------ cmake/EthDependencies.cmake | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cmake/EthCompilerSettings.cmake b/cmake/EthCompilerSettings.cmake index 066be4c16..af6ae9281 100644 --- a/cmake/EthCompilerSettings.cmake +++ b/cmake/EthCompilerSettings.cmake @@ -180,12 +180,12 @@ elseif (DEFINED MSVC) # Always use Release variant of C++ runtime. # We don't want to provide Debug variants of all dependencies. Some default # flags set by CMake must be tweaked. - string(REPLACE "/MDd" "/MD" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) - string(REPLACE "/D_DEBUG" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) - string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) - string(REPLACE "/MDd" "/MD" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) - string(REPLACE "/D_DEBUG" "" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) - string(REPLACE "/RTC1" "" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG}) + string(REPLACE "/MDd" "/MD" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + string(REPLACE "/D_DEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + string(REPLACE "/MDd" "/MD" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") + string(REPLACE "/D_DEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") + string(REPLACE "/RTC1" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") set_property(GLOBAL PROPERTY DEBUG_CONFIGURATIONS OFF) # disable empty object file warning diff --git a/cmake/EthDependencies.cmake b/cmake/EthDependencies.cmake index 72585d110..a5e9b0c5f 100644 --- a/cmake/EthDependencies.cmake +++ b/cmake/EthDependencies.cmake @@ -119,7 +119,7 @@ function(eth_use TARGET REQUIRED) endif() foreach(MODULE ${ARGN}) - string(REPLACE "::" ";" MODULE_PARTS ${MODULE}) + string(REPLACE "::" ";" MODULE_PARTS "${MODULE}") list(GET MODULE_PARTS 0 MODULE_MAIN) list(LENGTH MODULE_PARTS MODULE_LENGTH) if (MODULE_LENGTH GREATER 1) From 681b130dc81fa591be7c4b08200146912b12ffb9 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 31 Oct 2016 16:22:27 +0100 Subject: [PATCH 15/18] Test case for overflow in storage. --- test/libsolidity/SolidityEndToEndTest.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 8ef9a45b9..8600443d7 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -7533,6 +7533,26 @@ BOOST_AUTO_TEST_CASE(inline_assembly_in_modifiers) BOOST_CHECK(callContractFunction("f()") == encodeArgs(true)); } +BOOST_AUTO_TEST_CASE(packed_storage_overflow) +{ + char const* sourceCode = R"( + contract C { + uint16 x = 0x1234; + uint16 a = 0xffff; + uint16 b; + function f() returns (uint, uint, uint, uint) { + a++; + uint c = b; + delete b; + a -= 2; + return (x, c, b, a); + } + } + )"; + compileAndRun(sourceCode, 0, "C"); + BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(0x1234), u256(0), u256(0), u256(0xfffe))); +} + BOOST_AUTO_TEST_SUITE_END() } From 9920e88eead1b874f7168d7cbc6b63d79c035834 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 31 Oct 2016 16:40:30 +0100 Subject: [PATCH 16/18] Clear all value types prior to storing. --- libsolidity/codegen/LValue.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/libsolidity/codegen/LValue.cpp b/libsolidity/codegen/LValue.cpp index 553e55189..c1e057923 100644 --- a/libsolidity/codegen/LValue.cpp +++ b/libsolidity/codegen/LValue.cpp @@ -231,10 +231,7 @@ void StorageItem::storeValue(Type const& _sourceType, SourceLocation const& _loc m_context << (u256(0x1) << (256 - 8 * dynamic_cast(*m_dataType).numBytes())) << Instruction::SWAP1 << Instruction::DIV; - else if ( - m_dataType->category() == Type::Category::Integer && - dynamic_cast(*m_dataType).isSigned() - ) + else // remove the higher order bits m_context << (u256(1) << (8 * (32 - m_dataType->storageBytes()))) @@ -242,9 +239,6 @@ void StorageItem::storeValue(Type const& _sourceType, SourceLocation const& _loc << Instruction::DUP2 << Instruction::MUL << Instruction::DIV; - else if (m_dataType->category() == Type::Category::FixedPoint) - // implementation should be very similar to the integer case. - solAssert(false, "Not yet implemented - FixedPointType."); m_context << Instruction::MUL << Instruction::OR; // stack: value storage_ref updated_value m_context << Instruction::SWAP1 << Instruction::SSTORE; From 1427c82c77ecfb1bfba7490ad656dc2ed414873c Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 31 Oct 2016 17:10:51 +0100 Subject: [PATCH 17/18] Updated changelog. --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index 8fa54c818..a14376e10 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ Features: Bugfixes: * Type checker: forbid signed exponential that led to an incorrect use of EXP opcode. + * Code generator: properly clean higher order bytes before storing in storage. ### 0.4.3 (2016-10-25) From 979d18f19c711093cdc7f4112a76bf2135c97119 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 31 Oct 2016 18:37:08 +0100 Subject: [PATCH 18/18] Update Changelog.md --- Changelog.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Changelog.md b/Changelog.md index a14376e10..c83bcffad 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,4 @@ -### 0.4.4 (unreleased) - -Features: +### 0.4.4 (2016-10-31) Bugfixes: * Type checker: forbid signed exponential that led to an incorrect use of EXP opcode.