aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Beregszaszi <alex@rtfs.hu>2018-11-22 21:59:23 +0800
committerGitHub <noreply@github.com>2018-11-22 21:59:23 +0800
commitbe321090e665da4919dc7a41e909032f60ea2dd7 (patch)
tree45612f582bad9de218ff14d636ec5c2dc10616d3
parenta5411965e6d7abf50f896291d69cab820db6ef87 (diff)
parent32fe4768a9f9a3872eec541c1e7b3f3c94c8428c (diff)
downloaddexon-solidity-be321090e665da4919dc7a41e909032f60ea2dd7.tar.gz
dexon-solidity-be321090e665da4919dc7a41e909032f60ea2dd7.tar.zst
dexon-solidity-be321090e665da4919dc7a41e909032f60ea2dd7.zip
Merge pull request #4645 from ethereum/smt-syntax-tests
Move SMT tests to use isoltest
-rw-r--r--test/libsolidity/SMTChecker.cpp593
-rw-r--r--test/libsolidity/smtCheckerTests/complex/warn_on_struct.sol14
-rw-r--r--test/libsolidity/smtCheckerTests/complex/warn_on_typecast.sol8
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/assignment_in_declaration.sol4
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_1.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_2.sol16
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_1.sol10
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_2.sol11
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_3.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_4.sol13
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_5.sol13
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_6.sol13
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_1.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_2.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_3.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/functions/function_call_does_not_clear_local_vars.sol13
-rw-r--r--test/libsolidity/smtCheckerTests/loops/for_loop_1.sol8
-rw-r--r--test/libsolidity/smtCheckerTests/loops/for_loop_2.sol8
-rw-r--r--test/libsolidity/smtCheckerTests/loops/for_loop_3.sol8
-rw-r--r--test/libsolidity/smtCheckerTests/loops/for_loop_4.sol10
-rw-r--r--test/libsolidity/smtCheckerTests/loops/for_loop_5.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/loops/for_loop_6.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol13
-rw-r--r--test/libsolidity/smtCheckerTests/loops/while_loop_simple_2.sol9
-rw-r--r--test/libsolidity/smtCheckerTests/loops/while_loop_simple_3.sol11
-rw-r--r--test/libsolidity/smtCheckerTests/loops/while_loop_simple_4.sol11
-rw-r--r--test/libsolidity/smtCheckerTests/loops/while_loop_simple_5.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/overflow/simple_overflow.sol6
-rw-r--r--test/libsolidity/smtCheckerTests/simple/smoke_test.sol3
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_int_mixed_1.sol9
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_int_mixed_2.sol8
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_int_mixed_3.sol21
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_simple_1.sol8
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_simple_2.sol8
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_simple_3.sol7
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_simple_4.sol10
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_simple_5.sol7
-rw-r--r--test/libsolidity/smtCheckerTests/types/bool_simple_6.sol9
-rw-r--r--test/libsolidity/smtCheckerTests/types/storage_value_vars_1.sol22
-rw-r--r--test/libsolidity/smtCheckerTests/types/storage_value_vars_2.sol12
-rw-r--r--test/libsolidity/smtCheckerTests/types/storage_value_vars_3.sol25
-rw-r--r--test/libsolidity/smtCheckerTests/types/storage_value_vars_4.sol10
-rw-r--r--test/libsolidity/smtCheckerTests/verification_target/constant_condition_1.sol9
-rw-r--r--test/libsolidity/smtCheckerTests/verification_target/constant_condition_2.sol9
-rw-r--r--test/libsolidity/smtCheckerTests/verification_target/constant_condition_3.sol9
-rw-r--r--test/libsolidity/smtCheckerTests/verification_target/simple_assert.sol6
-rw-r--r--test/libsolidity/smtCheckerTests/verification_target/simple_assert_with_require.sol4
47 files changed, 491 insertions, 593 deletions
diff --git a/test/libsolidity/SMTChecker.cpp b/test/libsolidity/SMTChecker.cpp
index 13fcc5b4..a49618bd 100644
--- a/test/libsolidity/SMTChecker.cpp
+++ b/test/libsolidity/SMTChecker.cpp
@@ -56,599 +56,6 @@ protected:
BOOST_FIXTURE_TEST_SUITE(SMTChecker, SMTCheckerFramework)
-BOOST_AUTO_TEST_CASE(smoke_test)
-{
- string text = R"(
- contract C { }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
-}
-
-BOOST_AUTO_TEST_CASE(simple_overflow)
-{
- string text = R"(
- contract C {
- function f(uint a, uint b) public pure returns (uint) { return a + b; }
- }
- )";
- CHECK_WARNING(text, "Overflow (resulting value larger than");
-}
-
-BOOST_AUTO_TEST_CASE(warn_on_typecast)
-{
- string text = R"(
- contract C {
- function f() public pure returns (uint) {
- return uint8(1);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion checker does not yet implement this expression.");
-}
-
-BOOST_AUTO_TEST_CASE(warn_on_struct)
-{
- string text = R"(
- pragma experimental ABIEncoderV2;
- contract C {
- struct A { uint a; uint b; }
- function f() public pure returns (A memory) {
- return A({ a: 1, b: 2 });
- }
- }
- )";
- CHECK_WARNING_ALLOW_MULTI(text, (vector<string>{
- "Experimental feature",
- "Assertion checker does not yet implement this expression.",
- "Assertion checker does not yet support the type of this variable."
- }));
-}
-
-BOOST_AUTO_TEST_CASE(simple_assert)
-{
- string text = R"(
- contract C {
- function f(uint a) public pure { assert(a == 2); }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
-}
-
-BOOST_AUTO_TEST_CASE(simple_assert_with_require)
-{
- string text = R"(
- contract C {
- function f(uint a) public pure { require(a < 10); assert(a < 20); }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
-}
-
-BOOST_AUTO_TEST_CASE(assignment_in_declaration)
-{
- string text = R"(
- contract C {
- function f() public pure { uint a = 2; assert(a == 2); }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
-}
-
-BOOST_AUTO_TEST_CASE(branches_merge_variables)
-{
- // Branch does not touch variable a
- string text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 3;
- if (x > 10) {
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- // Positive branch touches variable a, but assertion should still hold.
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 3;
- if (x > 10) {
- a = 3;
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- // Negative branch touches variable a, but assertion should still hold.
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 3;
- if (x > 10) {
- } else {
- a = 3;
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- // Variable is not merged, if it is only read.
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 3;
- if (x > 10) {
- assert(a == 3);
- } else {
- assert(a == 3);
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- // Variable is reset in both branches
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 2;
- if (x > 10) {
- a = 3;
- } else {
- a = 3;
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- // Variable is reset in both branches
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 2;
- if (x > 10) {
- a = 3;
- } else {
- a = 4;
- }
- assert(a >= 3);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
-}
-
-BOOST_AUTO_TEST_CASE(branches_assert_condition)
-{
- string text = R"(
- contract C {
- function f(uint x) public pure {
- if (x > 10) {
- assert(x > 9);
- }
- else
- {
- assert(x < 11);
- }
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(uint x) public pure {
- if (x > 10) {
- assert(x > 9);
- }
- else if (x > 2)
- {
- assert(x <= 10 && x > 2);
- }
- else
- {
- assert(0 <= x && x <= 2);
- }
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
-}
-
-BOOST_AUTO_TEST_CASE(ways_to_merge_variables)
-{
- string text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 3;
- if (x > 10) {
- a++;
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 3;
- if (x > 10) {
- ++a;
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint a = 3;
- if (x > 10) {
- a = 5;
- }
- assert(a == 3);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
-}
-
-BOOST_AUTO_TEST_CASE(bool_simple)
-{
- string text = R"(
- contract C {
- function f(bool x) public pure {
- assert(x);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- text = R"(
- contract C {
- function f(bool x, bool y) public pure {
- assert(x == y);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- text = R"(
- contract C {
- function f(bool x, bool y) public pure {
- bool z = x || y;
- assert(!(x && y) || z);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(bool x) public pure {
- if (x) {
- assert(x);
- } else {
- assert(!x);
- }
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(bool x) public pure {
- bool y = x;
- assert(x == y);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(bool x) public pure {
- require(x);
- bool y;
- y = false;
- assert(x || y);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
-}
-
-BOOST_AUTO_TEST_CASE(bool_int_mixed)
-{
- string text = R"(
- contract C {
- function f(bool x) public pure {
- uint a;
- if (x)
- a = 1;
- assert(!x || a > 0);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(bool x, uint a) public pure {
- require(!x || a > 0);
- uint b = a;
- assert(!x || b > 0);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(bool x, bool y) public pure {
- uint a;
- if (x) {
- if (y) {
- a = 0;
- } else {
- a = 1;
- }
- } else {
- if (y) {
- a = 1;
- } else {
- a = 0;
- }
- }
- bool xor_x_y = (x && !y) || (!x && y);
- assert(!xor_x_y || a > 0);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
-}
-
-BOOST_AUTO_TEST_CASE(storage_value_vars)
-{
- string text = R"(
- contract C
- {
- address a;
- bool b;
- uint c;
- function f(uint x) public {
- if (x == 0)
- {
- a = 0x0000000000000000000000000000000000000100;
- b = true;
- }
- else
- {
- a = 0x0000000000000000000000000000000000000200;
- b = false;
- }
- assert(a > 0x0000000000000000000000000000000000000000 && b);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- text = R"(
- contract C
- {
- address a;
- bool b;
- uint c;
- function f() public view {
- assert(c > 0);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- text = R"(
- contract C
- {
- function f(uint x) public {
- if (x == 0)
- {
- a = 0x0000000000000000000000000000000000000100;
- b = true;
- }
- else
- {
- a = 0x0000000000000000000000000000000000000200;
- b = false;
- }
- assert(b == (a < 0x0000000000000000000000000000000000000200));
- }
-
- function g() public view {
- require(a < 0x0000000000000000000000000000000000000100);
- assert(c >= 0);
- }
- address a;
- bool b;
- uint c;
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C
- {
- function f() public view {
- assert(c > 0);
- }
- uint c;
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
-
-}
-
-BOOST_AUTO_TEST_CASE(while_loop_simple)
-{
- // Check that variables are cleared
- string text = R"(
- contract C {
- function f(uint x) public pure {
- x = 2;
- while (x > 1) {
- x = 2;
- }
- assert(x == 2);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- // Check that condition is assumed.
- text = R"(
- contract C {
- function f(uint x) public pure {
- while (x == 2) {
- assert(x == 2);
- }
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- // Check that condition is not assumed after the body anymore
- text = R"(
- contract C {
- function f(uint x) public pure {
- while (x == 2) {
- }
- assert(x == 2);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- // Check that negation of condition is not assumed after the body anymore
- text = R"(
- contract C {
- function f(uint x) public pure {
- while (x == 2) {
- }
- assert(x != 2);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
- // Check that side-effects of condition are taken into account
- text = R"(
- contract C {
- function f(uint x, uint y) public pure {
- x = 7;
- while ((x = y) > 0) {
- }
- assert(x == 7);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation happens here");
-}
-
-BOOST_AUTO_TEST_CASE(constant_condition)
-{
- string text = R"(
- contract C {
- function f(uint x) public pure {
- if (x >= 0) { revert(); }
- }
- }
- )";
- CHECK_WARNING_ALLOW_MULTI(text, (vector<string>{
- "Condition is always true",
- "Assertion checker does not yet implement this type of function call"
- }));
- text = R"(
- contract C {
- function f(uint x) public pure {
- if (x >= 10) { if (x < 10) { revert(); } }
- }
- }
- )";
- CHECK_WARNING_ALLOW_MULTI(text, (vector<string>{
- "Condition is always false",
- "Assertion checker does not yet implement this type of function call"
- }));
- // a plain literal constant is fine
- text = R"(
- contract C {
- function f(uint) public pure {
- if (true) { revert(); }
- }
- }
- )";
- CHECK_WARNING(text, "Assertion checker does not yet implement this type of function call");
-}
-
-
-BOOST_AUTO_TEST_CASE(for_loop)
-{
- string text = R"(
- contract C {
- function f(uint x) public pure {
- require(x == 2);
- for (;;) {}
- assert(x == 2);
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(uint x) public pure {
- for (; x == 2; ) {
- assert(x == 2);
- }
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(uint x) public pure {
- for (uint y = 2; x < 10; ) {
- assert(y == 2);
- }
- }
- }
- )";
- CHECK_SUCCESS_NO_WARNINGS(text);
- text = R"(
- contract C {
- function f(uint x) public pure {
- for (uint y = 2; x < 10; y = 3) {
- assert(y == 2);
- }
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation");
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint y;
- for (y = 2; x < 10; ) {
- y = 3;
- }
- assert(y == 3);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation");
- text = R"(
- contract C {
- function f(uint x) public pure {
- uint y;
- for (y = 2; x < 10; ) {
- y = 3;
- }
- assert(y == 2);
- }
- }
- )";
- CHECK_WARNING(text, "Assertion violation");
-}
-
BOOST_AUTO_TEST_CASE(division)
{
string text = R"(
diff --git a/test/libsolidity/smtCheckerTests/complex/warn_on_struct.sol b/test/libsolidity/smtCheckerTests/complex/warn_on_struct.sol
new file mode 100644
index 00000000..6d9afe7c
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/complex/warn_on_struct.sol
@@ -0,0 +1,14 @@
+pragma experimental SMTChecker;
+
+contract C {
+ struct A { uint a; uint b; }
+ function f() public pure returns (uint) {
+ A memory a = A({ a: 1, b: 2 });
+ }
+}
+// ----
+// Warning: (133-143): Unused local variable.
+// Warning: (133-143): Assertion checker does not yet support the type of this variable.
+// Warning: (146-163): Assertion checker does not yet implement this expression.
+// Warning: (146-163): Internal error: Expression undefined for SMT solver.
+// Warning: (146-163): Assertion checker does not yet implement this type.
diff --git a/test/libsolidity/smtCheckerTests/complex/warn_on_typecast.sol b/test/libsolidity/smtCheckerTests/complex/warn_on_typecast.sol
new file mode 100644
index 00000000..be785414
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/complex/warn_on_typecast.sol
@@ -0,0 +1,8 @@
+pragma experimental SMTChecker;
+contract C {
+ function f() public pure returns (uint) {
+ return uint8(1);
+ }
+}
+// ----
+// Warning: (106-114): Assertion checker does not yet implement this expression.
diff --git a/test/libsolidity/smtCheckerTests/control_flow/assignment_in_declaration.sol b/test/libsolidity/smtCheckerTests/control_flow/assignment_in_declaration.sol
new file mode 100644
index 00000000..0c701672
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/assignment_in_declaration.sol
@@ -0,0 +1,4 @@
+pragma experimental SMTChecker;
+contract C {
+ function f() public pure { uint a = 2; assert(a == 2); }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_1.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_1.sol
new file mode 100644
index 00000000..64f6e012
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_1.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ if (x > 10) {
+ assert(x > 9);
+ }
+ else
+ {
+ assert(x < 11);
+ }
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_2.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_2.sol
new file mode 100644
index 00000000..e39ab844
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_assert_condition_2.sol
@@ -0,0 +1,16 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ if (x > 10) {
+ assert(x > 9);
+ }
+ else if (x > 2)
+ {
+ assert(x <= 10 && x > 2);
+ }
+ else
+ {
+ assert(0 <= x && x <= 2);
+ }
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_1.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_1.sol
new file mode 100644
index 00000000..f93e32e4
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_1.sol
@@ -0,0 +1,10 @@
+pragma experimental SMTChecker;
+// Branch does not touch variable a
+contract C {
+ function f(uint x) public pure {
+ uint a = 3;
+ if (x > 10) {
+ }
+ assert(a == 3);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_2.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_2.sol
new file mode 100644
index 00000000..c00ef787
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_2.sol
@@ -0,0 +1,11 @@
+pragma experimental SMTChecker;
+// Positive branch touches variable a, but assertion should still hold.
+contract C {
+ function f(uint x) public pure {
+ uint a = 3;
+ if (x > 10) {
+ a = 3;
+ }
+ assert(a == 3);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_3.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_3.sol
new file mode 100644
index 00000000..4e18aa88
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_3.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+// Negative branch touches variable a, but assertion should still hold.
+contract C {
+ function f(uint x) public pure {
+ uint a = 3;
+ if (x > 10) {
+ } else {
+ a = 3;
+ }
+ assert(a == 3);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_4.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_4.sol
new file mode 100644
index 00000000..e3a02704
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_4.sol
@@ -0,0 +1,13 @@
+pragma experimental SMTChecker;
+// Variable is not merged, if it is only read.
+contract C {
+ function f(uint x) public pure {
+ uint a = 3;
+ if (x > 10) {
+ assert(a == 3);
+ } else {
+ assert(a == 3);
+ }
+ assert(a == 3);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_5.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_5.sol
new file mode 100644
index 00000000..0bd1cf3a
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_5.sol
@@ -0,0 +1,13 @@
+pragma experimental SMTChecker;
+// Variable is reset in both branches
+contract C {
+ function f(uint x) public pure {
+ uint a = 2;
+ if (x > 10) {
+ a = 3;
+ } else {
+ a = 3;
+ }
+ assert(a == 3);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_6.sol b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_6.sol
new file mode 100644
index 00000000..8e477179
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/branches_merge_variables_6.sol
@@ -0,0 +1,13 @@
+pragma experimental SMTChecker;
+// Variable is reset in both branches
+contract C {
+ function f(uint x) public pure {
+ uint a = 2;
+ if (x > 10) {
+ a = 3;
+ } else {
+ a = 4;
+ }
+ assert(a >= 3);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_1.sol b/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_1.sol
new file mode 100644
index 00000000..16d6fdfe
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_1.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ uint a = 3;
+ if (x > 10) {
+ a++;
+ }
+ assert(a == 3);
+ }
+}
+// ----
+// Warning: (159-173): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_2.sol b/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_2.sol
new file mode 100644
index 00000000..e25ab20f
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_2.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ uint a = 3;
+ if (x > 10) {
+ ++a;
+ }
+ assert(a == 3);
+ }
+}
+// ----
+// Warning: (159-173): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_3.sol b/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_3.sol
new file mode 100644
index 00000000..03ae7216
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/control_flow/ways_to_merge_variables_3.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ uint a = 3;
+ if (x > 10) {
+ a = 5;
+ }
+ assert(a == 3);
+ }
+}
+// ----
+// Warning: (161-175): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/functions/function_call_does_not_clear_local_vars.sol b/test/libsolidity/smtCheckerTests/functions/function_call_does_not_clear_local_vars.sol
new file mode 100644
index 00000000..b4260224
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/functions/function_call_does_not_clear_local_vars.sol
@@ -0,0 +1,13 @@
+pragma experimental SMTChecker;
+contract C {
+ function f() public {
+ uint a = 3;
+ this.f();
+ assert(a == 3);
+ f();
+ assert(a == 3);
+ }
+}
+// ----
+// Warning: (99-107): Assertion checker does not yet implement this type of function call.
+// Warning: (141-144): Assertion checker does not support recursive function calls.
diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_1.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_1.sol
new file mode 100644
index 00000000..8988efad
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/for_loop_1.sol
@@ -0,0 +1,8 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ require(x == 2);
+ for (;;) {}
+ assert(x == 2);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_2.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_2.sol
new file mode 100644
index 00000000..58c9f3a7
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/for_loop_2.sol
@@ -0,0 +1,8 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ for (; x == 2; ) {
+ assert(x == 2);
+ }
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_3.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_3.sol
new file mode 100644
index 00000000..8bf9bdc7
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/for_loop_3.sol
@@ -0,0 +1,8 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ for (uint y = 2; x < 10; ) {
+ assert(y == 2);
+ }
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_4.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_4.sol
new file mode 100644
index 00000000..4d082026
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/for_loop_4.sol
@@ -0,0 +1,10 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ for (uint y = 2; x < 10; y = 3) {
+ assert(y == 2);
+ }
+ }
+}
+// ----
+// Warning: (136-150): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_5.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_5.sol
new file mode 100644
index 00000000..2c84960f
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/for_loop_5.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ uint y;
+ for (y = 2; x < 10; ) {
+ y = 3;
+ }
+ assert(y == 3);
+ }
+}
+// ----
+// Warning: (167-181): Assertion violation happens here\nNote that some information is erased after the execution of loops.\nYou can re-introduce information using require().
diff --git a/test/libsolidity/smtCheckerTests/loops/for_loop_6.sol b/test/libsolidity/smtCheckerTests/loops/for_loop_6.sol
new file mode 100644
index 00000000..90c4c328
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/for_loop_6.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ uint y;
+ for (y = 2; x < 10; ) {
+ y = 3;
+ }
+ assert(y == 2);
+ }
+}
+// ----
+// Warning: (167-181): Assertion violation happens here\nNote that some information is erased after the execution of loops.\nYou can re-introduce information using require().
diff --git a/test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol
new file mode 100644
index 00000000..074be86f
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_1.sol
@@ -0,0 +1,13 @@
+pragma experimental SMTChecker;
+// Check that variables are cleared
+contract C {
+ function f(uint x) public pure {
+ x = 2;
+ while (x > 1) {
+ x = 2;
+ }
+ assert(x == 2);
+ }
+}
+// ----
+// Warning: (194-208): Assertion violation happens here\nNote that some information is erased after the execution of loops.\nYou can re-introduce information using require().
diff --git a/test/libsolidity/smtCheckerTests/loops/while_loop_simple_2.sol b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_2.sol
new file mode 100644
index 00000000..92a3f0fe
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_2.sol
@@ -0,0 +1,9 @@
+pragma experimental SMTChecker;
+// Check that condition is assumed.
+contract C {
+ function f(uint x) public pure {
+ while (x == 2) {
+ assert(x == 2);
+ }
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/loops/while_loop_simple_3.sol b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_3.sol
new file mode 100644
index 00000000..a37df888
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_3.sol
@@ -0,0 +1,11 @@
+pragma experimental SMTChecker;
+// Check that condition is not assumed after the body anymore
+contract C {
+ function f(uint x) public pure {
+ while (x == 2) {
+ }
+ assert(x == 2);
+ }
+}
+// ----
+// Warning: (187-201): Assertion violation happens here\nNote that some information is erased after the execution of loops.\nYou can re-introduce information using require().
diff --git a/test/libsolidity/smtCheckerTests/loops/while_loop_simple_4.sol b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_4.sol
new file mode 100644
index 00000000..f71da865
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_4.sol
@@ -0,0 +1,11 @@
+pragma experimental SMTChecker;
+// Check that negation of condition is not assumed after the body anymore
+contract C {
+ function f(uint x) public pure {
+ while (x == 2) {
+ }
+ assert(x != 2);
+ }
+}
+// ----
+// Warning: (199-213): Assertion violation happens here\nNote that some information is erased after the execution of loops.\nYou can re-introduce information using require().
diff --git a/test/libsolidity/smtCheckerTests/loops/while_loop_simple_5.sol b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_5.sol
new file mode 100644
index 00000000..41559c99
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/loops/while_loop_simple_5.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+// Check that side-effects of condition are taken into account
+contract C {
+ function f(uint x, uint y) public pure {
+ x = 7;
+ while ((x = y) > 0) {
+ }
+ assert(x == 7);
+ }
+}
+// ----
+// Warning: (216-230): Assertion violation happens here\nNote that some information is erased after the execution of loops.\nYou can re-introduce information using require().
diff --git a/test/libsolidity/smtCheckerTests/overflow/simple_overflow.sol b/test/libsolidity/smtCheckerTests/overflow/simple_overflow.sol
new file mode 100644
index 00000000..894ff1a4
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/overflow/simple_overflow.sol
@@ -0,0 +1,6 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint a, uint b) public pure returns (uint) { return a + b; }
+}
+// ----
+// Warning: (112-117): Overflow (resulting value larger than 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) happens here
diff --git a/test/libsolidity/smtCheckerTests/simple/smoke_test.sol b/test/libsolidity/smtCheckerTests/simple/smoke_test.sol
new file mode 100644
index 00000000..8b7b77da
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/simple/smoke_test.sol
@@ -0,0 +1,3 @@
+pragma experimental SMTChecker;
+contract C {
+}
diff --git a/test/libsolidity/smtCheckerTests/types/bool_int_mixed_1.sol b/test/libsolidity/smtCheckerTests/types/bool_int_mixed_1.sol
new file mode 100644
index 00000000..d611cc17
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_int_mixed_1.sol
@@ -0,0 +1,9 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x) public pure {
+ uint a;
+ if(x)
+ a = 1;
+ assert(!x || a > 0);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/types/bool_int_mixed_2.sol b/test/libsolidity/smtCheckerTests/types/bool_int_mixed_2.sol
new file mode 100644
index 00000000..24640c5a
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_int_mixed_2.sol
@@ -0,0 +1,8 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x, uint a) public pure {
+ require(!x || a > 0);
+ uint b = a;
+ assert(!x || b > 0);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/types/bool_int_mixed_3.sol b/test/libsolidity/smtCheckerTests/types/bool_int_mixed_3.sol
new file mode 100644
index 00000000..f872e82f
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_int_mixed_3.sol
@@ -0,0 +1,21 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x, bool y) public pure {
+ uint a;
+ if (x) {
+ if (y) {
+ a = 0;
+ } else {
+ a = 1;
+ }
+ } else {
+ if (y) {
+ a = 1;
+ } else {
+ a = 0;
+ }
+ }
+ bool xor_x_y = (x && !y) || (!x && y);
+ assert(!xor_x_y || a > 0);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/types/bool_simple_1.sol b/test/libsolidity/smtCheckerTests/types/bool_simple_1.sol
new file mode 100644
index 00000000..76b4b08b
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_simple_1.sol
@@ -0,0 +1,8 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x) public pure {
+ assert(x);
+ }
+}
+// ----
+// Warning: (90-99): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/types/bool_simple_2.sol b/test/libsolidity/smtCheckerTests/types/bool_simple_2.sol
new file mode 100644
index 00000000..5c166c02
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_simple_2.sol
@@ -0,0 +1,8 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x, bool y) public pure {
+ assert(x == y);
+ }
+}
+// ----
+// Warning: (98-112): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/types/bool_simple_3.sol b/test/libsolidity/smtCheckerTests/types/bool_simple_3.sol
new file mode 100644
index 00000000..1d2ab49f
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_simple_3.sol
@@ -0,0 +1,7 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x, bool y) public pure {
+ bool z = x || y;
+ assert(!(x && y) || z);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/types/bool_simple_4.sol b/test/libsolidity/smtCheckerTests/types/bool_simple_4.sol
new file mode 100644
index 00000000..c40404a4
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_simple_4.sol
@@ -0,0 +1,10 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x) public pure {
+ if(x) {
+ assert(x);
+ } else {
+ assert(!x);
+ }
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/types/bool_simple_5.sol b/test/libsolidity/smtCheckerTests/types/bool_simple_5.sol
new file mode 100644
index 00000000..4cecebbc
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_simple_5.sol
@@ -0,0 +1,7 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x) public pure {
+ bool y = x;
+ assert(x == y);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/types/bool_simple_6.sol b/test/libsolidity/smtCheckerTests/types/bool_simple_6.sol
new file mode 100644
index 00000000..90350bb6
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/bool_simple_6.sol
@@ -0,0 +1,9 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(bool x) public pure {
+ require(x);
+ bool y;
+ y = false;
+ assert(x || y);
+ }
+}
diff --git a/test/libsolidity/smtCheckerTests/types/storage_value_vars_1.sol b/test/libsolidity/smtCheckerTests/types/storage_value_vars_1.sol
new file mode 100644
index 00000000..84f6c77e
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/storage_value_vars_1.sol
@@ -0,0 +1,22 @@
+pragma experimental SMTChecker;
+contract C
+{
+ address a;
+ bool b;
+ uint c;
+ function f(uint x) public {
+ if (x == 0)
+ {
+ a = 0x0000000000000000000000000000000000000100;
+ b = true;
+ }
+ else
+ {
+ a = 0x0000000000000000000000000000000000000200;
+ b = false;
+ }
+ assert(a > 0x0000000000000000000000000000000000000000 && b);
+ }
+}
+// ----
+// Warning: (362-421): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/types/storage_value_vars_2.sol b/test/libsolidity/smtCheckerTests/types/storage_value_vars_2.sol
new file mode 100644
index 00000000..bceddb38
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/storage_value_vars_2.sol
@@ -0,0 +1,12 @@
+pragma experimental SMTChecker;
+contract C
+{
+ address a;
+ bool b;
+ uint c;
+ function f() public view {
+ assert(c > 0);
+ }
+}
+// ----
+// Warning: (123-136): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/types/storage_value_vars_3.sol b/test/libsolidity/smtCheckerTests/types/storage_value_vars_3.sol
new file mode 100644
index 00000000..39049b99
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/storage_value_vars_3.sol
@@ -0,0 +1,25 @@
+pragma experimental SMTChecker;
+contract C
+{
+ function f(uint x) public {
+ if (x == 0)
+ {
+ a = 0x0000000000000000000000000000000000000100;
+ b = true;
+ }
+ else
+ {
+ a = 0x0000000000000000000000000000000000000200;
+ b = false;
+ }
+ assert(b == (a < 0x0000000000000000000000000000000000000200));
+ }
+
+ function g() public view {
+ require(a < 0x0000000000000000000000000000000000000100);
+ assert(c >= 0);
+ }
+ address a;
+ bool b;
+ uint c;
+}
diff --git a/test/libsolidity/smtCheckerTests/types/storage_value_vars_4.sol b/test/libsolidity/smtCheckerTests/types/storage_value_vars_4.sol
new file mode 100644
index 00000000..88b6b0ae
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/types/storage_value_vars_4.sol
@@ -0,0 +1,10 @@
+pragma experimental SMTChecker;
+contract C
+{
+ function f() public view {
+ assert(c > 0);
+ }
+ uint c;
+}
+// ----
+// Warning: (84-97): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/verification_target/constant_condition_1.sol b/test/libsolidity/smtCheckerTests/verification_target/constant_condition_1.sol
new file mode 100644
index 00000000..b9fae4ee
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/verification_target/constant_condition_1.sol
@@ -0,0 +1,9 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ if (x >= 0) { revert(); }
+ }
+}
+// ----
+// Warning: (94-100): Condition is always true.
+// Warning: (104-112): Assertion checker does not yet implement this type of function call.
diff --git a/test/libsolidity/smtCheckerTests/verification_target/constant_condition_2.sol b/test/libsolidity/smtCheckerTests/verification_target/constant_condition_2.sol
new file mode 100644
index 00000000..aaa613ea
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/verification_target/constant_condition_2.sol
@@ -0,0 +1,9 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint x) public pure {
+ if (x >= 10) { if (x < 10) { revert(); } }
+ }
+}
+// ----
+// Warning: (109-115): Condition is always false.
+// Warning: (119-127): Assertion checker does not yet implement this type of function call.
diff --git a/test/libsolidity/smtCheckerTests/verification_target/constant_condition_3.sol b/test/libsolidity/smtCheckerTests/verification_target/constant_condition_3.sol
new file mode 100644
index 00000000..f22cd65e
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/verification_target/constant_condition_3.sol
@@ -0,0 +1,9 @@
+pragma experimental SMTChecker;
+// a plain literal constant is fine
+contract C {
+ function f(uint) public pure {
+ if (true) { revert(); }
+ }
+}
+// ----
+// Warning: (136-144): Assertion checker does not yet implement this type of function call.
diff --git a/test/libsolidity/smtCheckerTests/verification_target/simple_assert.sol b/test/libsolidity/smtCheckerTests/verification_target/simple_assert.sol
new file mode 100644
index 00000000..8bd6e61a
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/verification_target/simple_assert.sol
@@ -0,0 +1,6 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint a) public pure { assert(a == 2); }
+}
+// ----
+// Warning: (82-96): Assertion violation happens here
diff --git a/test/libsolidity/smtCheckerTests/verification_target/simple_assert_with_require.sol b/test/libsolidity/smtCheckerTests/verification_target/simple_assert_with_require.sol
new file mode 100644
index 00000000..b66ae245
--- /dev/null
+++ b/test/libsolidity/smtCheckerTests/verification_target/simple_assert_with_require.sol
@@ -0,0 +1,4 @@
+pragma experimental SMTChecker;
+contract C {
+ function f(uint a) public pure { require(a < 10); assert(a < 20); }
+}