aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmake/jsoncpp.cmake8
-rw-r--r--cmake/scripts/buildinfo.cmake2
-rw-r--r--docs/introduction-to-smart-contracts.rst8
-rw-r--r--libsolidity/ast/AST.cpp4
-rw-r--r--libsolidity/inlineasm/AsmParser.cpp4
-rw-r--r--libsolidity/interface/StandardCompiler.cpp4
-rwxr-xr-xscripts/install_deps.sh7
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp57
-rw-r--r--test/libsolidity/SolidityExpressionCompiler.cpp3
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp89
-rw-r--r--test/libsolidity/SolidityOptimizer.cpp12
-rw-r--r--test/libsolidity/SolidityParser.cpp636
-rw-r--r--test/libsolidity/syntaxTests/parsing/arrays_in_events.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol8
-rw-r--r--test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/calling_function.sol9
-rw-r--r--test/libsolidity/syntaxTests/parsing/conditional_multiple.sol9
-rw-r--r--test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol11
-rw-r--r--test/libsolidity/syntaxTests/parsing/conditional_with_assignment.sol11
-rw-r--r--test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol11
-rw-r--r--test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol13
-rw-r--r--test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol14
-rw-r--r--test/libsolidity/syntaxTests/parsing/declaring_fixed_literal_variables.sol5
-rw-r--r--test/libsolidity/syntaxTests/parsing/else_if_statement.sol8
-rw-r--r--test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol10
-rw-r--r--test/libsolidity/syntaxTests/parsing/event.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/event_arguments.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/event_arguments_indexed.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/exp_expression.sol9
-rw-r--r--test/libsolidity/syntaxTests/parsing/external_function.sol5
-rw-r--r--test/libsolidity/syntaxTests/parsing/fallback_function.sol5
-rw-r--r--test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol13
-rw-r--r--test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol13
-rw-r--r--test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol11
-rw-r--r--test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol12
-rw-r--r--test/libsolidity/syntaxTests/parsing/from_is_not_keyword.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/function_normal_comments.sol10
-rw-r--r--test/libsolidity/syntaxTests/parsing/function_type_as_parameter.sol5
-rw-r--r--test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol10
-rw-r--r--test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol15
-rw-r--r--test/libsolidity/syntaxTests/parsing/function_type_in_struct.sol11
-rw-r--r--test/libsolidity/syntaxTests/parsing/if_statement.sol11
-rw-r--r--test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol9
-rw-r--r--test/libsolidity/syntaxTests/parsing/library_simple.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol16
-rw-r--r--test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol10
-rw-r--r--test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol12
-rw-r--r--test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol5
-rw-r--r--test/libsolidity/syntaxTests/parsing/mapping.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/mapping_and_array_of_functions.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/mapping_in_struct.sol7
-rw-r--r--test/libsolidity/syntaxTests/parsing/mapping_to_mapping_in_struct.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/modifier.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/modifier_arguments.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/modifier_invocation.sol8
-rw-r--r--test/libsolidity/syntaxTests/parsing/multi_arrays.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/multiple_event_arg_trailing_comma.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol28
-rw-r--r--test/libsolidity/syntaxTests/parsing/multiple_modifier_arg_trailing_comma.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/multiple_return_param_trailing_comma.sol5
-rw-r--r--test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol11
-rw-r--r--test/libsolidity/syntaxTests/parsing/struct_definition.sol7
-rw-r--r--test/libsolidity/syntaxTests/parsing/two_exact_functions.sol9
-rw-r--r--test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol17
-rw-r--r--test/libsolidity/syntaxTests/parsing/while_loop.sol9
-rw-r--r--test/tools/isoltest.cpp4
67 files changed, 580 insertions, 716 deletions
diff --git a/cmake/jsoncpp.cmake b/cmake/jsoncpp.cmake
index 3d6b37ed..cc2da7e7 100644
--- a/cmake/jsoncpp.cmake
+++ b/cmake/jsoncpp.cmake
@@ -7,8 +7,14 @@ else()
endif()
include(GNUInstallDirs)
+set(libdir ${CMAKE_INSTALL_LIBDIR})
+if(CMAKE_LIBRARY_ARCHITECTURE)
+ # Do not use Debian multiarch library dir.
+ string(REPLACE "/${CMAKE_LIBRARY_ARCHITECTURE}" "" libdir ${libdir})
+endif()
+
set(prefix "${CMAKE_BINARY_DIR}/deps")
-set(JSONCPP_LIBRARY "${prefix}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}jsoncpp${CMAKE_STATIC_LIBRARY_SUFFIX}")
+set(JSONCPP_LIBRARY "${prefix}/${libdir}/${CMAKE_STATIC_LIBRARY_PREFIX}jsoncpp${CMAKE_STATIC_LIBRARY_SUFFIX}")
set(JSONCPP_INCLUDE_DIR "${prefix}/include")
if(NOT MSVC)
diff --git a/cmake/scripts/buildinfo.cmake b/cmake/scripts/buildinfo.cmake
index efbfb8fb..9147a1b4 100644
--- a/cmake/scripts/buildinfo.cmake
+++ b/cmake/scripts/buildinfo.cmake
@@ -19,7 +19,7 @@ if (NOT ETH_BUILD_PLATFORM)
set(ETH_BUILD_PLATFORM "unknown")
endif()
-# Logic here: If prereleases.txt exists but is empty, it is a non-pre release.
+# Logic here: If prerelease.txt exists but is empty, it is a non-pre release.
# If it does not exist, create our own prerelease string
if (EXISTS ${ETH_SOURCE_DIR}/prerelease.txt)
file(READ ${ETH_SOURCE_DIR}/prerelease.txt SOL_VERSION_PRERELEASE)
diff --git a/docs/introduction-to-smart-contracts.rst b/docs/introduction-to-smart-contracts.rst
index d1789c44..71f9bd8e 100644
--- a/docs/introduction-to-smart-contracts.rst
+++ b/docs/introduction-to-smart-contracts.rst
@@ -33,7 +33,7 @@ Storage
The first line simply tells that the source code is written for
Solidity version 0.4.0 or anything newer that does not break functionality
(up to, but not including, version 0.5.0). This is to ensure that the
-contract does not suddenly behave differently with a new compiler version. The keyword ``pragma`` is called that way because, in general,
+contract does not suddenly behave differently with a new compiler version. The keyword ``pragma`` is called that because, in general,
pragmas are instructions for the compiler about how to treat the
source code (e.g. `pragma once <https://en.wikipedia.org/wiki/Pragma_once>`_).
@@ -62,7 +62,7 @@ so that only you can alter the number.
the ASCII character set. It is possible to store UTF-8 encoded data in string variables.
.. warning::
- Be careful with using Unicode text as similarly looking (or even identical) characters can
+ Be careful with using Unicode text, as similar looking (or even identical) characters can
have different code points and as such will be encoded as a different byte array.
.. index:: ! subcurrency
@@ -75,7 +75,7 @@ cryptocurrency. It is possible to generate coins out of thin air, but
only the person that created the contract will be able to do that (it is trivial
to implement a different issuance scheme).
Furthermore, anyone can send coins to each other without any need for
-registering with username and password - all you need is an Ethereum keypair.
+registering with username and password — all you need is an Ethereum keypair.
::
@@ -88,7 +88,7 @@ registering with username and password - all you need is an Ethereum keypair.
address public minter;
mapping (address => uint) public balances;
- // Events allow light clients to react on
+ // Events allow light clients to react to
// changes efficiently.
event Sent(address from, address to, uint amount);
diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp
index 80f5d642..16c9b2d2 100644
--- a/libsolidity/ast/AST.cpp
+++ b/libsolidity/ast/AST.cpp
@@ -312,7 +312,7 @@ FunctionTypePointer FunctionDefinition::functionType(bool _internal) const
case Declaration::Visibility::External:
return {};
default:
- solAssert(false, "visibility() should not return a Visibility");
+ solAssert(false, "visibility() should return a Visibility");
}
}
else
@@ -328,7 +328,7 @@ FunctionTypePointer FunctionDefinition::functionType(bool _internal) const
case Declaration::Visibility::External:
return make_shared<FunctionType>(*this, _internal);
default:
- solAssert(false, "visibility() should not return a Visibility");
+ solAssert(false, "visibility() should return a Visibility");
}
}
diff --git a/libsolidity/inlineasm/AsmParser.cpp b/libsolidity/inlineasm/AsmParser.cpp
index d3b0808b..d300f8fb 100644
--- a/libsolidity/inlineasm/AsmParser.cpp
+++ b/libsolidity/inlineasm/AsmParser.cpp
@@ -606,7 +606,9 @@ bool Parser::isValidNumberLiteral(string const& _literal)
{
try
{
- u256(_literal);
+ // Try to convert _literal to u256.
+ auto tmp = u256(_literal);
+ (void) tmp;
}
catch (...)
{
diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp
index ee9b1440..c8d43e9f 100644
--- a/libsolidity/interface/StandardCompiler.cpp
+++ b/libsolidity/interface/StandardCompiler.cpp
@@ -117,7 +117,7 @@ bool hashMatchesContent(string const& _hash, string const& _content)
{
return dev::h256(_hash) == dev::keccak256(_content);
}
- catch (dev::BadHexCharacter)
+ catch (dev::BadHexCharacter const&)
{
return false;
}
@@ -366,7 +366,7 @@ Json::Value StandardCompiler::compileInternal(Json::Value const& _input)
// @TODO use libraries only for the given source
libraries[library] = h160(address);
}
- catch (dev::BadHexCharacter)
+ catch (dev::BadHexCharacter const&)
{
return formatFatalError(
"JSONError",
diff --git a/scripts/install_deps.sh b/scripts/install_deps.sh
index fa5551bf..1843b064 100755
--- a/scripts/install_deps.sh
+++ b/scripts/install_deps.sh
@@ -133,19 +133,18 @@ case $(uname -s) in
# Arch Linux
#------------------------------------------------------------------------------
- Arch)
+ Arch*)
#Arch
echo "Installing solidity dependencies on Arch Linux."
# All our dependencies can be found in the Arch Linux official repositories.
# See https://wiki.archlinux.org/index.php/Official_repositories
- # Also adding ethereum-git to allow for testing with the `eth` client
sudo pacman -Syu \
base-devel \
boost \
cmake \
git \
- ethereum-git \
+ cvc4
;;
#------------------------------------------------------------------------------
@@ -329,7 +328,7 @@ case $(uname -s) in
"$install_z3"
if [ "$CI" = true ]; then
# install Z3 from PPA if the distribution does not provide it
- if ! dpkg -l libz3-dev > /dev/null 2>&1
+ if ! dpkg -l libz3-dev > /dev/null 2>&1
then
sudo apt-add-repository -y ppa:hvr/z3
sudo apt-get -y update
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 88a1756b..40962294 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -177,7 +177,8 @@ BOOST_AUTO_TEST_CASE(conditional_expression_with_return_values)
function f(bool cond, uint v) returns (uint a, uint b) {
cond ? a = v : b = v;
}
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("f(bool,uint256)", true, u256(20)), encodeArgs(u256(20), u256(0)));
ABI_CHECK(callContractFunction("f(bool,uint256)", false, u256(20)), encodeArgs(u256(0), u256(20)));
@@ -2237,7 +2238,8 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls)
function setHelper(address haddress) {
h = Helper(haddress);
}
- })";
+ }
+ )";
compileAndRun(sourceCode, 0, "Helper");
u160 const c_helperAddress = m_contractAddress;
compileAndRun(sourceCode, 0, "Main");
@@ -2267,7 +2269,8 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls_with_complex_parameters)
function setHelper(address haddress) {
h = Helper(haddress);
}
- })";
+ }
+ )";
compileAndRun(sourceCode, 0, "Helper");
u160 const c_helperAddress = m_contractAddress;
compileAndRun(sourceCode, 0, "Main");
@@ -2298,7 +2301,8 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls_accessing_this)
function setHelper(address addr) {
h = Helper(addr);
}
- })";
+ }
+ )";
compileAndRun(sourceCode, 0, "Helper");
u160 const c_helperAddress = m_contractAddress;
compileAndRun(sourceCode, 0, "Main");
@@ -2329,7 +2333,8 @@ BOOST_AUTO_TEST_CASE(calls_to_this)
function setHelper(address addr) {
h = Helper(addr);
}
- })";
+ }
+ )";
compileAndRun(sourceCode, 0, "Helper");
u160 const c_helperAddress = m_contractAddress;
compileAndRun(sourceCode, 0, "Main");
@@ -2364,7 +2369,8 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls_with_local_vars)
function setHelper(address haddress) {
h = Helper(haddress);
}
- })";
+ }
+ )";
compileAndRun(sourceCode, 0, "Helper");
u160 const c_helperAddress = m_contractAddress;
compileAndRun(sourceCode, 0, "Main");
@@ -2394,7 +2400,8 @@ BOOST_AUTO_TEST_CASE(fixed_bytes_in_calls)
function setHelper(address addr) {
h = Helper(addr);
}
- })";
+ }
+ )";
compileAndRun(sourceCode, 0, "Helper");
u160 const c_helperAddress = m_contractAddress;
compileAndRun(sourceCode, 0, "Main");
@@ -2424,7 +2431,8 @@ BOOST_AUTO_TEST_CASE(constructor_arguments_internal)
}
function getFlag() returns (bool ret) { return h.getFlag(); }
function getName() returns (bytes3 ret) { return h.getName(); }
- })";
+ }
+ )";
compileAndRun(sourceCode, 0, "Main");
ABI_CHECK(callContractFunction("getFlag()"), encodeArgs(true));
ABI_CHECK(callContractFunction("getName()"), encodeArgs("abc"));
@@ -2527,7 +2535,8 @@ BOOST_AUTO_TEST_CASE(functions_called_by_constructor)
}
function getName() returns (bytes3 ret) { return name; }
function setName(bytes3 _name) private { name = _name; }
- })";
+ }
+ )";
compileAndRun(sourceCode);
BOOST_REQUIRE(callContractFunction("getName()") == encodeArgs("abc"));
}
@@ -2653,7 +2662,8 @@ BOOST_AUTO_TEST_CASE(value_for_constructor)
function getFlag() returns (bool ret) { return h.getFlag(); }
function getName() returns (bytes3 ret) { return h.getName(); }
function getBalances() returns (uint me, uint them) { me = this.balance; them = h.balance;}
- })";
+ }
+ )";
compileAndRun(sourceCode, 22, "Main");
BOOST_REQUIRE(callContractFunction("getFlag()") == encodeArgs(true));
BOOST_REQUIRE(callContractFunction("getName()") == encodeArgs("abc"));
@@ -3758,7 +3768,8 @@ BOOST_AUTO_TEST_CASE(sha3_multiple_arguments)
{
d = sha3(a, b, c);
}
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("foo(uint256,uint256,uint256)", 10, 12, 13), encodeArgs(
@@ -4425,7 +4436,8 @@ BOOST_AUTO_TEST_CASE(inline_member_init)
b = m_b;
c = m_c;
}
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("get()"), encodeArgs(5, 6, 8));
}
@@ -4442,7 +4454,8 @@ BOOST_AUTO_TEST_CASE(inline_member_init_inheritence)
function Derived(){}
uint m_derived = 6;
function getDMember() returns (uint i) { return m_derived; }
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("getBMember()"), encodeArgs(5));
ABI_CHECK(callContractFunction("getDMember()"), encodeArgs(6));
@@ -4458,7 +4471,8 @@ BOOST_AUTO_TEST_CASE(inline_member_init_inheritence_without_constructor)
contract Derived is Base {
uint m_derived = 6;
function getDMember() returns (uint i) { return m_derived; }
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("getBMember()"), encodeArgs(5));
ABI_CHECK(callContractFunction("getDMember()"), encodeArgs(6));
@@ -5324,7 +5338,8 @@ BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base)
{}
}
contract Final is Derived(4) {
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("m_i()"), encodeArgs(4));
}
@@ -5347,7 +5362,8 @@ BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base_base)
{}
}
contract Final is Derived(4) {
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("m_i()"), encodeArgs(4));
}
@@ -5367,7 +5383,8 @@ BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base_base_with_gap)
function Derived(uint i) Base(i) {}
}
contract Final is Derived(4) {
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("m_i()"), encodeArgs(4));
}
@@ -5378,7 +5395,8 @@ BOOST_AUTO_TEST_CASE(simple_constant_variables_test)
contract Foo {
function getX() returns (uint r) { return x; }
uint constant x = 56;
- })";
+ }
+ )";
compileAndRun(sourceCode);
ABI_CHECK(callContractFunction("getX()"), encodeArgs(56));
}
@@ -5391,7 +5409,8 @@ BOOST_AUTO_TEST_CASE(constant_variables)
enum ActionChoices { GoLeft, GoRight, GoStraight, Sit }
ActionChoices constant choices = ActionChoices.GoLeft;
bytes32 constant st = "abc\x00\xff__";
- })";
+ }
+ )";
compileAndRun(sourceCode);
}
diff --git a/test/libsolidity/SolidityExpressionCompiler.cpp b/test/libsolidity/SolidityExpressionCompiler.cpp
index 90d8265c..ad26ce6b 100644
--- a/test/libsolidity/SolidityExpressionCompiler.cpp
+++ b/test/libsolidity/SolidityExpressionCompiler.cpp
@@ -249,7 +249,8 @@ BOOST_AUTO_TEST_CASE(int_with_finney_ether_subdenomination)
{
var x = 1 finney;
}
- })";
+ }
+ )";
bytes code = compileFirstExpression(sourceCode);
bytes expectation({byte(Instruction::PUSH7), 0x3, 0x8d, 0x7e, 0xa4, 0xc6, 0x80, 0x00});
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index efc3f24f..d6ab8bef 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -472,9 +472,9 @@ BOOST_AUTO_TEST_CASE(function_external_types)
BOOST_AUTO_TEST_CASE(enum_external_type)
{
- // bug #1801
SourceUnit const* sourceUnit = nullptr;
char const* text = R"(
+ // test for bug #1801
contract Test {
enum ActionChoices { GoLeft, GoRight, GoStraight, Sit }
function boo(ActionChoices enumArg) external returns (uint ret) {
@@ -977,8 +977,8 @@ BOOST_AUTO_TEST_CASE(private_state_variable)
BOOST_AUTO_TEST_CASE(base_class_state_variable_accessor)
{
- // test for issue #1126 https://github.com/ethereum/cpp-ethereum/issues/1126
char const* text = R"(
+ // test for issue #1126 https://github.com/ethereum/cpp-ethereum/issues/1126
contract Parent {
uint256 public m_aMember;
}
@@ -2275,13 +2275,12 @@ BOOST_AUTO_TEST_CASE(constant_string_literal_disallows_assignment)
contract Test {
string constant x = "abefghijklmnopqabcdefghijklmnopqabcdefghijklmnopqabca";
function f() public {
+ // Even if this is made possible in the future, we should not allow assignment
+ // to elements of constant arrays.
x[0] = "f";
}
}
)";
-
- // Even if this is made possible in the future, we should not allow assignment
- // to elements of constant arrays.
CHECK_ERROR(text, TypeError, "Index access for string is not possible.");
}
@@ -2382,11 +2381,11 @@ BOOST_AUTO_TEST_CASE(overloaded_function_cannot_resolve)
BOOST_AUTO_TEST_CASE(ambiguous_overloaded_function)
{
- // literal 1 can be both converted to uint and uint8, so the call is ambiguous.
char const* sourceCode = R"(
contract test {
function f(uint8 a) public returns (uint) { return a; }
- function f(uint a) public returns (uint) { return 2*a; }
+ function f(uint a) public returns (uint) { return 2 * a; }
+ // literal 1 can be both converted to uint and uint8, so the call is ambiguous.
function g() public returns (uint) { return f(1); }
}
)";
@@ -2809,12 +2808,12 @@ BOOST_AUTO_TEST_CASE(function_argument_storage_to_mem)
BOOST_AUTO_TEST_CASE(mem_array_assignment_changes_base_type)
{
- // Such an assignment is possible in storage, but not in memory
- // (because it would incur an otherwise unnecessary copy).
- // This requirement might be lifted, though.
char const* sourceCode = R"(
contract C {
function f(uint8[] memory x) private {
+ // Such an assignment is possible in storage, but not in memory
+ // (because it would incur an otherwise unnecessary copy).
+ // This requirement might be lifted, though.
uint[] memory y = x;
}
}
@@ -3358,13 +3357,13 @@ BOOST_AUTO_TEST_CASE(using_for_mismatch)
BOOST_AUTO_TEST_CASE(using_for_not_used)
{
- // This is an error because the function is only bound to uint.
- // Had it been bound to *, it would have worked.
char const* text = R"(
library D { function double(uint self) public returns (uint) { return 2; } }
contract C {
using D for uint;
function f(uint16 a) public returns (uint) {
+ // This is an error because the function is only bound to uint.
+ // Had it been bound to *, it would have worked.
return a.double();
}
}
@@ -3386,12 +3385,12 @@ BOOST_AUTO_TEST_CASE(library_memory_struct)
BOOST_AUTO_TEST_CASE(using_for_arbitrary_mismatch)
{
- // Bound to a, but self type does not match.
char const* text = R"(
library D { function double(bytes32 self) public returns (uint) { return 2; } }
contract C {
using D for *;
function f(uint a) public returns (uint) {
+ // Bound to a, but self type does not match.
return a.double();
}
}
@@ -4756,20 +4755,19 @@ BOOST_AUTO_TEST_CASE(illegal_override_payable_nonpayable)
BOOST_AUTO_TEST_CASE(function_variable_mixin)
{
- // bug #1798 (cpp-ethereum), related to #1286 (solidity)
- char const* text = R"(
- contract attribute {
- bool ok = false;
- }
- contract func {
- function ok() public returns (bool) { return true; }
- }
-
- contract attr_func is attribute, func {
- function checkOk() public returns (bool) { return ok(); }
- }
- )";
- CHECK_ERROR(text, DeclarationError, "Identifier already declared.");
+ char const* text = R"(
+ // bug #1798 (cpp-ethereum), related to #1286 (solidity)
+ contract attribute {
+ bool ok = false;
+ }
+ contract func {
+ function ok() public returns (bool) { return true; }
+ }
+ contract attr_func is attribute, func {
+ function checkOk() public returns (bool) { return ok(); }
+ }
+ )";
+ CHECK_ERROR(text, DeclarationError, "Identifier already declared.");
}
BOOST_AUTO_TEST_CASE(calling_payable)
@@ -5479,14 +5477,15 @@ BOOST_AUTO_TEST_CASE(invalid_address_length_long)
BOOST_AUTO_TEST_CASE(address_test_for_bug_in_implementation)
{
- // A previous implementation claimed the string would be an address
char const* text = R"(
+ // A previous implementation claimed the string would be an address
contract AddrString {
address public test = "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c";
}
)";
CHECK_ERROR(text, TypeError, "is not implicitly convertible to expected type address");
text = R"(
+ // A previous implementation claimed the string would be an address
contract AddrString {
function f() public returns (address) {
return "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c";
@@ -5498,8 +5497,8 @@ BOOST_AUTO_TEST_CASE(address_test_for_bug_in_implementation)
BOOST_AUTO_TEST_CASE(early_exit_on_fatal_errors)
{
- // This tests a crash that occured because we did not stop for fatal errors.
char const* text = R"(
+ // This tests a crash that occured because we did not stop for fatal errors.
contract C {
struct S {
ftring a;
@@ -6046,9 +6045,10 @@ BOOST_AUTO_TEST_CASE(callable_crash)
BOOST_AUTO_TEST_CASE(error_transfer_non_payable_fallback)
{
- // This used to be a test for a.transfer to generate a warning
- // because A's fallback function is not payable.
char const* text = R"(
+ // This used to be a test for a.transfer to generate a warning
+ // because A's fallback function is not payable.
+
contract A {
function() public {}
}
@@ -6069,9 +6069,10 @@ BOOST_AUTO_TEST_CASE(error_transfer_non_payable_fallback)
BOOST_AUTO_TEST_CASE(error_transfer_no_fallback)
{
- // This used to be a test for a.transfer to generate a warning
- // because A does not have a payable fallback function.
- std::string text = R"(
+ char const* text = R"(
+ // This used to be a test for a.transfer to generate a warning
+ // because A does not have a payable fallback function.
+
contract A {}
contract B {
@@ -6090,9 +6091,10 @@ BOOST_AUTO_TEST_CASE(error_transfer_no_fallback)
BOOST_AUTO_TEST_CASE(error_send_non_payable_fallback)
{
- // This used to be a test for a.send to generate a warning
- // because A does not have a payable fallback function.
- std::string text = R"(
+ char const* text = R"(
+ // This used to be a test for a.send to generate a warning
+ // because A does not have a payable fallback function.
+
contract A {
function() public {}
}
@@ -6113,9 +6115,10 @@ BOOST_AUTO_TEST_CASE(error_send_non_payable_fallback)
BOOST_AUTO_TEST_CASE(does_not_error_transfer_payable_fallback)
{
- // This used to be a test for a.transfer to generate a warning
- // because A does not have a payable fallback function.
char const* text = R"(
+ // This used to be a test for a.transfer to generate a warning
+ // because A does not have a payable fallback function.
+
contract A {
function() payable public {}
}
@@ -6415,8 +6418,8 @@ BOOST_AUTO_TEST_CASE(using_this_in_constructor)
BOOST_AUTO_TEST_CASE(do_not_crash_on_not_lvalue)
{
- // This checks for a bug that caused a crash because of continued analysis.
char const* text = R"(
+ // This checks for a bug that caused a crash because of continued analysis.
contract C {
mapping (uint => uint) m;
function f() public {
@@ -6622,8 +6625,8 @@ BOOST_AUTO_TEST_CASE(library_function_without_implementation)
BOOST_AUTO_TEST_CASE(using_for_with_non_library)
{
- // This tests a crash that was resolved by making the first error fatal.
char const* text = R"(
+ // This tests a crash that was resolved by making the first error fatal.
library L {
struct S { uint d; }
using S for S;
@@ -6845,7 +6848,7 @@ BOOST_AUTO_TEST_CASE(array_length_invalid_expression)
BOOST_AUTO_TEST_CASE(warn_about_address_members_on_contract)
{
- std::string text = R"(
+ char const* text = R"(
contract C {
function f() view public {
this.balance;
@@ -6906,7 +6909,7 @@ BOOST_AUTO_TEST_CASE(warn_about_address_members_on_contract)
BOOST_AUTO_TEST_CASE(warn_about_address_members_on_non_this_contract)
{
- std::string text = R"(
+ char const* text = R"(
contract C {
function f() view public {
C c;
diff --git a/test/libsolidity/SolidityOptimizer.cpp b/test/libsolidity/SolidityOptimizer.cpp
index 184b7a8d..3a8585f7 100644
--- a/test/libsolidity/SolidityOptimizer.cpp
+++ b/test/libsolidity/SolidityOptimizer.cpp
@@ -139,7 +139,8 @@ BOOST_AUTO_TEST_CASE(smoke_test)
function f(uint a) returns (uint b) {
return a;
}
- })";
+ }
+ )";
compileBothVersions(sourceCode);
compareVersions("f(uint256)", u256(7));
}
@@ -151,7 +152,8 @@ BOOST_AUTO_TEST_CASE(identities)
function f(int a) returns (int b) {
return int(0) | (int(1) * (int(0) ^ (0 + a)));
}
- })";
+ }
+ )";
compileBothVersions(sourceCode);
compareVersions("f(int256)", u256(0x12334664));
}
@@ -165,7 +167,8 @@ BOOST_AUTO_TEST_CASE(unused_expressions)
10 + 20;
data;
}
- })";
+ }
+ )";
compileBothVersions(sourceCode);
compareVersions("f()");
}
@@ -180,7 +183,8 @@ BOOST_AUTO_TEST_CASE(constant_folding_both_sides)
function f(uint x) returns (uint y) {
return 98 ^ (7 * ((1 | (x | 1000)) * 40) ^ 102);
}
- })";
+ }
+ )";
compileBothVersions(sourceCode);
compareVersions("f(uint256)", 7);
}
diff --git a/test/libsolidity/SolidityParser.cpp b/test/libsolidity/SolidityParser.cpp
index 0c801cf6..0797b53b 100644
--- a/test/libsolidity/SolidityParser.cpp
+++ b/test/libsolidity/SolidityParser.cpp
@@ -112,52 +112,6 @@ while(0)
BOOST_AUTO_TEST_SUITE(SolidityParser)
-BOOST_AUTO_TEST_CASE(multiple_return_param_trailing_comma)
-{
- char const* text = R"(
- contract test {
- function() returns (uint a, uint b,) {}
- }
- )";
- CHECK_PARSE_ERROR(text, "Unexpected trailing comma in parameter list.");
-}
-
-BOOST_AUTO_TEST_CASE(multiple_modifier_arg_trailing_comma)
-{
- char const* text = R"(
- contract test {
- modifier modTest(uint a, uint b,) { _; }
- function(uint a) {}
- }
- )";
- CHECK_PARSE_ERROR(text, "Unexpected trailing comma in parameter list.");
-}
-
-BOOST_AUTO_TEST_CASE(multiple_event_arg_trailing_comma)
-{
- char const* text = R"(
- contract test {
- event Test(uint a, uint b,);
- function(uint a) {}
- }
- )";
- CHECK_PARSE_ERROR(text, "Unexpected trailing comma in parameter list.");
-}
-
-BOOST_AUTO_TEST_CASE(two_exact_functions)
-{
- char const* text = R"(
- contract test {
- function fun(uint a) returns(uint r) { return a; }
- function fun(uint a) returns(uint r) { return a; }
- }
- )";
- // with support of overloaded functions, during parsing,
- // we can't determine whether they match exactly, however
- // it will throw DeclarationError in following stage.
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_CASE(function_natspec_documentation)
{
char const* text = R"(
@@ -334,57 +288,6 @@ BOOST_AUTO_TEST_CASE(natspec_docstring_after_signature)
"Shouldn't get natspec docstring for this function");
}
-BOOST_AUTO_TEST_CASE(struct_definition)
-{
- char const* text = R"(
- contract test {
- uint256 stateVar;
- struct MyStructName {
- address addr;
- uint256 count;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(mapping)
-{
- char const* text = R"(
- contract test {
- mapping(address => bytes32) names;
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(mapping_in_struct)
-{
- char const* text = R"(
- contract test {
- struct test_struct {
- address addr;
- uint256 count;
- mapping(bytes32 => test_struct) self_reference;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(mapping_to_mapping_in_struct)
-{
- char const* text = R"(
- contract test {
- struct test_struct {
- address addr;
- mapping (uint64 => mapping (bytes32 => uint)) complex_mapping;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_CASE(variable_definition)
{
char const* text = R"(
@@ -440,112 +343,6 @@ BOOST_AUTO_TEST_CASE(complex_expression)
BOOST_CHECK(successParse(text));
}
-BOOST_AUTO_TEST_CASE(exp_expression)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) {
- uint256 x = 3 ** a;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(while_loop)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) {
- while (true) { uint256 x = 1; break; continue; } x = 9;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(for_loop_vardef_initexpr)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) {
- for (uint256 i = 0; i < 10; i++) {
- uint256 x = i; break; continue;
- }
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(for_loop_simple_initexpr)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) {
- uint256 i =0;
- for (i = 0; i < 10; i++) {
- uint256 x = i; break; continue;
- }
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(for_loop_simple_noexpr)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) {
- uint256 i =0;
- for (;;) {
- uint256 x = i; break; continue;
- }
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(for_loop_single_stmt_body)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) {
- uint256 i = 0;
- for (i = 0; i < 10; i++)
- continue;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(if_statement)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) {
- if (a >= 8) { return 2; } else { var b = 7; }
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(else_if_statement)
-{
- char const* text = R"(
- contract test {
- function fun(uint256 a) returns (address b) {
- if (a < 0) b = 0x67; else if (a == 0) b = 0x12; else b = 0x78;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_CASE(statement_starting_with_type_conversion)
{
char const* text = R"(
@@ -673,212 +470,22 @@ BOOST_AUTO_TEST_CASE(contract_multiple_inheritance_with_arguments)
BOOST_CHECK(successParse(text));
}
-BOOST_AUTO_TEST_CASE(placeholder_in_function_context)
-{
- char const* text = R"(
- contract c {
- function fun() returns (uint r) {
- var _ = 8;
- return _ + 1;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(modifier)
-{
- char const* text = R"(
- contract c {
- modifier mod { if (msg.sender == 0) _; }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(modifier_arguments)
-{
- char const* text = R"(
- contract c {
- modifier mod(address a) { if (msg.sender == a) _; }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(modifier_invocation)
-{
- char const* text = R"(
- contract c {
- modifier mod1(uint a) { if (msg.sender == a) _; }
- modifier mod2 { if (msg.sender == 2) _; }
- function f() mod1(7) mod2 { }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(fallback_function)
-{
- char const* text = R"(
- contract c {
- function() { }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(event)
-{
- char const* text = R"(
- contract c {
- event e();
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(event_arguments)
-{
- char const* text = R"(
- contract c {
- event e(uint a, bytes32 s);
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(event_arguments_indexed)
-{
- char const* text = R"(
- contract c {
- event e(uint a, bytes32 indexed s, bool indexed b);
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(visibility_specifiers)
-{
- char const* text = R"(
- contract c {
- uint private a;
- uint internal b;
- uint public c;
- uint d;
- function f() {}
- function f_priv() private {}
- function f_public() public {}
- function f_internal() internal {}
- })";
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_CASE(multiple_visibility_specifiers)
{
char const* text = R"(
contract c {
uint private internal a;
- })";
+ }
+ )";
CHECK_PARSE_ERROR(text, "Visibility already specified as \"private\".");
text = R"(
contract c {
function f() private external {}
- })";
+ }
+ )";
CHECK_PARSE_ERROR(text, "Visibility already specified as \"private\".");
}
-BOOST_AUTO_TEST_CASE(literal_constants_with_ether_subdenominations)
-{
- char const* text = R"(
- contract c {
- function c ()
- {
- a = 1 wei;
- b = 2 szabo;
- c = 3 finney;
- b = 4 ether;
- }
- uint256 a;
- uint256 b;
- uint256 c;
- uint256 d;
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(literal_constants_with_ether_subdenominations_in_expressions)
-{
- char const* text = R"(
- contract c {
- function c ()
- {
- a = 1 wei * 100 wei + 7 szabo - 3;
- }
- uint256 a;
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(enum_valid_declaration)
-{
- char const* text = R"(
- contract c {
- enum validEnum { Value1, Value2, Value3, Value4 }
- function c ()
- {
- a = foo.Value3;
- }
- uint256 a;
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(external_function)
-{
- char const* text = R"(
- contract c {
- function x() external {}
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(arrays_in_storage)
-{
- char const* text = R"(
- contract c {
- uint[10] a;
- uint[] a2;
- struct x { uint[2**20] b; y[0] c; }
- struct y { uint d; mapping(uint=>x)[] e; }
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(arrays_in_events)
-{
- char const* text = R"(
- contract c {
- event e(uint[10] a, bytes7[8] indexed b, c[3] x);
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(arrays_in_expressions)
-{
- char const* text = R"(
- contract c {
- function f() { c[10] a = 7; uint8[10 * 2] x; }
- })";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(multi_arrays)
-{
- char const* text = R"(
- contract c {
- mapping(uint => mapping(uint => int8)[8][][9])[] x;
- })";
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_CASE(keyword_is_reserved)
{
auto keywords = {
@@ -909,39 +516,6 @@ BOOST_AUTO_TEST_CASE(keyword_is_reserved)
}
}
-BOOST_AUTO_TEST_CASE(location_specifiers_for_params)
-{
- char const* text = R"(
- contract Foo {
- function f(uint[] storage constant x, uint[] memory y) { }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(location_specifiers_for_locals)
-{
- char const* text = R"(
- contract Foo {
- function f() {
- uint[] storage x;
- uint[] memory y;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(library_simple)
-{
- char const* text = R"(
- library Lib {
- function f() { }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_CASE(member_access_parser_ambiguity)
{
char const* text = R"(
@@ -986,97 +560,6 @@ BOOST_AUTO_TEST_CASE(complex_import)
BOOST_CHECK(successParse(text));
}
-BOOST_AUTO_TEST_CASE(from_is_not_keyword)
-{
- // "from" is not a keyword although it is used as a keyword in import directives.
- char const* text = R"(
- contract from {
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(inline_array_declaration)
-{
- char const* text = R"(
- contract c {
- uint[] a;
- function f() returns (uint, uint) {
- a = [1,2,3];
- return (a[3], [2,3,4][0]);
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(conditional_true_false_literal)
-{
- char const* text = R"(
- contract A {
- function f() {
- uint x = true ? 1 : 0;
- uint y = false ? 0 : 1;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(conditional_with_constants)
-{
- char const* text = R"(
- contract A {
- function f() {
- uint x = 3 > 0 ? 3 : 0;
- uint y = (3 > 0) ? 3 : 0;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(conditional_with_variables)
-{
- char const* text = R"(
- contract A {
- function f() {
- uint x = 3;
- uint y = 1;
- uint z = (x > y) ? x : y;
- uint w = x > y ? x : y;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(conditional_multiple)
-{
- char const* text = R"(
- contract A {
- function f() {
- uint x = 3 < 0 ? 2 > 1 ? 2 : 1 : 7 > 2 ? 7 : 6;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(conditional_with_assignment)
-{
- char const* text = R"(
- contract A {
- function f() {
- uint y = 1;
- uint x = 3 < 0 ? x = 3 : 6;
- true ? x = 3 : 4;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_CASE(recursion_depth1)
{
string text("contract C { bytes");
@@ -1113,117 +596,6 @@ BOOST_AUTO_TEST_CASE(recursion_depth4)
CHECK_PARSE_ERROR(text, "Maximum recursion depth reached during parsing");
}
-BOOST_AUTO_TEST_CASE(declaring_fixed_and_ufixed_variables)
-{
- char const* text = R"(
- contract A {
- fixed40x40 storeMe;
- function f(ufixed x, fixed32x32 y) {
- ufixed8x8 a;
- fixed b;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(declaring_fixed_literal_variables)
-{
- char const* text = R"(
- contract A {
- fixed40x40 pi = 3.14;
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(function_type_in_expression)
-{
- char const* text = R"(
- contract test {
- function f(uint x, uint y) returns (uint a) {}
- function g() {
- function (uint, uint) internal returns (uint) f1 = f;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(function_type_as_storage_variable)
-{
- char const* text = R"(
- contract test {
- function (uint, uint) internal returns (uint) f1;
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(function_type_as_storage_variable_with_assignment)
-{
- char const* text = R"(
- contract test {
- function f(uint x, uint y) returns (uint a) {}
- function (uint, uint) internal returns (uint) f1 = f;
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(function_type_in_struct)
-{
- char const* text = R"(
- contract test {
- struct S {
- function (uint x, uint y) internal returns (uint a) f;
- function (uint, uint) external returns (uint) g;
- uint d;
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(function_type_as_parameter)
-{
- char const* text = R"(
- contract test {
- function f(function(uint) external returns (uint) g) internal returns (uint a) {
- return g(1);
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(calling_function)
-{
- char const* text = R"(
- contract test {
- function f() {
- function() returns(function() returns(function() returns(function() returns(uint)))) x;
- uint y;
- y = x()()()();
- }
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
-BOOST_AUTO_TEST_CASE(mapping_and_array_of_functions)
-{
- char const* text = R"(
- contract test {
- mapping (address => function() internal returns (uint)) a;
- mapping (address => function() external) b;
- mapping (address => function() external[]) c;
- function() external[] d;
- }
- )";
- BOOST_CHECK(successParse(text));
-}
-
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/syntaxTests/parsing/arrays_in_events.sol b/test/libsolidity/syntaxTests/parsing/arrays_in_events.sol
new file mode 100644
index 00000000..edbc9665
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/arrays_in_events.sol
@@ -0,0 +1,3 @@
+contract c {
+ event e(uint[10] a, bytes7[8] indexed b, c[3] x);
+}
diff --git a/test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol b/test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol
new file mode 100644
index 00000000..626e865e
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol
@@ -0,0 +1,8 @@
+contract c {
+ function f() { c[10] a = 7; uint8[10 * 2] x; }
+}
+// ----
+// Warning: (32-39): Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning.
+// Warning: (45-60): Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning.
+// TypeError: (32-43): Type int_const 7 is not implicitly convertible to expected type contract c[10] storage pointer.
+// Warning: (45-60): Uninitialized storage pointer. Did you mean '<type> memory x'?
diff --git a/test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol b/test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol
new file mode 100644
index 00000000..9181222e
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/arrays_in_storage.sol
@@ -0,0 +1,6 @@
+contract c {
+ uint[10] a;
+ uint[] a2;
+ struct x { uint[2**20] b; y[0] c; }
+ struct y { uint d; mapping(uint=>x)[] e; }
+}
diff --git a/test/libsolidity/syntaxTests/parsing/calling_function.sol b/test/libsolidity/syntaxTests/parsing/calling_function.sol
new file mode 100644
index 00000000..4c4fc1fc
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/calling_function.sol
@@ -0,0 +1,9 @@
+contract test {
+ function f() {
+ function() returns(function() returns(function() returns(function() returns(uint)))) x;
+ uint y;
+ y = x()()()();
+ }
+}
+// ----
+// Warning: (20-175): No visibility specified. Defaulting to "public".
diff --git a/test/libsolidity/syntaxTests/parsing/conditional_multiple.sol b/test/libsolidity/syntaxTests/parsing/conditional_multiple.sol
new file mode 100644
index 00000000..c7d11ed6
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/conditional_multiple.sol
@@ -0,0 +1,9 @@
+contract A {
+ function f() {
+ uint x = 3 < 0 ? 2 > 1 ? 2 : 1 : 7 > 2 ? 7 : 6;
+ }
+}
+// ----
+// Warning: (17-93): No visibility specified. Defaulting to "public".
+// Warning: (40-46): Unused local variable.
+// Warning: (17-93): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol b/test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol
new file mode 100644
index 00000000..90974e96
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol
@@ -0,0 +1,11 @@
+contract A {
+ function f() {
+ uint x = true ? 1 : 0;
+ uint y = false ? 0 : 1;
+ }
+}
+// ----
+// Warning: (17-100): No visibility specified. Defaulting to "public".
+// Warning: (40-46): Unused local variable.
+// Warning: (71-77): Unused local variable.
+// Warning: (17-100): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/conditional_with_assignment.sol b/test/libsolidity/syntaxTests/parsing/conditional_with_assignment.sol
new file mode 100644
index 00000000..6f8040d6
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/conditional_with_assignment.sol
@@ -0,0 +1,11 @@
+contract A {
+ function f() {
+ uint y = 1;
+ uint x = 3 < 0 ? x = 3 : 6;
+ true ? x = 3 : 4;
+ }
+}
+// ----
+// Warning: (17-119): No visibility specified. Defaulting to "public".
+// Warning: (40-46): Unused local variable.
+// Warning: (17-119): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol b/test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol
new file mode 100644
index 00000000..35da69c6
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol
@@ -0,0 +1,11 @@
+contract A {
+ function f() {
+ uint x = 3 > 0 ? 3 : 0;
+ uint y = (3 > 0) ? 3 : 0;
+ }
+}
+// ----
+// Warning: (17-103): No visibility specified. Defaulting to "public".
+// Warning: (40-46): Unused local variable.
+// Warning: (72-78): Unused local variable.
+// Warning: (17-103): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol b/test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol
new file mode 100644
index 00000000..eb4c7091
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol
@@ -0,0 +1,13 @@
+contract A {
+ function f() {
+ uint x = 3;
+ uint y = 1;
+ uint z = (x > y) ? x : y;
+ uint w = x > y ? x : y;
+ }
+}
+// ----
+// Warning: (17-143): No visibility specified. Defaulting to "public".
+// Warning: (80-86): Unused local variable.
+// Warning: (114-120): Unused local variable.
+// Warning: (17-143): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol b/test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol
new file mode 100644
index 00000000..8be9667a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol
@@ -0,0 +1,14 @@
+contract A {
+ fixed40x40 storeMe;
+ function f(ufixed x, fixed32x32 y) {
+ ufixed8x8 a;
+ fixed b;
+ }
+}
+// ----
+// Warning: (41-121): No visibility specified. Defaulting to "public".
+// Warning: (52-60): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (62-74): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (86-97): Unused local variable.
+// Warning: (107-114): Unused local variable.
+// Warning: (41-121): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/declaring_fixed_literal_variables.sol b/test/libsolidity/syntaxTests/parsing/declaring_fixed_literal_variables.sol
new file mode 100644
index 00000000..b0d938a0
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/declaring_fixed_literal_variables.sol
@@ -0,0 +1,5 @@
+contract A {
+ fixed40x40 pi = 3.14;
+}
+// ----
+// TypeError: (33-37): Type rational_const 157 / 50 is not implicitly convertible to expected type fixed40x40. Try converting to type ufixed16x2 or use an explicit conversion.
diff --git a/test/libsolidity/syntaxTests/parsing/else_if_statement.sol b/test/libsolidity/syntaxTests/parsing/else_if_statement.sol
new file mode 100644
index 00000000..727e6115
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/else_if_statement.sol
@@ -0,0 +1,8 @@
+contract test {
+ function fun(uint256 a) returns (address b) {
+ if (a < 0) b = 0x67; else if (a == 0) b = 0x12; else b = 0x78;
+ }
+}
+// ----
+// Warning: (20-142): No visibility specified. Defaulting to "public".
+// Warning: (20-142): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol b/test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol
new file mode 100644
index 00000000..4c4a1217
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol
@@ -0,0 +1,10 @@
+contract c {
+ enum validEnum { Value1, Value2, Value3, Value4 }
+ function c() {
+ a = validEnum.Value3;
+ }
+ validEnum a;
+}
+// ----
+// Warning: (71-121): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
+// Warning: (71-121): No visibility specified. Defaulting to "public".
diff --git a/test/libsolidity/syntaxTests/parsing/event.sol b/test/libsolidity/syntaxTests/parsing/event.sol
new file mode 100644
index 00000000..2aaa873f
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/event.sol
@@ -0,0 +1,3 @@
+contract c {
+ event e();
+}
diff --git a/test/libsolidity/syntaxTests/parsing/event_arguments.sol b/test/libsolidity/syntaxTests/parsing/event_arguments.sol
new file mode 100644
index 00000000..3228853a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/event_arguments.sol
@@ -0,0 +1,3 @@
+contract c {
+ event e(uint a, bytes32 s);
+}
diff --git a/test/libsolidity/syntaxTests/parsing/event_arguments_indexed.sol b/test/libsolidity/syntaxTests/parsing/event_arguments_indexed.sol
new file mode 100644
index 00000000..d603fc08
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/event_arguments_indexed.sol
@@ -0,0 +1,3 @@
+contract c {
+ event e(uint a, bytes32 indexed s, bool indexed b);
+}
diff --git a/test/libsolidity/syntaxTests/parsing/exp_expression.sol b/test/libsolidity/syntaxTests/parsing/exp_expression.sol
new file mode 100644
index 00000000..cdabb996
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/exp_expression.sol
@@ -0,0 +1,9 @@
+contract test {
+ function fun(uint256 a) {
+ uint256 x = 3 ** a;
+ }
+}
+// ----
+// Warning: (20-79): No visibility specified. Defaulting to "public".
+// Warning: (54-63): Unused local variable.
+// Warning: (20-79): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/external_function.sol b/test/libsolidity/syntaxTests/parsing/external_function.sol
new file mode 100644
index 00000000..3aa3ceec
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/external_function.sol
@@ -0,0 +1,5 @@
+contract c {
+ function x() external {}
+}
+// ----
+// Warning: (17-41): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/fallback_function.sol b/test/libsolidity/syntaxTests/parsing/fallback_function.sol
new file mode 100644
index 00000000..de32b030
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/fallback_function.sol
@@ -0,0 +1,5 @@
+contract c {
+ function() { }
+}
+// ----
+// Warning: (17-31): No visibility specified. Defaulting to "public".
diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol b/test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol
new file mode 100644
index 00000000..bd86f2f5
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol
@@ -0,0 +1,13 @@
+contract test {
+ function fun(uint256 a) {
+ uint256 i =0;
+ for (i = 0; i < 10; i++) {
+ uint256 x = i; break; continue;
+ }
+ }
+}
+// ----
+// Warning: (20-162): No visibility specified. Defaulting to "public".
+// Warning: (33-42): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (115-124): Unused local variable.
+// Warning: (20-162): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol b/test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol
new file mode 100644
index 00000000..4a27e0fb
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol
@@ -0,0 +1,13 @@
+contract test {
+ function fun(uint256 a) {
+ uint256 i =0;
+ for (;;) {
+ uint256 x = i; break; continue;
+ }
+ }
+ }
+// ----
+// Warning: (24-170): No visibility specified. Defaulting to "public".
+// Warning: (37-46): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (115-124): Unused local variable.
+// Warning: (24-170): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol b/test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol
new file mode 100644
index 00000000..3df88ef5
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol
@@ -0,0 +1,11 @@
+contract test {
+ function fun(uint256 a) {
+ uint256 i = 0;
+ for (i = 0; i < 10; i++)
+ continue;
+ }
+}
+// ----
+// Warning: (20-129): No visibility specified. Defaulting to "public".
+// Warning: (33-42): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (20-129): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol b/test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol
new file mode 100644
index 00000000..a7c5e8bb
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol
@@ -0,0 +1,12 @@
+contract test {
+ function fun(uint256 a) {
+ for (uint256 i = 0; i < 10; i++) {
+ uint256 x = i; break; continue;
+ }
+ }
+}
+// ----
+// Warning: (20-148): No visibility specified. Defaulting to "public".
+// Warning: (33-42): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (101-110): Unused local variable.
+// Warning: (20-148): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/from_is_not_keyword.sol b/test/libsolidity/syntaxTests/parsing/from_is_not_keyword.sol
new file mode 100644
index 00000000..38175572
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/from_is_not_keyword.sol
@@ -0,0 +1,3 @@
+// "from" is not a keyword although it is used as a keyword in import directives.
+contract from {
+}
diff --git a/test/libsolidity/syntaxTests/parsing/function_normal_comments.sol b/test/libsolidity/syntaxTests/parsing/function_normal_comments.sol
new file mode 100644
index 00000000..c7a023ac
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/function_normal_comments.sol
@@ -0,0 +1,10 @@
+contract test {
+ uint256 stateVar;
+ // We won't see this comment
+ function functionName(bytes32 input) returns (bytes32 out) {}
+}
+// ----
+// Warning: (75-136): No visibility specified. Defaulting to "public".
+// Warning: (97-110): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (121-132): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (75-136): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/function_type_as_parameter.sol b/test/libsolidity/syntaxTests/parsing/function_type_as_parameter.sol
new file mode 100644
index 00000000..4075d74a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/function_type_as_parameter.sol
@@ -0,0 +1,5 @@
+contract test {
+ function f(function(uint) external returns (uint) g) internal returns (uint a) {
+ return g(1);
+ }
+}
diff --git a/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable.sol b/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable.sol
new file mode 100644
index 00000000..e3d41f48
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable.sol
@@ -0,0 +1,3 @@
+contract test {
+ function (uint, uint) internal returns (uint) f1;
+}
diff --git a/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol b/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol
new file mode 100644
index 00000000..3b784733
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol
@@ -0,0 +1,10 @@
+contract test {
+ function f(uint x, uint y) returns (uint a) {}
+ function (uint, uint) internal returns (uint) f1 = f;
+}
+// ----
+// Warning: (20-66): No visibility specified. Defaulting to "public".
+// Warning: (31-37): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (39-45): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (56-62): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (20-66): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol b/test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol
new file mode 100644
index 00000000..fd6447c7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol
@@ -0,0 +1,15 @@
+contract test {
+ function f(uint x, uint y) returns (uint a) {}
+ function g() {
+ function (uint, uint) internal returns (uint) f1 = f;
+ }
+}
+// ----
+// Warning: (20-66): No visibility specified. Defaulting to "public".
+// Warning: (31-37): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (39-45): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (56-62): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (71-153): No visibility specified. Defaulting to "public".
+// Warning: (94-142): Unused local variable.
+// Warning: (20-66): Function state mutability can be restricted to pure
+// Warning: (71-153): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/function_type_in_struct.sol b/test/libsolidity/syntaxTests/parsing/function_type_in_struct.sol
new file mode 100644
index 00000000..d3c84678
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/function_type_in_struct.sol
@@ -0,0 +1,11 @@
+contract test {
+ struct S {
+ function (uint x, uint y) internal returns (uint a) f;
+ function (uint, uint) external returns (uint) g;
+ uint d;
+ }
+}
+// ----
+// Warning: (49-55): Naming function type parameters is deprecated.
+// Warning: (57-63): Naming function type parameters is deprecated.
+// Warning: (83-89): Naming function type return parameters is deprecated.
diff --git a/test/libsolidity/syntaxTests/parsing/if_statement.sol b/test/libsolidity/syntaxTests/parsing/if_statement.sol
new file mode 100644
index 00000000..0819cb9f
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/if_statement.sol
@@ -0,0 +1,11 @@
+contract test {
+ function fun(uint256 a) returns (uint) {
+ if (a >= 8) { return 2; } else { var b = 7; }
+ }
+}
+// ----
+// Warning: (102-107): Use of the "var" keyword is deprecated.
+// Warning: (102-111): The type of this variable was inferred as uint8, which can hold values between 0 and 255. This is probably not desired. Use an explicit type to silence this warning.
+// Warning: (20-120): No visibility specified. Defaulting to "public".
+// Warning: (102-107): Unused local variable.
+// Warning: (20-120): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol b/test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol
new file mode 100644
index 00000000..f42f8f16
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol
@@ -0,0 +1,9 @@
+contract c {
+ uint[] a;
+ function f() returns (uint, uint) {
+ a = [1,2,3];
+ return (a[3], [2,3,4][0]);
+ }
+}
+// ----
+// Warning: (31-128): No visibility specified. Defaulting to "public".
diff --git a/test/libsolidity/syntaxTests/parsing/library_simple.sol b/test/libsolidity/syntaxTests/parsing/library_simple.sol
new file mode 100644
index 00000000..fcf2638e
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/library_simple.sol
@@ -0,0 +1,6 @@
+library Lib {
+ function f() { }
+}
+// ----
+// Warning: (18-34): No visibility specified. Defaulting to "public".
+// Warning: (18-34): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol
new file mode 100644
index 00000000..452b52c7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol
@@ -0,0 +1,16 @@
+contract c {
+ function f()
+ {
+ a = 1 wei;
+ b = 2 szabo;
+ c = 3 finney;
+ b = 4 ether;
+ }
+ uint256 a;
+ uint256 b;
+ uint256 c;
+ uint256 d;
+}
+// ----
+// Warning: (163-172): This declaration shadows an existing declaration.
+// Warning: (17-128): No visibility specified. Defaulting to "public".
diff --git a/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol
new file mode 100644
index 00000000..d2cdc875
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol
@@ -0,0 +1,10 @@
+contract c {
+ function c ()
+ {
+ a = 1 wei * 100 wei + 7 szabo - 3;
+ }
+ uint256 a;
+}
+// ----
+// Warning: (17-86): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
+// Warning: (17-86): No visibility specified. Defaulting to "public".
diff --git a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol
new file mode 100644
index 00000000..5d6c8dc5
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol
@@ -0,0 +1,12 @@
+contract Foo {
+ function f() {
+ uint[] storage x;
+ uint[] memory y;
+ }
+}
+// ----
+// Warning: (42-58): Uninitialized storage pointer.
+// Warning: (19-90): No visibility specified. Defaulting to "public".
+// Warning: (42-58): Unused local variable.
+// Warning: (68-83): Unused local variable.
+// Warning: (19-90): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol
new file mode 100644
index 00000000..e021182a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol
@@ -0,0 +1,5 @@
+contract Foo {
+ function f(uint[] storage constant x, uint[] memory y) internal { }
+}
+// ----
+// TypeError: (30-55): Storage location has to be "memory" (or unspecified) for constants.
diff --git a/test/libsolidity/syntaxTests/parsing/mapping.sol b/test/libsolidity/syntaxTests/parsing/mapping.sol
new file mode 100644
index 00000000..d6bf3f14
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/mapping.sol
@@ -0,0 +1,3 @@
+contract test {
+ mapping(address => bytes32) names;
+}
diff --git a/test/libsolidity/syntaxTests/parsing/mapping_and_array_of_functions.sol b/test/libsolidity/syntaxTests/parsing/mapping_and_array_of_functions.sol
new file mode 100644
index 00000000..b7cf34e4
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/mapping_and_array_of_functions.sol
@@ -0,0 +1,6 @@
+contract test {
+ mapping (address => function() internal returns (uint)) a;
+ mapping (address => function() external) b;
+ mapping (address => function() external[]) c;
+ function() external[] d;
+}
diff --git a/test/libsolidity/syntaxTests/parsing/mapping_in_struct.sol b/test/libsolidity/syntaxTests/parsing/mapping_in_struct.sol
new file mode 100644
index 00000000..980d5750
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/mapping_in_struct.sol
@@ -0,0 +1,7 @@
+contract test {
+ struct test_struct {
+ address addr;
+ uint256 count;
+ mapping(bytes32 => test_struct) self_reference;
+ }
+}
diff --git a/test/libsolidity/syntaxTests/parsing/mapping_to_mapping_in_struct.sol b/test/libsolidity/syntaxTests/parsing/mapping_to_mapping_in_struct.sol
new file mode 100644
index 00000000..c06220b7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/mapping_to_mapping_in_struct.sol
@@ -0,0 +1,6 @@
+contract test {
+ struct test_struct {
+ address addr;
+ mapping (uint64 => mapping (bytes32 => uint)) complex_mapping;
+ }
+}
diff --git a/test/libsolidity/syntaxTests/parsing/modifier.sol b/test/libsolidity/syntaxTests/parsing/modifier.sol
new file mode 100644
index 00000000..3e659dcf
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/modifier.sol
@@ -0,0 +1,3 @@
+contract c {
+ modifier mod { if (msg.sender == 0) _; }
+}
diff --git a/test/libsolidity/syntaxTests/parsing/modifier_arguments.sol b/test/libsolidity/syntaxTests/parsing/modifier_arguments.sol
new file mode 100644
index 00000000..27b5b13b
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/modifier_arguments.sol
@@ -0,0 +1,3 @@
+contract c {
+ modifier mod(address a) { if (msg.sender == a) _; }
+}
diff --git a/test/libsolidity/syntaxTests/parsing/modifier_invocation.sol b/test/libsolidity/syntaxTests/parsing/modifier_invocation.sol
new file mode 100644
index 00000000..cb2f2985
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/modifier_invocation.sol
@@ -0,0 +1,8 @@
+contract c {
+ modifier mod1(uint a) { if (msg.sender == address(a)) _; }
+ modifier mod2 { if (msg.sender == address(2)) _; }
+ function f() mod1(7) mod2 { }
+}
+// ----
+// Warning: (135-164): No visibility specified. Defaulting to "public".
+// Warning: (135-164): Function state mutability can be restricted to view
diff --git a/test/libsolidity/syntaxTests/parsing/multi_arrays.sol b/test/libsolidity/syntaxTests/parsing/multi_arrays.sol
new file mode 100644
index 00000000..ef20ecee
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/multi_arrays.sol
@@ -0,0 +1,3 @@
+contract c {
+ mapping(uint => mapping(uint => int8)[8][][9])[] x;
+}
diff --git a/test/libsolidity/syntaxTests/parsing/multiple_event_arg_trailing_comma.sol b/test/libsolidity/syntaxTests/parsing/multiple_event_arg_trailing_comma.sol
new file mode 100644
index 00000000..bfbe7e5c
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/multiple_event_arg_trailing_comma.sol
@@ -0,0 +1,6 @@
+contract test {
+ event Test(uint a, uint b,);
+ function(uint a) {}
+}
+// ----
+// ParserError: (45-46): Unexpected trailing comma in parameter list.
diff --git a/test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol b/test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol
new file mode 100644
index 00000000..95a4d1e7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol
@@ -0,0 +1,28 @@
+contract test {
+ uint256 stateVar;
+ /// This is test function 1
+ function functionName1(bytes32 input) returns (bytes32 out) {}
+ /// This is test function 2
+ function functionName2(bytes32 input) returns (bytes32 out) {}
+ // nothing to see here
+ function functionName3(bytes32 input) returns (bytes32 out) {}
+ /// This is test function 4
+ function functionName4(bytes32 input) returns (bytes32 out) {}
+}
+// ----
+// Warning: (74-136): No visibility specified. Defaulting to "public".
+// Warning: (97-110): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (121-132): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (173-235): No visibility specified. Defaulting to "public".
+// Warning: (196-209): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (220-231): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (267-329): No visibility specified. Defaulting to "public".
+// Warning: (290-303): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (314-325): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (366-428): No visibility specified. Defaulting to "public".
+// Warning: (389-402): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (413-424): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (74-136): Function state mutability can be restricted to pure
+// Warning: (173-235): Function state mutability can be restricted to pure
+// Warning: (267-329): Function state mutability can be restricted to pure
+// Warning: (366-428): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/multiple_modifier_arg_trailing_comma.sol b/test/libsolidity/syntaxTests/parsing/multiple_modifier_arg_trailing_comma.sol
new file mode 100644
index 00000000..eb206fb7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/multiple_modifier_arg_trailing_comma.sol
@@ -0,0 +1,6 @@
+contract test {
+ modifier modTest(uint a, uint b,) { _; }
+ function(uint a) {}
+}
+// ----
+// ParserError: (51-52): Unexpected trailing comma in parameter list.
diff --git a/test/libsolidity/syntaxTests/parsing/multiple_return_param_trailing_comma.sol b/test/libsolidity/syntaxTests/parsing/multiple_return_param_trailing_comma.sol
new file mode 100644
index 00000000..2dd8f196
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/multiple_return_param_trailing_comma.sol
@@ -0,0 +1,5 @@
+contract test {
+ function() returns (uint a, uint b,) {}
+}
+// ----
+// ParserError: (54-55): Unexpected trailing comma in parameter list.
diff --git a/test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol b/test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol
new file mode 100644
index 00000000..72546dc0
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol
@@ -0,0 +1,11 @@
+contract c {
+ function fun() returns (uint r) {
+ var _ = 8;
+ return _ + 1;
+ }
+}
+// ----
+// Warning: (59-64): Use of the "var" keyword is deprecated.
+// Warning: (59-68): The type of this variable was inferred as uint8, which can hold values between 0 and 255. This is probably not desired. Use an explicit type to silence this warning.
+// Warning: (17-97): No visibility specified. Defaulting to "public".
+// Warning: (17-97): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/struct_definition.sol b/test/libsolidity/syntaxTests/parsing/struct_definition.sol
new file mode 100644
index 00000000..0c859e5d
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/struct_definition.sol
@@ -0,0 +1,7 @@
+contract test {
+ uint256 stateVar;
+ struct MyStructName {
+ address addr;
+ uint256 count;
+ }
+}
diff --git a/test/libsolidity/syntaxTests/parsing/two_exact_functions.sol b/test/libsolidity/syntaxTests/parsing/two_exact_functions.sol
new file mode 100644
index 00000000..0b3dda56
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/two_exact_functions.sol
@@ -0,0 +1,9 @@
+// with support of overloaded functions, during parsing,
+// we can't determine whether they match exactly, however
+// it will throw DeclarationError in following stage.
+contract test {
+ function fun(uint a) returns(uint r) { return a; }
+ function fun(uint a) returns(uint r) { return a; }
+}
+// ----
+// DeclarationError: (189-239): Function with same name and arguments defined twice.
diff --git a/test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol b/test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol
new file mode 100644
index 00000000..4706a26d
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol
@@ -0,0 +1,17 @@
+contract c {
+ uint private a;
+ uint internal b;
+ uint public c;
+ uint d;
+ function f() {}
+ function f_priv() private {}
+ function f_public() public {}
+ function f_internal() internal {}
+}
+// ----
+// Warning: (58-71): This declaration shadows an existing declaration.
+// Warning: (89-104): No visibility specified. Defaulting to "public".
+// Warning: (89-104): Function state mutability can be restricted to pure
+// Warning: (109-137): Function state mutability can be restricted to pure
+// Warning: (142-171): Function state mutability can be restricted to pure
+// Warning: (176-209): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/while_loop.sol b/test/libsolidity/syntaxTests/parsing/while_loop.sol
new file mode 100644
index 00000000..129b52e1
--- /dev/null
+++ b/test/libsolidity/syntaxTests/parsing/while_loop.sol
@@ -0,0 +1,9 @@
+contract test {
+ function fun(uint256 a) {
+ while (true) { uint256 x = 1; break; continue; } x = 9;
+ }
+}
+// ----
+// Warning: (20-115): No visibility specified. Defaulting to "public".
+// Warning: (33-42): Unused function parameter. Remove or comment out the variable name to silence this warning.
+// Warning: (20-115): Function state mutability can be restricted to pure
diff --git a/test/tools/isoltest.cpp b/test/tools/isoltest.cpp
index 7a147bd0..100fcbf0 100644
--- a/test/tools/isoltest.cpp
+++ b/test/tools/isoltest.cpp
@@ -99,8 +99,8 @@ void SyntaxTestTool::printContract() const
for (auto const& error: m_test->errorList())
if (error.locationStart >= 0 && error.locationEnd >= 0)
{
- assert(static_cast<size_t>(error.locationStart) < source.length());
- assert(static_cast<size_t>(error.locationEnd) < source.length());
+ assert(static_cast<size_t>(error.locationStart) <= source.length());
+ assert(static_cast<size_t>(error.locationEnd) <= source.length());
bool isWarning = error.type == "Warning";
for (int i = error.locationStart; i < error.locationEnd; i++)
if (isWarning)