aboutsummaryrefslogtreecommitdiffstats
path: root/test/libsolidity
diff options
context:
space:
mode:
Diffstat (limited to 'test/libsolidity')
-rw-r--r--test/libsolidity/GasMeter.cpp1
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp22
-rw-r--r--test/libsolidity/SolidityExecutionFramework.cpp11
-rw-r--r--test/libsolidity/SolidityExecutionFramework.h31
-rw-r--r--test/libsolidity/SolidityOptimizer.cpp72
5 files changed, 115 insertions, 22 deletions
diff --git a/test/libsolidity/GasMeter.cpp b/test/libsolidity/GasMeter.cpp
index fc7a033f..41204a0a 100644
--- a/test/libsolidity/GasMeter.cpp
+++ b/test/libsolidity/GasMeter.cpp
@@ -21,6 +21,7 @@
*/
#include <test/libsolidity/SolidityExecutionFramework.h>
+#include <libevmasm/EVMSchedule.h>
#include <libevmasm/GasMeter.h>
#include <libevmasm/KnownState.h>
#include <libevmasm/PathGasMeter.h>
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 8dcc878e..1b7c5ea4 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -21,6 +21,7 @@
* Unit tests for the solidity expression compiler, testing the behaviour of the code.
*/
+#include <functional>
#include <string>
#include <tuple>
#include <boost/test/unit_test.hpp>
@@ -29,6 +30,7 @@
#include <test/libsolidity/SolidityExecutionFramework.h>
using namespace std;
+using namespace std::placeholders;
namespace dev
{
@@ -2462,7 +2464,7 @@ BOOST_AUTO_TEST_CASE(use_std_lib)
contract Icarus is mortal { }
)";
m_addStandardSources = true;
- u256 amount(130 * eth::ether);
+ u256 amount(130 * ether);
compileAndRun(sourceCode, amount, "Icarus");
u256 balanceBefore = balanceAt(m_sender);
BOOST_CHECK(callContractFunction("kill()") == bytes());
@@ -5921,9 +5923,9 @@ BOOST_AUTO_TEST_CASE(version_stamp_for_libraries)
m_optimize = true;
bytes runtimeCode = compileAndRun(sourceCode, 0, "lib");
BOOST_CHECK(runtimeCode.size() >= 8);
- BOOST_CHECK_EQUAL(runtimeCode[0], int(eth::Instruction::PUSH6)); // might change once we switch to 1.x.x
+ BOOST_CHECK_EQUAL(runtimeCode[0], int(Instruction::PUSH6)); // might change once we switch to 1.x.x
BOOST_CHECK_EQUAL(runtimeCode[1], 3); // might change once we switch away from x.3.x
- BOOST_CHECK_EQUAL(runtimeCode[7], int(eth::Instruction::POP));
+ BOOST_CHECK_EQUAL(runtimeCode[7], int(Instruction::POP));
}
BOOST_AUTO_TEST_CASE(contract_binary_dependencies)
@@ -6837,6 +6839,20 @@ BOOST_AUTO_TEST_CASE(skip_dynamic_types_for_structs)
BOOST_CHECK(callContractFunction("g()") == encodeArgs(u256(2), u256(6)));
}
+BOOST_AUTO_TEST_CASE(create_dynamic_array_with_zero_length)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function f() returns (uint) {
+ var a = new uint[][](0);
+ return 7;
+ }
+ }
+ )";
+ compileAndRun(sourceCode, 0, "C");
+ BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(7)));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/SolidityExecutionFramework.cpp b/test/libsolidity/SolidityExecutionFramework.cpp
index da9cf5f1..a33f4caf 100644
--- a/test/libsolidity/SolidityExecutionFramework.cpp
+++ b/test/libsolidity/SolidityExecutionFramework.cpp
@@ -22,13 +22,21 @@
#include <cstdlib>
#include <boost/test/framework.hpp>
+#include <libdevcore/CommonIO.h>
#include <test/libsolidity/SolidityExecutionFramework.h>
+
+
using namespace std;
using namespace dev;
using namespace dev::solidity;
using namespace dev::solidity::test;
+namespace // anonymous
+{
+ h256 const EmptyTrie("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421");
+}
+
string getIPCSocketPath()
{
string ipcPath;
@@ -56,9 +64,6 @@ ExecutionFramework::ExecutionFramework() :
m_rpc(RPCSession::instance(getIPCSocketPath())),
m_sender(m_rpc.account(0))
{
- if (g_logVerbosity != -1)
- g_logVerbosity = 0;
-
m_rpc.test_rewindToBlock(0);
}
diff --git a/test/libsolidity/SolidityExecutionFramework.h b/test/libsolidity/SolidityExecutionFramework.h
index 2b589498..5764784a 100644
--- a/test/libsolidity/SolidityExecutionFramework.h
+++ b/test/libsolidity/SolidityExecutionFramework.h
@@ -22,25 +22,33 @@
#pragma once
-#include <string>
-#include <tuple>
-#include <fstream>
+#include <functional>
+
#include "../TestHelper.h"
#include "../RPCSession.h"
-#include <libethcore/ABI.h>
-#include <libethcore/SealEngine.h>
-#include <libethereum/State.h>
-#include <libethereum/Executive.h>
-#include <libethereum/ChainParams.h>
+
+#include <libdevcore/ABI.h>
+#include <libdevcore/FixedHash.h>
+#include <libevmasm/Instruction.h>
+
#include <libsolidity/interface/CompilerStack.h>
#include <libsolidity/interface/Exceptions.h>
-#include <libethcore/BasicAuthority.h>
-#include <libethcore/SealEngine.h>
namespace dev
{
namespace solidity
{
+ /// An Ethereum address: 20 bytes.
+ /// @NOTE This is not endian-specific; it's just a bunch of bytes.
+ using Address = h160;
+
+ // The various denominations; here for ease of use where needed within code.
+ static const u256 ether = exp10<18>();
+ static const u256 finney = exp10<15>();
+ static const u256 szabo = exp10<12>();
+ static const u256 shannon = exp10<9>();
+ static const u256 wei = exp10<0>();
+
namespace test
{
@@ -275,8 +283,7 @@ protected:
dev::solidity::CompilerStack m_compiler;
Address m_sender;
Address m_contractAddress;
- eth::EnvInfo m_envInfo;
- u256 const m_gasPrice = 100 * eth::szabo;
+ u256 const m_gasPrice = 100 * szabo;
u256 const m_gas = 100000000;
bytes m_output;
std::vector<LogEntry> m_logs;
diff --git a/test/libsolidity/SolidityOptimizer.cpp b/test/libsolidity/SolidityOptimizer.cpp
index ad573823..206f23fb 100644
--- a/test/libsolidity/SolidityOptimizer.cpp
+++ b/test/libsolidity/SolidityOptimizer.cpp
@@ -79,6 +79,8 @@ public:
bytes nonOptimizedOutput = callContractFunction(_sig, _arguments...);
m_contractAddress = m_optimizedContract;
bytes optimizedOutput = callContractFunction(_sig, _arguments...);
+ BOOST_CHECK_MESSAGE(!optimizedOutput.empty(), "No optimized output for " + _sig);
+ BOOST_CHECK_MESSAGE(!nonOptimizedOutput.empty(), "No un-optimized output for " + _sig);
BOOST_CHECK_MESSAGE(nonOptimizedOutput == optimizedOutput, "Computed values do not match."
"\nNon-Optimized: " + toHex(nonOptimizedOutput) +
"\nOptimized: " + toHex(optimizedOutput));
@@ -176,7 +178,7 @@ BOOST_AUTO_TEST_CASE(identities)
}
})";
compileBothVersions(sourceCode);
- compareVersions("f(uint256)", u256(0x12334664));
+ compareVersions("f(int256)", u256(0x12334664));
}
BOOST_AUTO_TEST_CASE(unused_expressions)
@@ -230,6 +232,7 @@ BOOST_AUTO_TEST_CASE(array_copy)
bytes2[] data1;
bytes5[] data2;
function f(uint x) returns (uint l, uint y) {
+ data1.length = msg.data.length;
for (uint i = 0; i < msg.data.length; ++i)
data1[i] = msg.data[i];
data2 = data1;
@@ -241,7 +244,7 @@ BOOST_AUTO_TEST_CASE(array_copy)
compileBothVersions(sourceCode);
compareVersions("f(uint256)", 0);
compareVersions("f(uint256)", 10);
- compareVersions("f(uint256)", 36);
+ compareVersions("f(uint256)", 35);
}
BOOST_AUTO_TEST_CASE(function_calls)
@@ -279,6 +282,8 @@ BOOST_AUTO_TEST_CASE(storage_write_in_loops)
compareVersions("f(uint256)", 36);
}
+// Test disabled with https://github.com/ethereum/solidity/pull/762
+// Information in joining branches is not retained anymore.
BOOST_AUTO_TEST_CASE(retain_information_in_branches)
{
// This tests that the optimizer knows that we already have "z == sha3(y)" inside both branches.
@@ -312,7 +317,8 @@ BOOST_AUTO_TEST_CASE(retain_information_in_branches)
if (_instr == Instruction::SHA3)
numSHA3s++;
});
- BOOST_CHECK_EQUAL(1, numSHA3s);
+// TEST DISABLED - OPTIMIZER IS NOT EFFECTIVE ON THIS ONE ANYMORE
+// BOOST_CHECK_EQUAL(1, numSHA3s);
}
BOOST_AUTO_TEST_CASE(store_tags_as_unions)
@@ -346,7 +352,7 @@ BOOST_AUTO_TEST_CASE(store_tags_as_unions)
}
)";
compileBothVersions(sourceCode);
- compareVersions("f()", 7, "abc");
+ compareVersions("f(uint256,bytes32)", 7, "abc");
m_optimize = true;
bytes optimizedBytecode = compileAndRun(sourceCode, 0, "test");
@@ -1174,6 +1180,64 @@ BOOST_AUTO_TEST_CASE(computing_constants)
) == optimizedBytecode.cend());
}
+BOOST_AUTO_TEST_CASE(inconsistency)
+{
+ // This is a test of a bug in the optimizer.
+ char const* sourceCode = R"(
+ contract Inconsistency {
+ struct Value {
+ uint badnum;
+ uint number;
+ }
+
+ struct Container {
+ uint[] valueIndices;
+ Value[] values;
+ }
+
+ Container[] containers;
+ uint[] valueIndices;
+ uint INDEX_ZERO = 0;
+ uint debug;
+
+ // Called with params: containerIndex=0, valueIndex=0
+ function levelIII(uint containerIndex, uint valueIndex) private {
+ Container container = containers[containerIndex];
+ Value value = container.values[valueIndex];
+ debug = container.valueIndices[value.number];
+ }
+ function levelII() private {
+ for (uint i = 0; i < valueIndices.length; i++) {
+ levelIII(INDEX_ZERO, valueIndices[i]);
+ }
+ }
+
+ function trigger() public returns (uint) {
+ containers.length++;
+ Container container = containers[0];
+
+ container.values.push(Value({
+ badnum: 9000,
+ number: 0
+ }));
+
+ container.valueIndices.length++;
+ valueIndices.length++;
+
+ levelII();
+ return debug;
+ }
+
+ function DoNotCallButDoNotDelete() public {
+ levelII();
+ levelIII(1, 2);
+ }
+ }
+ )";
+ compileBothVersions(sourceCode);
+ compareVersions("trigger()");
+}
+
BOOST_AUTO_TEST_SUITE_END()
}