aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--Changelog.md9
-rw-r--r--cmake/EthCompilerSettings.cmake11
-rw-r--r--cmake/jsoncpp.cmake4
-rw-r--r--docs/abi-spec.rst8
-rw-r--r--docs/assembly.rst28
-rw-r--r--docs/contracts.rst8
-rw-r--r--docs/contributing.rst1
-rw-r--r--docs/control-structures.rst5
-rw-r--r--docs/frequently-asked-questions.rst47
-rw-r--r--docs/miscellaneous.rst4
-rw-r--r--docs/solidity-by-example.rst487
-rw-r--r--docs/style-guide.rst84
-rw-r--r--libsolc/CMakeLists.txt2
-rw-r--r--libsolc/libsolc.cpp15
-rw-r--r--libsolc/libsolc.h4
-rw-r--r--libsolidity/analysis/StaticAnalyzer.cpp36
-rw-r--r--libsolidity/analysis/SyntaxChecker.cpp10
-rw-r--r--libsolidity/analysis/TypeChecker.cpp80
-rw-r--r--libsolidity/analysis/ViewPureChecker.cpp38
-rw-r--r--libsolidity/analysis/ViewPureChecker.h1
-rw-r--r--libsolidity/ast/AST.h16
-rw-r--r--libsolidity/ast/Types.cpp20
-rw-r--r--libsolidity/codegen/CompilerUtils.cpp2
-rw-r--r--libsolidity/inlineasm/AsmParser.cpp2
-rw-r--r--scripts/bytecodecompare/storebytecode.bat1
-rwxr-xr-xscripts/isolate_tests.py39
-rwxr-xr-xscripts/tests.sh45
-rw-r--r--test/compilationTests/corion/ico.sol8
-rw-r--r--test/compilationTests/corion/moduleHandler.sol8
-rw-r--r--test/compilationTests/corion/multiOwner.sol2
-rw-r--r--test/compilationTests/corion/premium.sol16
-rw-r--r--test/compilationTests/corion/provider.sol2
-rw-r--r--test/compilationTests/corion/publisher.sol4
-rw-r--r--test/compilationTests/corion/schelling.sol18
-rw-r--r--test/compilationTests/corion/token.sol16
-rw-r--r--test/compilationTests/corion/tokenDB.sol4
-rw-r--r--test/compilationTests/gnosis/Migrations.sol6
-rw-r--r--test/compilationTests/milestonetracker/MilestoneTracker.sol30
-rw-r--r--test/compilationTests/zeppelin/Bounty.sol6
-rw-r--r--test/compilationTests/zeppelin/DayLimit.sol2
-rw-r--r--test/compilationTests/zeppelin/LimitBalance.sol2
-rw-r--r--test/compilationTests/zeppelin/MultisigWallet.sol32
-rw-r--r--test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol2
-rw-r--r--test/compilationTests/zeppelin/crowdsale/Crowdsale.sol12
-rw-r--r--test/compilationTests/zeppelin/crowdsale/FinalizableCrowdsale.sol2
-rw-r--r--test/compilationTests/zeppelin/crowdsale/RefundVault.sol10
-rw-r--r--test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol4
-rw-r--r--test/compilationTests/zeppelin/lifecycle/Destructible.sol6
-rw-r--r--test/compilationTests/zeppelin/lifecycle/Migrations.sol4
-rw-r--r--test/compilationTests/zeppelin/lifecycle/Pausable.sol4
-rw-r--r--test/compilationTests/zeppelin/lifecycle/TokenDestructible.sol4
-rw-r--r--test/compilationTests/zeppelin/ownership/Claimable.sol4
-rw-r--r--test/compilationTests/zeppelin/ownership/Contactable.sol2
-rw-r--r--test/compilationTests/zeppelin/ownership/DelayedClaimable.sol4
-rw-r--r--test/compilationTests/zeppelin/ownership/HasNoEther.sol2
-rw-r--r--test/compilationTests/zeppelin/ownership/Multisig.sol2
-rw-r--r--test/compilationTests/zeppelin/ownership/Ownable.sol4
-rw-r--r--test/compilationTests/zeppelin/ownership/Shareable.sol6
-rw-r--r--test/compilationTests/zeppelin/payment/PullPayment.sol2
-rw-r--r--test/compilationTests/zeppelin/token/BasicToken.sol4
-rw-r--r--test/compilationTests/zeppelin/token/ERC20.sol6
-rw-r--r--test/compilationTests/zeppelin/token/ERC20Basic.sol4
-rw-r--r--test/compilationTests/zeppelin/token/LimitedTransferToken.sol4
-rw-r--r--test/compilationTests/zeppelin/token/MintableToken.sol4
-rw-r--r--test/compilationTests/zeppelin/token/PausableToken.sol4
-rw-r--r--test/compilationTests/zeppelin/token/SimpleToken.sol2
-rw-r--r--test/compilationTests/zeppelin/token/StandardToken.sol6
-rw-r--r--test/compilationTests/zeppelin/token/TokenTimelock.sol4
-rw-r--r--test/compilationTests/zeppelin/token/VestedToken.sol6
-rw-r--r--test/libjulia/Parser.cpp2
-rw-r--r--test/libsolidity/ABIDecoderTests.cpp18
-rw-r--r--test/libsolidity/ASTJSON.cpp4
-rw-r--r--test/libsolidity/ASTLegacyJSON.cpp10
-rw-r--r--test/libsolidity/Assembly.cpp16
-rw-r--r--test/libsolidity/InlineAssembly.cpp2
-rw-r--r--test/libsolidity/LibSolc.cpp (renamed from test/libsolidity/JSONCompiler.cpp)24
-rw-r--r--test/libsolidity/SolidityABIJSON.cpp34
-rw-r--r--test/libsolidity/SolidityCompiler.cpp2
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp1609
-rw-r--r--test/libsolidity/SolidityExpressionCompiler.cpp29
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp6
-rw-r--r--test/libsolidity/SolidityNatspecJSON.cpp58
-rw-r--r--test/libsolidity/SolidityOptimizer.cpp40
-rw-r--r--test/libsolidity/SolidityParser.cpp16
-rw-r--r--test/libsolidity/StandardCompiler.cpp8
-rw-r--r--test/libsolidity/ViewPureChecker.cpp11
-rw-r--r--test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol4
-rw-r--r--test/libsolidity/syntaxTests/array/length/cannot_be_function.sol4
-rw-r--r--test/libsolidity/syntaxTests/array/length/cannot_be_function_call.sol4
-rw-r--r--test/libsolidity/syntaxTests/array/length/complex_cyclic_constant.sol2
-rw-r--r--test/libsolidity/syntaxTests/array/length/cyclic_constant.sol2
-rw-r--r--test/libsolidity/syntaxTests/array/uninitialized_storage_var.sol9
-rw-r--r--test/libsolidity/syntaxTests/constants/assign_constant_function_value.sol2
-rw-r--r--test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol8
-rw-r--r--test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol12
-rw-r--r--test/libsolidity/syntaxTests/constructor/constructor_without_implementation_new.sol4
-rw-r--r--test/libsolidity/syntaxTests/constructor/constructor_without_implementation_old.sol6
-rw-r--r--test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol8
-rw-r--r--test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol10
-rw-r--r--test/libsolidity/syntaxTests/constructor/library_constructor_new.sol6
-rw-r--r--test/libsolidity/syntaxTests/constructor/library_constructor_old.sol8
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol10
-rw-r--r--test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination.sol2
-rw-r--r--test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination_050.sol6
-rw-r--r--test/libsolidity/syntaxTests/emit_non_event.sol6
-rw-r--r--test/libsolidity/syntaxTests/functionCalls/named_arguments_for_functions_that_take_arbitrary_parameters.sol7
-rw-r--r--test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol6
-rw-r--r--test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol17
-rw-r--r--test/libsolidity/syntaxTests/inheritance/override/add_view.sol4
-rw-r--r--test/libsolidity/syntaxTests/inheritance/override/remove_view.sol4
-rw-r--r--test/libsolidity/syntaxTests/memberLookup/failed_function_lookup.sol8
-rw-r--r--test/libsolidity/syntaxTests/memberLookup/failed_function_lookup_in_library.sol8
-rw-r--r--test/libsolidity/syntaxTests/more_than_256_declarationerrors.sol514
-rw-r--r--test/libsolidity/syntaxTests/more_than_256_syntaxerrors.sol514
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/029_create_abstract_contract.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/030_redeclare_implemented_abstract_function_as_abstract.sol6
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/039_functions_with_identical_structs_in_interface.sol6
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/138_similar_name_suggestions_expected.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/165_assigning_state_to_const_variable.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/206_storage_location_local_variables.sol10
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/212_uninitialized_mapping_array_variable_050.sol9
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/233_non_initialized_references.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/234_non_initialized_references_050.sol11
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/244_tuples.sol8
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/308_rational_unary_plus_operation.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/310_rational_unary_plus_operation_v050.sol10
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/311_rational_unary_plus_assignment_v050.sol9
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/363_non_payable_constructor.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/412_early_exit_on_fatal_errors.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/484_function_types_selector_1.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/485_function_types_selector_2.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/486_function_types_selector_3.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/498_msg_gas_deprecated.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/499_msg_gas_deprecated_v050.sol6
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/569_block_blockhash_deprecated.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/570_block_blockhash_deprecated_v050.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol10
-rw-r--r--test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol10
-rw-r--r--test/libsolidity/syntaxTests/parsing/tuples.sol14
-rw-r--r--test/libsolidity/syntaxTests/parsing/two_exact_functions.sol6
-rw-r--r--test/libsolidity/syntaxTests/parsing/unary_plus_expression.sol (renamed from test/libsolidity/syntaxTests/nameAndTypeResolution/309_rational_unary_plus_assignment.sol)2
-rw-r--r--test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_internal_functions.sol4
-rw-r--r--test/libsolidity/syntaxTests/tupleAssignments/err_fill_assignment.sol11
-rw-r--r--test/libsolidity/syntaxTests/tupleAssignments/err_multiple_storage_storage_copies_fill_left.sol (renamed from test/libsolidity/syntaxTests/tupleAssignments/warn_multiple_storage_storage_copies_fill_left.sol)2
-rw-r--r--test/libsolidity/syntaxTests/tupleAssignments/err_multiple_storage_storage_copies_fill_right.sol (renamed from test/libsolidity/syntaxTests/tupleAssignments/warn_multiple_storage_storage_copies_fill_right.sol)2
-rw-r--r--test/libsolidity/syntaxTests/tupleAssignments/error_fill.sol4
-rw-r--r--test/libsolidity/syntaxTests/tupleAssignments/nowarn_explicit_singleton_token_expression.sol8
-rw-r--r--test/libsolidity/syntaxTests/tupleAssignments/warn_fill_assignment.sol11
-rw-r--r--test/libsolidity/syntaxTests/types/empty_tuple_function.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/empty_tuple_function_050.sol11
-rw-r--r--test/libsolidity/syntaxTests/types/empty_tuple_lvalue.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/empty_tuple_lvalue_050.sol11
-rw-r--r--test/libsolidity/syntaxTests/types/no_singleton_tuple.sol8
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_no_restrict_warning.sol (renamed from test/libsolidity/syntaxTests/viewPureChecker/assembly_jump.sol)0
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol8
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol21
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol23
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol9
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol12
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/creation_no_restrict_warning.sol (renamed from test/libsolidity/syntaxTests/viewPureChecker/creation.sol)0
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol6
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol18
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol15
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol12
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol16
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/overriding_no_restrict_warning.sol (renamed from test/libsolidity/syntaxTests/viewPureChecker/overriding.sol)0
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol8
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol13
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/returning_structs_no_restrict_warning.sol (renamed from test/libsolidity/syntaxTests/viewPureChecker/returning_structs.sol)0
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/selector.sol4
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail.sol2
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail_v050.sol7
177 files changed, 2614 insertions, 2175 deletions
diff --git a/.gitignore b/.gitignore
index 14c227d0..87a3e593 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,6 +35,7 @@ build/
docs/_build
docs/utils/__pycache__
docs/utils/*.pyc
+/deps/downloads/
# vim stuff
*.swp
@@ -43,3 +44,5 @@ docs/utils/*.pyc
.idea
browse.VC.db
CMakeLists.txt.user
+/CMakeSettings.json
+/.vs
diff --git a/Changelog.md b/Changelog.md
index 9b79af4f..bdbf85fb 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -26,16 +26,23 @@ Breaking Changes:
``sizeof``, ``supports``, ``typedef`` and ``unchecked``.
* General: Remove assembly instruction aliases ``sha3`` and ``suicide``
* General: C99-style scoping rules are enforced now. This was already the case in the experimental 0.5.0 mode.
+ * General: Disallow combining hex numbers with unit denominations (e.g. ``0x1e wei``). This was already the case in the experimental 0.5.0 mode.
* Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence.
* Parser: Disallow trailing dots that are not followed by a number.
* Parser: Remove ``constant`` as function state mutability modifer.
+ * Type Checker: Disallow assignments between tuples with different numbers of components. This was already the case in the experimental 0.5.0 mode.
+ * Type Checker: Disallow values for constants that are not compile-time constants. This was already the case in the experimental 0.5.0 mode.
* Type Checker: Disallow arithmetic operations for boolean variables.
* Type Checker: Disallow conversions between ``bytesX`` and ``uintY`` of different size.
+ * Type Checker: Disallow empty tuple components. This was partly already the case in the experimental 0.5.0 mode.
* Type Checker: Disallow specifying base constructor arguments multiple times in the same inheritance hierarchy. This was already the case in the experimental 0.5.0 mode.
+ * Type Checker: Disallow uninitialized storage variables. This was already the case in the experimental 0.5.0 mode.
* Type Checker: Only accept a single ``bytes`` type for ``.call()`` (and family), ``keccak256()``, ``sha256()`` and ``ripemd160()``.
* Type Checker: Fallback function must be external. This was already the case in the experimental 0.5.0 mode.
* Remove obsolete ``std`` directory from the Solidity repository. This means accessing ``https://github.com/ethereum/soldity/blob/develop/std/*.sol`` (or ``https://github.com/ethereum/solidity/std/*.sol`` in Remix) will not be possible.
* Syntax Checker: Named return values in function types are an error.
+ * Syntax Checker: Disallow unary ``+``. This was already the case in the experimental 0.5.0 mode.
+ * View Pure Checker: Strictly enfore state mutability. This was already the case in the experimental 0.5.0 mode.
Language Features:
* General: Allow appending ``calldata`` keyword to types, to explicitly specify data location for arguments of external functions.
@@ -43,11 +50,13 @@ Language Features:
* General: Scoping rules now follow the C99-style.
Compiler Features:
+ * C API (``libsolc``): Export the ``solidity_license``, ``solidity_version`` and ``solidity_compile`` methods.
* Type Checker: Show named argument in case of error.
* Tests: Determine transaction status during IPC calls.
Bugfixes:
* Tests: Fix chain parameters to make ipc tests work with newer versions of cpp-ethereum.
+ * Code Generator: Fix allocation of byte arrays (zeroed out too much memory).
### 0.4.24 (2018-05-16)
diff --git a/cmake/EthCompilerSettings.cmake b/cmake/EthCompilerSettings.cmake
index 683d1d2e..3ae5bf2a 100644
--- a/cmake/EthCompilerSettings.cmake
+++ b/cmake/EthCompilerSettings.cmake
@@ -132,17 +132,6 @@ elseif (DEFINED MSVC)
add_compile_options(-D_WIN32_WINNT=0x0600) # declare Windows Vista API requirement
add_compile_options(-DNOMINMAX) # undefine windows.h MAX && MIN macros cause it cause conflicts with std::min && std::max functions
- # Always use Release variant of C++ runtime.
- # We don't want to provide Debug variants of all dependencies. Some default
- # flags set by CMake must be tweaked.
- string(REPLACE "/MDd" "/MD" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
- string(REPLACE "/D_DEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
- string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
- string(REPLACE "/MDd" "/MD" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
- string(REPLACE "/D_DEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
- string(REPLACE "/RTC1" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
- set_property(GLOBAL PROPERTY DEBUG_CONFIGURATIONS OFF)
-
# disable empty object file warning
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /ignore:4221")
# warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/SAFESEH' specification
diff --git a/cmake/jsoncpp.cmake b/cmake/jsoncpp.cmake
index 0c110b53..e886c609 100644
--- a/cmake/jsoncpp.cmake
+++ b/cmake/jsoncpp.cmake
@@ -35,9 +35,7 @@ ExternalProject_Add(jsoncpp-project
-DJSONCPP_WITH_TESTS=OFF
-DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF
-DCMAKE_CXX_FLAGS=${JSONCPP_EXTRA_FLAGS}
- # Overwrite build and install commands to force Release build on MSVC.
- BUILD_COMMAND cmake --build <BINARY_DIR> --config Release
- INSTALL_COMMAND cmake --build <BINARY_DIR> --config Release --target install
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
${byproducts}
)
diff --git a/docs/abi-spec.rst b/docs/abi-spec.rst
index 366ca951..07596ec2 100644
--- a/docs/abi-spec.rst
+++ b/docs/abi-spec.rst
@@ -2,14 +2,14 @@
.. _ABI:
-******************************************
-Application Binary Interface Specification
-******************************************
+**************************
+Contract ABI Specification
+**************************
Basic Design
============
-The Application Binary Interface is the standard way to interact with contracts in the Ethereum ecosystem, both
+The Contract Application Binary Interface (ABI) is the standard way to interact with contracts in the Ethereum ecosystem, both
from outside the blockchain and for contract-to-contract interaction. Data is encoded according to its type,
as described in this specification. The encoding is not self describing and thus requires a schema in order to decode.
diff --git a/docs/assembly.rst b/docs/assembly.rst
index edc826ac..3bab289e 100644
--- a/docs/assembly.rst
+++ b/docs/assembly.rst
@@ -232,9 +232,9 @@ In the grammar, opcodes are represented as pre-defined identifiers.
+-------------------------+-----+---+-----------------------------------------------------------------+
| swap1 ... swap16 | `*` | F | swap topmost and ith stack slot below it |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| mload(p) | | F | mem[p..(p+32)) |
+| mload(p) | | F | mem[p...(p+32)) |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| mstore(p, v) | `-` | F | mem[p..(p+32)) := v |
+| mstore(p, v) | `-` | F | mem[p...(p+32)) := v |
+-------------------------+-----+---+-----------------------------------------------------------------+
| mstore8(p, v) | `-` | F | mem[p] := v & 0xff (only modifies a single byte) |
+-------------------------+-----+---+-----------------------------------------------------------------+
@@ -272,16 +272,16 @@ In the grammar, opcodes are represented as pre-defined identifiers.
+-------------------------+-----+---+-----------------------------------------------------------------+
| returndatacopy(t, f, s) | `-` | B | copy s bytes from returndata at position f to mem at position t |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| create(v, p, s) | | F | create new contract with code mem[p..(p+s)) and send v wei |
+| create(v, p, s) | | F | create new contract with code mem[p...(p+s)) and send v wei |
| | | | and return the new address |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| create2(v, n, p, s) | | C | create new contract with code mem[p..(p+s)) at address |
-| | | | keccak256(<address> . n . keccak256(mem[p..(p+s))) and send v |
+| create2(v, n, p, s) | | C | create new contract with code mem[p...(p+s)) at address |
+| | | | keccak256(<address> . n . keccak256(mem[p...(p+s))) and send v |
| | | | wei and return the new address |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| call(g, a, v, in, | | F | call contract at address a with input mem[in..(in+insize)) |
+| call(g, a, v, in, | | F | call contract at address a with input mem[in...(in+insize)) |
| insize, out, outsize) | | | providing g gas and v wei and output area |
-| | | | mem[out..(out+outsize)) returning 0 on error (eg. out of gas) |
+| | | | mem[out...(out+outsize)) returning 0 on error (eg. out of gas) |
| | | | and 1 on success |
+-------------------------+-----+---+-----------------------------------------------------------------+
| callcode(g, a, v, in, | | F | identical to ``call`` but only use the code from a and stay |
@@ -293,23 +293,23 @@ In the grammar, opcodes are represented as pre-defined identifiers.
| staticcall(g, a, in, | | B | identical to ``call(g, a, 0, in, insize, out, outsize)`` but do |
| insize, out, outsize) | | | not allow state modifications |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| return(p, s) | `-` | F | end execution, return data mem[p..(p+s)) |
+| return(p, s) | `-` | F | end execution, return data mem[p...(p+s)) |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| revert(p, s) | `-` | B | end execution, revert state changes, return data mem[p..(p+s)) |
+| revert(p, s) | `-` | B | end execution, revert state changes, return data mem[p...(p+s)) |
+-------------------------+-----+---+-----------------------------------------------------------------+
| selfdestruct(a) | `-` | F | end execution, destroy current contract and send funds to a |
+-------------------------+-----+---+-----------------------------------------------------------------+
| invalid | `-` | F | end execution with invalid instruction |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| log0(p, s) | `-` | F | log without topics and data mem[p..(p+s)) |
+| log0(p, s) | `-` | F | log without topics and data mem[p...(p+s)) |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| log1(p, s, t1) | `-` | F | log with topic t1 and data mem[p..(p+s)) |
+| log1(p, s, t1) | `-` | F | log with topic t1 and data mem[p...(p+s)) |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| log2(p, s, t1, t2) | `-` | F | log with topics t1, t2 and data mem[p..(p+s)) |
+| log2(p, s, t1, t2) | `-` | F | log with topics t1, t2 and data mem[p...(p+s)) |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| log3(p, s, t1, t2, t3) | `-` | F | log with topics t1, t2, t3 and data mem[p..(p+s)) |
+| log3(p, s, t1, t2, t3) | `-` | F | log with topics t1, t2, t3 and data mem[p...(p+s)) |
+-------------------------+-----+---+-----------------------------------------------------------------+
-| log4(p, s, t1, t2, t3, | `-` | F | log with topics t1, t2, t3, t4 and data mem[p..(p+s)) |
+| log4(p, s, t1, t2, t3, | `-` | F | log with topics t1, t2, t3, t4 and data mem[p...(p+s)) |
| t4) | | | |
+-------------------------+-----+---+-----------------------------------------------------------------+
| origin | | F | transaction sender |
diff --git a/docs/contracts.rst b/docs/contracts.rst
index 41240a9c..53e50656 100644
--- a/docs/contracts.rst
+++ b/docs/contracts.rst
@@ -485,9 +485,6 @@ The following statements are considered modifying the state:
prevent modifications to the state on the level of the EVM by adding
``pragma experimental "v0.5.0";``
-.. warning::
- The compiler does not enforce yet that a ``view`` method is not modifying state. It raises a warning though.
-
.. index:: ! pure function, function;pure
.. _pure-functions:
@@ -529,12 +526,15 @@ In addition to the list of state modifying statements explained above, the follo
It is a non-circumventable runtime checks done by the EVM.
.. warning::
- Before version 0.4.17 the compiler didn't enforce that ``pure`` is not reading the state.
+ Before version 0.4.17 the compiler did not enforce that ``pure`` is not reading the state.
It is a compile-time type check, which can be circumvented doing invalid explicit conversions
between contract types, because the compiler can verify that the type of the contract does
not do state-changing operations, but it cannot check that the contract that will be called
at runtime is actually of that type.
+.. warning::
+ Before version 0.5.0 the compiler did not enforce that ``view`` is not writing the state.
+
.. index:: ! fallback function, function;fallback
.. _fallback-function:
diff --git a/docs/contributing.rst b/docs/contributing.rst
index 481aab1e..231cbdfc 100644
--- a/docs/contributing.rst
+++ b/docs/contributing.rst
@@ -209,6 +209,7 @@ At this stage you should be able to see a message similar to the following:
If the instrumentation messages did not appear, try switching the cmake flags pointing to AFL's clang binaries:
::
+
# if previously failed
make clean
cmake .. -DCMAKE_C_COMPILER=path/to/afl-clang -DCMAKE_CXX_COMPILER=path/to/afl-clang++
diff --git a/docs/control-structures.rst b/docs/control-structures.rst
index 8ced0fbc..7beca65e 100644
--- a/docs/control-structures.rst
+++ b/docs/control-structures.rst
@@ -293,11 +293,6 @@ These can then either be assigned to newly declared variables or to pre-existing
(x, y) = (y, x);
// Components can be left out (also for variable declarations).
(data.length,,) = f(); // Sets the length to 7
- // Components can only be left out at the left-hand-side of assignments, with
- // one exception:
- (x,) = (1,);
- // (1,) is the only way to specify a 1-component tuple, because (1) is
- // equivalent to 1.
}
}
diff --git a/docs/frequently-asked-questions.rst b/docs/frequently-asked-questions.rst
index 0d6fa033..75693bdd 100644
--- a/docs/frequently-asked-questions.rst
+++ b/docs/frequently-asked-questions.rst
@@ -306,48 +306,11 @@ independent copy of the state variable is created in memory and
is another issue). The modifications to this independent copy do not
carry back to ``data1`` or ``data2``.
-A common mistake is to declare a local variable and assume that it will
-be created in memory, although it will be created in storage::
-
- /// THIS CONTRACT CONTAINS AN ERROR
-
- pragma solidity ^0.4.0;
-
- contract C {
- uint someVariable;
- uint[] data;
-
- function f() public {
- uint[] x;
- x.push(2);
- data = x;
- }
- }
-
-The type of the local variable ``x`` is ``uint[] storage``, but since
-storage is not dynamically allocated, it has to be assigned from
-a state variable before it can be used. So no space in storage will be
-allocated for ``x``, but instead it functions only as an alias for
-a pre-existing variable in storage.
-
-What will happen is that the compiler interprets ``x`` as a storage
-pointer and will make it point to the storage slot ``0`` by default.
-This has the effect that ``someVariable`` (which resides at storage
-slot ``0``) is modified by ``x.push(2)``.
-
-The correct way to do this is the following::
-
- pragma solidity ^0.4.0;
-
- contract C {
- uint someVariable;
- uint[] data;
-
- function f() public {
- uint[] x = data;
- x.push(2);
- }
- }
+.. warning::
+ Prior to version 0.5.0, a common mistake was to declare a local variable and assume that it will
+ be created in memory, although it will be created in storage. Using such a variable without initializing
+ it could lead to unexpected behavior. Starting from 0.5.0, however, storage variables have to be initialized,
+ which should prevent these kinds of mistakes.
******************
Advanced Questions
diff --git a/docs/miscellaneous.rst b/docs/miscellaneous.rst
index c19c8c59..1d5add9a 100644
--- a/docs/miscellaneous.rst
+++ b/docs/miscellaneous.rst
@@ -397,8 +397,8 @@ Function Visibility Specifiers
Modifiers
=========
-- ``pure`` for functions: Disallows modification or access of state - this is not enforced yet.
-- ``view`` for functions: Disallows modification of state - this is not enforced yet.
+- ``pure`` for functions: Disallows modification or access of state.
+- ``view`` for functions: Disallows modification of state.
- ``payable`` for functions: Allows them to receive Ether together with a call.
- ``constant`` for state variables: Disallows assignment (except initialisation), does not occupy storage slot.
- ``anonymous`` for events: Does not store event signature as topic.
diff --git a/docs/solidity-by-example.rst b/docs/solidity-by-example.rst
index fcdd1862..07cb76c9 100644
--- a/docs/solidity-by-example.rst
+++ b/docs/solidity-by-example.rst
@@ -645,4 +645,489 @@ Safe Remote Purchase
Micropayment Channel
********************
-To be written.
+In this section we will learn how to build a simple implementation
+of a payment channel. It use cryptographics signatures to make
+repeated transfers of Ether between the same parties secure, instantaneous, and
+without transaction fees. To do it we need to understand how to
+sign and verify signatures, and setup the payment channel.
+
+Creating and verifying signatures
+=================================
+
+Imagine Alice wants to send a quantity of Ether to Bob, i.e.
+Alice is the sender and the Bob is the recipient.
+Alice only needs to send cryptographically signed messages off-chain
+(e.g. via email) to Bob and it will be very similar to writing checks.
+
+Signatures are used to authorize transactions,
+and they are a general tool that is available to
+smart contracts. Alice will build a simple
+smart contract that lets her transmit Ether, but
+in a unusual way, instead of calling a function herself
+to initiate a payment, she will let Bob
+do that, and therefore pay the transaction fee.
+The contract will work as follows:
+
+ 1. Alice deploys the ``ReceiverPays`` contract, attaching enough Ether to cover the payments that will be made.
+ 2. Alice authorizes a payment by signing a message with their private key.
+ 3. Alice sends the cryptographically signed message to Bob. The message does not need to be kept secret
+ (you will understand it later), and the mechanism for sending it does not matter.
+ 4. Bob claims their payment by presenting the signed message to the smart contract, it verifies the
+ authenticity of the message and then releases the funds.
+
+Creating the signature
+----------------------
+
+Alice does not need to interact with Ethereum network to
+sign the transaction, the proccess is completely offline.
+In this tutorial, we will sign messages in the browser
+using ``web3.js`` and ``MetaMask``.
+In particular, we will use the standard way described in `EIP-762 <https://github.com/ethereum/EIPs/pull/712>`_,
+as it provides a number of other security benefits.
+
+::
+
+ /// Hashing first makes a few things easier
+ var hash = web3.sha3("message to sign");
+ web3.personal.sign(hash, web3.eth.defaultAccount, function () {...});
+
+
+Note that the ``web3.personal.sign`` prepends the length of the message to the signed data.
+Since we hash first, the message will always be exactly 32 bytes long,
+and thus this length prefix is always the same, making everything easier.
+
+What to Sign
+------------
+
+For a contract that fulfills payments, the signed message must include:
+
+ 1. The recipient's address
+ 2. The amount to be transferred
+ 3. Protection against replay attacks
+
+A replay attack is when a signed message is reused to claim authorization for
+a second action.
+To avoid replay attacks we will use the same as in Ethereum transactions
+themselves, a so-called nonce, which is the number of transactions sent by an
+account.
+The smart contract will check if a nonce is used multiple times.
+
+There is another type of replay attacks, it occurs when the
+owner deploys a ``ReceiverPays`` smart contract, performs some payments,
+and then destroy the contract. Later, she decides to deploy the
+``RecipientPays`` smart contract again, but the new contract does not
+know the nonces used in the previous deployment, so the attacker
+can use the old messages again.
+
+Alice can protect against it including
+the contract's address in the message, and only
+messages containing contract's address itself will be accepted.
+This functionality can be found in the first two lines of the ``claimPayment()`` function in the full contract
+at the end of this chapter.
+
+Packing arguments
+-----------------
+
+Now that we have identified what information to include in the
+signed message, we are ready to put the message together, hash it,
+and sign it. For simplicity, we just concatenate the data.
+The
+`ethereumjs-abi <https://github.com/ethereumjs/ethereumjs-abi>`_ library provides
+a function called ``soliditySHA3`` that mimics the behavior
+of Solidity's ``keccak256`` function applied to arguments encoded
+using ``abi.encodePacked``.
+Putting it all together, here is a JavaScript function that
+creates the proper signature for the ``ReceiverPays`` example:
+
+::
+
+ // recipient is the address that should be paid.
+ // amount, in wei, specifies how much ether should be sent.
+ // nonce can be any unique number to prevent replay attacks
+ // contractAddress is used to prevent cross-contract replay attacks
+ function signPayment(recipient, amount, nonce, contractAddress, callback) {
+ var hash = "0x" + ethereumjs.ABI.soliditySHA3(
+ ["address", "uint256", "uint256", "address"],
+ [recipient, amount, nonce, contractAddress]
+ ).toString("hex");
+
+ web3.personal.sign(hash, web3.eth.defaultAccount, callback);
+ }
+
+Recovering the Message Signer in Solidity
+-----------------------------------------
+
+In general, ECDSA signatures consist of two parameters, ``r`` and ``s``.
+Signatures in Ethereum include a third parameter called ``v``, that can be used
+to recover which account's private key was used to sign in the message,
+the transaction's sender. Solidity provides a built-in function
+`ecrecover <mathematical-and-cryptographic-functions>`_
+that accepts a message along with the ``r``, ``s`` and ``v`` parameters and
+returns the address that was used to sign the message.
+
+Extracting the Signature Parameters
+-----------------------------------
+
+Signatures produced by web3.js are the concatenation of ``r``, ``s`` and ``v``,
+so the first step is splitting those parameters back out. It can be done on the client,
+but doing it inside the smart contract means only one signature parameter
+needs to be sent rather than three.
+Splitting apart a byte array into component parts is a little messy.
+We will use `inline assembly <assembly>`_ to do the job
+in the ``splitSignature`` function (the third function in the full contract
+at the end of this chapter).
+
+Computing the Message Hash
+--------------------------
+
+The smart contract needs to know exactly what parameters were signed,
+and so it must recreate the message from the parameters and use that
+for signature verification. The functions ``prefixed`` and
+``recoverSigner`` do this and their use can be found in the
+``claimPayment`` function.
+
+
+The full contract
+-----------------
+
+::
+
+ pragma solidity ^0.4.24;
+
+ contract ReceiverPays {
+ address owner = msg.sender;
+
+ mapping(uint256 => bool) usedNonces;
+
+ constructor() public payable {}
+
+ function claimPayment(uint256 amount, uint256 nonce, bytes signature) public {
+ require(!usedNonces[nonce]);
+ usedNonces[nonce] = true;
+
+ // this recreates the message that was signed on the client
+ bytes32 message = prefixed(keccak256(abi.encodePacked(msg.sender, amount, nonce, this)));
+
+ require(recoverSigner(message, signature) == owner);
+
+ msg.sender.transfer(amount);
+ }
+
+ /// destroy the contract and reclaim the leftover funds.
+ function kill() public {
+ require(msg.sender == owner);
+ selfdestruct(msg.sender);
+ }
+
+ /// signature methods.
+ function splitSignature(bytes sig)
+ internal
+ pure
+ returns (uint8 v, bytes32 r, bytes32 s)
+ {
+ require(sig.length == 65);
+
+ assembly {
+ // first 32 bytes, after the length prefix.
+ r := mload(add(sig, 32))
+ // second 32 bytes.
+ s := mload(add(sig, 64))
+ // final byte (first byte of the next 32 bytes).
+ v := byte(0, mload(add(sig, 96)))
+ }
+
+ return (v, r, s);
+ }
+
+ function recoverSigner(bytes32 message, bytes sig)
+ internal
+ pure
+ returns (address)
+ {
+ (uint8 v, bytes32 r, bytes32 s) = splitSignature(sig);
+
+ return ecrecover(message, v, r, s);
+ }
+
+ /// builds a prefixed hash to mimic the behavior of eth_sign.
+ function prefixed(bytes32 hash) internal pure returns (bytes32) {
+ return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
+ }
+ }
+
+
+Writing a Simple Payment Channel
+================================
+
+Alice will now build a simple but complete implementation of a payment channel.
+Payment channels use cryptographic signatures to make repeated transfers
+of Ether securely, instantaneously, and without transaction fees.
+
+What is a Payment Channel?
+--------------------------
+
+Payment channels allow participants to make repeated transfers of Ether without
+using transactions. This means that the delays and fees associated with transactions
+can be avoided. We are going to explore a simple unidirectional payment channel between
+two parties (Alice and Bob). Using it involves three steps:
+
+ 1. Alice funds a smart contract with Ether. This "opens" the payment channel.
+ 2. Alice signs messages that specify how much of that Ether is owed to the recipient. This step is repeated for each payment.
+ 3. Bob "closes" the payment channel, withdrawing their portion of the Ether and sending the remainder back to the sender.
+
+Not ethat only steps 1 and 3 require Ethereum transactions, step 2 means that
+the sender transmits a cryptographically signed message to the recipient via off chain ways (e.g. email).
+This means only two transactions are required to support any number of transfers.
+
+Bob is guaranteed to receive their funds because the smart contract escrows
+the Ether and honors a valid signed message. The smart contract also enforces a timeout,
+so Alice is guaranteed to eventually recover their funds even if the recipient refuses
+to close the channel.
+It is up to the participants in a payment channel to decide how long to keep it open.
+For a short-lived transaction, such as paying an internet cafe for each minute of network access,
+or for a longer relationship, such as paying an employee an hourly wage, a payment could last for months or years.
+
+Opening the Payment Channel
+---------------------------
+
+To open the payment channel, Alice deploys the smart contract,
+attaching the Ether to be escrowed and specifying the intendend recipient
+and a maximum duration for the channel to exist. It is the function
+``SimplePaymentChannel`` in the contract, that is at the end of this chapter.
+
+Making Payments
+---------------
+
+Alice makes payments by sending signed messages to Bob.
+This step is performed entirely outside of the Ethereum network.
+Messages are cryptographically signed by the sender and then transmitted directly to the recipient.
+
+Each message includes the following information:
+
+ * The smart contract's address, used to prevent cross-contract replay attacks.
+ * The total amount of Ether that is owed the recipient so far.
+
+A payment channel is closed just once, at the of a series of transfers.
+Because of this, only one of the messages sent will be redeemed. This is why
+each message specifies a cumulative total amount of Ether owed, rather than the
+amount of the individual micropayment. The recipient will naturally choose to
+redeem the most recent message because that is the one with the highest total.
+The nonce per-message is not needed anymore, because the smart contract will
+only honor a single message. The address of the smart contract is still used
+to prevent a message intended for one payment channel from being used for a different channel.
+
+Here is the modified javascript code to cryptographically sign a message from the previous chapter:
+
+::
+
+ function constructPaymentMessage(contractAddress, amount) {
+ return ethereumjs.ABI.soliditySHA3(
+ ["address", "uint256"],
+ [contractAddress, amount]
+ );
+ }
+
+ function signMessage(message, callback) {
+ web3.personal.sign(
+ "0x" + message.toString("hex"),
+ web3.eth.defaultAccount,
+ callback
+ );
+ }
+
+ // contractAddress is used to prevent cross-contract replay attacks.
+ // amount, in wei, specifies how much Ether should be sent.
+
+ function signPayment(contractAddress, amount, callback) {
+ var message = constructPaymentMessage(contractAddress, amount);
+ signMessage(message, callback);
+ }
+
+
+Closing the Payment Channel
+---------------------------
+
+When Bob is ready to receive their funds, it is time to
+close the payment channel by calling a ``close`` function on the smart contract.
+Closing the channel pays the recipient the Ether they are owed and destroys the contract,
+sending any remaining Ether back to Alice.
+To close the channel, Bob needs to provide a message signed by Alice.
+
+The smart contract must verify that the message contains a valid signature from the sender.
+The process for doing this verification is the same as the process the recipient uses.
+The Solidity functions ``isValidSignature`` and ``recoverSigner`` work just like their
+JavaScript counterparts in the previous section. The latter is borrowed from the
+``ReceiverPays`` contract in the previous chapter.
+
+The ``close`` function can only be called by the payment channel recipient,
+who will naturally pass the most recent payment message because that message
+carries the highest total owed. If the sender were allowed to call this function,
+they could provide a message with a lower amount and cheat the recipient out of what they are owed.
+
+The function verifies the signed message matches the given parameters.
+If everything checks out, the recipient is sent their portion of the Ether,
+and the sender is sent the rest via a ``selfdestruct``.
+You can see the ``close`` function in the full contract.
+
+Channel Expiration
+-------------------
+
+Bob can close the payment channel at any time, but if they fail to do so,
+Alice needs a way to recover their escrowed funds. An *expiration* time was set
+at the time of contract deployment. Once that time is reached, Alice can call
+``claimTimeout`` to recover their funds. You can see the ``claimTimeout`` function in the
+full contract.
+
+After this function is called, Bob can no longer receive any Ether,
+so it is important that Bob closes the channel before the expiration is reached.
+
+
+The full contract
+-----------------
+
+::
+
+ pragma solidity ^0.4.24;
+
+ contract SimplePaymentChannel {
+ address public sender; // The account sending payments.
+ address public recipient; // The account receiving the payments.
+ uint256 public expiration; // Timeout in case the recipient never closes.
+
+ constructor (address _recipient, uint256 duration)
+ public
+ payable
+ {
+ sender = msg.sender;
+ recipient = _recipient;
+ expiration = now + duration;
+ }
+
+ function isValidSignature(uint256 amount, bytes signature)
+ internal
+ view
+ returns (bool)
+ {
+ bytes32 message = prefixed(keccak256(abi.encodePacked(this, amount)));
+
+ // check that the signature is from the payment sender
+ return recoverSigner(message, signature) == sender;
+ }
+
+ /// the recipient can close the channel at any time by presenting a
+ /// signed amount from the sender. the recipient will be sent that amount,
+ /// and the remainder will go back to the sender
+ function close(uint256 amount, bytes signature) public {
+ require(msg.sender == recipient);
+ require(isValidSignature(amount, signature));
+
+ recipient.transfer(amount);
+ selfdestruct(sender);
+ }
+
+ /// the sender can extend the expiration at any time
+ function extend(uint256 newExpiration) public {
+ require(msg.sender == sender);
+ require(newExpiration > expiration);
+
+ expiration = newExpiration;
+ }
+
+ /// if the timeout is reached without the recipient closing the channel,
+ /// then the Ether is realeased back to the sender.
+ function clainTimeout() public {
+ require(now >= expiration);
+ selfdestruct(sender);
+ }
+
+ /// All functions below this are just taken from the chapter
+ /// 'creating and verifying signatures' chapter.
+
+ function splitSignature(bytes sig)
+ internal
+ pure
+ returns (uint8 v, bytes32 r, bytes32 s)
+ {
+ require(sig.length == 65);
+
+ assembly {
+ // first 32 bytes, after the length prefix
+ r := mload(add(sig, 32))
+ // second 32 bytes
+ s := mload(add(sig, 64))
+ // final byte (first byte of the next 32 bytes)
+ v := byte(0, mload(add(sig, 96)))
+ }
+
+ return (v, r, s);
+ }
+
+ function recoverSigner(bytes32 message, bytes sig)
+ internal
+ pure
+ returns (address)
+ {
+ (uint8 v, bytes32 r, bytes32 s) = splitSignature(sig);
+
+ return ecrecover(message, v, r, s);
+ }
+
+ /// builds a prefixed hash to mimic the behavior of eth_sign.
+ function prefixed(bytes32 hash) internal pure returns (bytes32) {
+ return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
+ }
+ }
+
+
+Note: The function ``splitSignature`` is very simple and does not use all security checks.
+A real implementation should use a more rigorously tested library, such as
+openzepplin's `version <https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ECRecovery.sol>`_ of this code.
+
+
+
+Verifying Payments
+------------------
+
+Unlike in our previous chapter, messages in a payment channel aren't
+redeemed right away. The recipient keeps track of the latest message and
+redeems it when it's time to close the payment channel. This means it's
+critical that the recipient perform their own verification of each message.
+Otherwise there is no guarantee that the recipient will be able to get paid
+in the end.
+
+The recipient should verify each message using the following process:
+
+ 1. Verify that the contact address in the message matches the payment channel.
+ 2. Verify that the new total is the expected amount.
+ 3. Verify that the new total does not exceed the amount of Ether escrowed.
+ 4. Verify that the signature is valid and comes from the payment channel sender.
+
+We'll use the `ethereumjs-util <https://github.com/ethereumjs/ethereumjs-util>`_
+library to write this verifications. The final step can be done a number of ways,
+but if it's being done in **JavaScript**.
+The following code borrows the `constructMessage` function from the signing **JavaScript code**
+above:
+
+::
+
+ // this mimics the prefixing behavior of the eth_sign JSON-RPC method.
+ function prefixed(hash) {
+ return ethereumjs.ABI.soliditySHA3(
+ ["string", "bytes32"],
+ ["\x19Ethereum Signed Message:\n32", hash]
+ );
+ }
+
+ function recoverSigner(message, signature) {
+ var split = ethereumjs.Util.fromRpcSig(signature);
+ var publicKey = ethereumjs.Util.ecrecover(message, split.v, split.r, split.s);
+ var signer = ethereumjs.Util.pubToAddress(publicKey).toString("hex");
+ return signer;
+ }
+
+ function isValidSignature(contractAddress, amount, signature, expectedSigner) {
+ var message = prefixed(constructPaymentMessage(contractAddress, amount));
+ var signer = recoverSigner(message, signature);
+ return signer.toLowerCase() ==
+ ethereumjs.Util.stripHexPrefix(expectedSigner).toLowerCase();
+ }
diff --git a/docs/style-guide.rst b/docs/style-guide.rst
index 792110e1..8311e925 100644
--- a/docs/style-guide.rst
+++ b/docs/style-guide.rst
@@ -114,15 +114,15 @@ No::
.. _maximum_line_length:
-Maximum Line Length
+Maximum Line Length
===================
-Keeping lines under the `PEP 8 recommendation <https://www.python.org/dev/peps/pep-0008/#maximum-line-length>`_ to a maximum of 79 (or 99)
+Keeping lines under the `PEP 8 recommendation <https://www.python.org/dev/peps/pep-0008/#maximum-line-length>`_ to a maximum of 79 (or 99)
characters helps readers easily parse the code.
Wrapped lines should conform to the following guidelines.
-1. The first argument should not be attached to the opening parenthesis.
+1. The first argument should not be attached to the opening parenthesis.
2. One, and only one, indent should be used.
3. Each argument should fall on its own line.
4. The terminating element, :code:`);`, should be placed on the final line by itself.
@@ -132,38 +132,38 @@ Function Calls
Yes::
thisFunctionCallIsReallyLong(
- longArgument1,
- longArgument2,
+ longArgument1,
+ longArgument2,
longArgument3
);
No::
- thisFunctionCallIsReallyLong(longArgument1,
- longArgument2,
+ thisFunctionCallIsReallyLong(longArgument1,
+ longArgument2,
longArgument3
);
-
- thisFunctionCallIsReallyLong(longArgument1,
- longArgument2,
+
+ thisFunctionCallIsReallyLong(longArgument1,
+ longArgument2,
longArgument3
- );
-
+ );
+
thisFunctionCallIsReallyLong(
longArgument1, longArgument2,
longArgument3
- );
+ );
thisFunctionCallIsReallyLong(
- longArgument1,
- longArgument2,
+ longArgument1,
+ longArgument2,
longArgument3
);
thisFunctionCallIsReallyLong(
- longArgument1,
- longArgument2,
- longArgument3);
+ longArgument1,
+ longArgument2,
+ longArgument3);
Assignment Statements
@@ -215,7 +215,7 @@ No::
recipient,
publicKey,
amount,
- options);
+ options);
Source File Encoding
====================
@@ -274,7 +274,7 @@ Within a grouping, place the ``view`` and ``pure`` functions last.
Yes::
contract A {
- function A() public {
+ constructor() public {
...
}
@@ -318,7 +318,7 @@ No::
// Public functions
// ...
- function A() public {
+ constructor() public {
...
}
@@ -529,7 +529,7 @@ No::
function increment(uint x) public pure returns (uint) {
return x + 1;}
-You should explicitly label the visibility of all functions, including constructors.
+You should explicitly label the visibility of all functions, including constructors.
Yes::
@@ -540,7 +540,7 @@ Yes::
No::
function implicitlyPublic(uint val) {
- doSomething();
+ doSomething();
}
The visibility modifier for a function should come before any custom
@@ -663,19 +663,19 @@ Yes::
address a,
address b,
address c
- )
- public
+ )
+ public
returns (
- address someAddressName,
- uint256 LongArgument,
+ address someAddressName,
+ uint256 LongArgument,
uint256 Argument
)
- {
+ {
doSomething()
-
+
return (
- veryLongReturnArg1,
- veryLongReturnArg2,
+ veryLongReturnArg1,
+ veryLongReturnArg2,
veryLongReturnArg3
);
}
@@ -686,16 +686,16 @@ No::
address a,
address b,
address c
- )
- public
- returns (address someAddressName,
- uint256 LongArgument,
+ )
+ public
+ returns (address someAddressName,
+ uint256 LongArgument,
uint256 Argument)
- {
+ {
doSomething()
-
- return (veryLongReturnArg1,
- veryLongReturnArg1,
+
+ return (veryLongReturnArg1,
+ veryLongReturnArg1,
veryLongReturnArg1);
}
@@ -706,7 +706,7 @@ manner as modifiers if the function declaration is long or hard to read.
Yes::
contract A is B, C, D {
- function A(uint param1, uint param2, uint param3, uint param4, uint param5)
+ constructor(uint param1, uint param2, uint param3, uint param4, uint param5)
B(param1)
C(param2, param3)
D(param4)
@@ -719,7 +719,7 @@ Yes::
No::
contract A is B, C, D {
- function A(uint param1, uint param2, uint param3, uint param4, uint param5)
+ constructor(uint param1, uint param2, uint param3, uint param4, uint param5)
B(param1)
C(param2, param3)
D(param4)
@@ -730,7 +730,7 @@ No::
}
contract A is B, C, D {
- function A(uint param1, uint param2, uint param3, uint param4, uint param5)
+ constructor(uint param1, uint param2, uint param3, uint param4, uint param5)
B(param1)
C(param2, param3)
D(param4)
diff --git a/libsolc/CMakeLists.txt b/libsolc/CMakeLists.txt
index e67583dd..63fc1a83 100644
--- a/libsolc/CMakeLists.txt
+++ b/libsolc/CMakeLists.txt
@@ -1,5 +1,5 @@
if (EMSCRIPTEN)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXPORTED_FUNCTIONS='[\"_compileJSON\",\"_license\",\"_version\",\"_compileJSONMulti\",\"_compileJSONCallback\",\"_compileStandard\"]' -s RESERVED_FUNCTION_POINTERS=20")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXPORTED_FUNCTIONS='[\"_solidity_license\",\"_solidity_version\",\"_solidity_compile\",\"_license\",\"_version\",\"_compileJSON\",\"_compileJSONMulti\",\"_compileJSONCallback\",\"_compileStandard\"]' -s RESERVED_FUNCTION_POINTERS=20")
add_executable(soljson libsolc.cpp)
target_link_libraries(soljson PRIVATE solidity)
else()
diff --git a/libsolc/libsolc.cpp b/libsolc/libsolc.cpp
index 6c587e23..26ce98ce 100644
--- a/libsolc/libsolc.cpp
+++ b/libsolc/libsolc.cpp
@@ -299,4 +299,19 @@ extern char const* compileStandard(char const* _input, CStyleReadFileCallback _r
s_outputBuffer = compileStandardInternal(_input, _readCallback);
return s_outputBuffer.c_str();
}
+extern char const* solidity_license()
+{
+ /// todo: make this the default or an alias
+ return license();
+}
+extern char const* solidity_version()
+{
+ /// todo: make this the default or an alias
+ return version();
+}
+extern char const* solidity_compile(char const* _input, CStyleReadFileCallback _readCallback)
+{
+ /// todo: make this the default or an alias
+ return compileStandard(_input, _readCallback);
+}
}
diff --git a/libsolc/libsolc.h b/libsolc/libsolc.h
index c392ce93..2cc004d4 100644
--- a/libsolc/libsolc.h
+++ b/libsolc/libsolc.h
@@ -37,6 +37,10 @@ char const* compileJSONMulti(char const* _input, bool _optimize);
char const* compileJSONCallback(char const* _input, bool _optimize, CStyleReadFileCallback _readCallback);
char const* compileStandard(char const* _input, CStyleReadFileCallback _readCallback);
+char const* solidity_license();
+char const* solidity_version();
+char const* solidity_compile(char const* _input, CStyleReadFileCallback _readCallback);
+
#ifdef __cplusplus
}
#endif
diff --git a/libsolidity/analysis/StaticAnalyzer.cpp b/libsolidity/analysis/StaticAnalyzer.cpp
index c7440565..323282ca 100644
--- a/libsolidity/analysis/StaticAnalyzer.cpp
+++ b/libsolidity/analysis/StaticAnalyzer.cpp
@@ -150,36 +150,18 @@ bool StaticAnalyzer::visit(ExpressionStatement const& _statement)
bool StaticAnalyzer::visit(MemberAccess const& _memberAccess)
{
- bool const v050 = m_currentContract->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050);
-
if (MagicType const* type = dynamic_cast<MagicType const*>(_memberAccess.expression().annotation().type.get()))
{
if (type->kind() == MagicType::Kind::Message && _memberAccess.memberName() == "gas")
- {
- if (v050)
- m_errorReporter.typeError(
- _memberAccess.location(),
- "\"msg.gas\" has been deprecated in favor of \"gasleft()\""
- );
- else
- m_errorReporter.warning(
- _memberAccess.location(),
- "\"msg.gas\" has been deprecated in favor of \"gasleft()\""
- );
- }
- if (type->kind() == MagicType::Kind::Block && _memberAccess.memberName() == "blockhash")
- {
- if (v050)
- m_errorReporter.typeError(
- _memberAccess.location(),
- "\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
- );
- else
- m_errorReporter.warning(
- _memberAccess.location(),
- "\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
- );
- }
+ m_errorReporter.typeError(
+ _memberAccess.location(),
+ "\"msg.gas\" has been deprecated in favor of \"gasleft()\""
+ );
+ else if (type->kind() == MagicType::Kind::Block && _memberAccess.memberName() == "blockhash")
+ m_errorReporter.typeError(
+ _memberAccess.location(),
+ "\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
+ );
}
if (m_nonPayablePublic && !m_library)
diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp
index cd0dc2a4..63f8fac3 100644
--- a/libsolidity/analysis/SyntaxChecker.cpp
+++ b/libsolidity/analysis/SyntaxChecker.cpp
@@ -192,15 +192,9 @@ bool SyntaxChecker::visit(Throw const& _throwStatement)
bool SyntaxChecker::visit(UnaryOperation const& _operation)
{
- bool const v050 = m_sourceUnit->annotation().experimentalFeatures.count(ExperimentalFeature::V050);
-
if (_operation.getOperator() == Token::Add)
- {
- if (v050)
- m_errorReporter.syntaxError(_operation.location(), "Use of unary + is deprecated.");
- else
- m_errorReporter.warning(_operation.location(), "Use of unary + is deprecated.");
- }
+ m_errorReporter.syntaxError(_operation.location(), "Use of unary + is disallowed.");
+
return true;
}
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index ebf523ea..78536664 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -746,19 +746,10 @@ bool TypeChecker::visit(VariableDeclaration const& _variable)
if (!_variable.value())
m_errorReporter.typeError(_variable.location(), "Uninitialized \"constant\" variable.");
else if (!_variable.value()->annotation().isPure)
- {
- if (_variable.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050))
- m_errorReporter.typeError(
- _variable.value()->location(),
- "Initial value for constant variable has to be compile-time constant."
- );
- else
- m_errorReporter.warning(
- _variable.value()->location(),
- "Initial value for constant variable has to be compile-time constant. "
- "This will fail to compile with the next breaking version change."
- );
- }
+ m_errorReporter.typeError(
+ _variable.value()->location(),
+ "Initial value for constant variable has to be compile-time constant."
+ );
}
if (!_variable.isStateVariable())
{
@@ -1079,10 +1070,7 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement)
if (varDecl.referenceLocation() == VariableDeclaration::Location::Default)
errorText += " Did you mean '<type> memory " + varDecl.name() + "'?";
solAssert(m_scope, "");
- if (v050)
- m_errorReporter.declarationError(varDecl.location(), errorText);
- else
- m_errorReporter.warning(varDecl.location(), errorText);
+ m_errorReporter.declarationError(varDecl.location(), errorText);
}
}
else if (dynamic_cast<MappingType const*>(type(varDecl).get()))
@@ -1343,7 +1331,6 @@ bool TypeChecker::visit(Conditional const& _conditional)
bool TypeChecker::visit(Assignment const& _assignment)
{
- bool const v050 = m_scope->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050);
requireLValue(_assignment.leftHandSide());
TypePointer t = type(_assignment.leftHandSide());
_assignment.annotation().type = t;
@@ -1360,25 +1347,8 @@ bool TypeChecker::visit(Assignment const& _assignment)
expectType(_assignment.rightHandSide(), *tupleType);
// expectType does not cause fatal errors, so we have to check again here.
- if (TupleType const* rhsType = dynamic_cast<TupleType const*>(type(_assignment.rightHandSide()).get()))
- {
+ if (dynamic_cast<TupleType const*>(type(_assignment.rightHandSide()).get()))
checkDoubleStorageAssignment(_assignment);
- // @todo For 0.5.0, this code shoud move to TupleType::isImplicitlyConvertibleTo,
- // but we cannot do it right now.
- if (rhsType->components().size() != tupleType->components().size())
- {
- string message =
- "Different number of components on the left hand side (" +
- toString(tupleType->components().size()) +
- ") than on the right hand side (" +
- toString(rhsType->components().size()) +
- ").";
- if (v050)
- m_errorReporter.typeError(_assignment.location(), message);
- else
- m_errorReporter.warning(_assignment.location(), message);
- }
- }
}
else if (t->category() == Type::Category::Mapping)
{
@@ -1435,14 +1405,12 @@ bool TypeChecker::visit(TupleExpression const& _tuple)
}
else
{
- bool const v050 = m_scope->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050);
bool isPure = true;
TypePointer inlineArrayType;
for (size_t i = 0; i < components.size(); ++i)
{
- // Outside of an lvalue-context, the only situation where a component can be empty is (x,).
- if (!components[i] && !(i == 1 && components.size() == 2))
+ if (!components[i])
m_errorReporter.fatalTypeError(_tuple.location(), "Tuple component cannot be empty.");
else if (components[i])
{
@@ -1454,10 +1422,7 @@ bool TypeChecker::visit(TupleExpression const& _tuple)
{
if (_tuple.isInlineArray())
m_errorReporter.fatalTypeError(components[i]->location(), "Array component cannot be empty.");
- if (v050)
- m_errorReporter.fatalTypeError(components[i]->location(), "Tuple component cannot be empty.");
- else
- m_errorReporter.warning(components[i]->location(), "Tuple component cannot be empty.");
+ m_errorReporter.typeError(components[i]->location(), "Tuple component cannot be empty.");
}
// Note: code generation will visit each of the expression even if they are not assigned from.
@@ -1495,11 +1460,7 @@ bool TypeChecker::visit(TupleExpression const& _tuple)
if (components.size() == 1)
_tuple.annotation().type = type(*components[0]);
else
- {
- if (components.size() == 2 && !components[1])
- types.pop_back();
_tuple.annotation().type = make_shared<TupleType>(types);
- }
}
}
@@ -1854,7 +1815,7 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
if (functionType->takesArbitraryParameters())
m_errorReporter.typeError(
_functionCall.location(),
- "Named arguments cannnot be used for functions that take arbitrary parameters."
+ "Named arguments cannot be used for functions that take arbitrary parameters."
);
else if (parameterNames.size() > argumentNames.size())
m_errorReporter.typeError(_functionCall.location(), "Some argument names are missing.");
@@ -2273,11 +2234,9 @@ void TypeChecker::endVisit(ElementaryTypeNameExpression const& _expr)
void TypeChecker::endVisit(Literal const& _literal)
{
- bool const v050 = m_scope->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050);
-
if (_literal.looksLikeAddress())
{
- // Assign type here if it even looks like an address. This prevents double error in 050 mode for invalid address
+ // Assign type here if it even looks like an address. This prevents double errors for invalid addresses
_literal.annotation().type = make_shared<IntegerType>(160, IntegerType::Modifier::Address);
string msg;
@@ -2304,20 +2263,11 @@ void TypeChecker::endVisit(Literal const& _literal)
}
if (_literal.isHexNumber() && _literal.subDenomination() != Literal::SubDenomination::None)
- {
- if (v050)
- m_errorReporter.fatalTypeError(
- _literal.location(),
- "Hexadecimal numbers cannot be used with unit denominations. "
- "You can use an expression of the form \"0x1234 * 1 day\" instead."
- );
- else
- m_errorReporter.warning(
- _literal.location(),
- "Hexadecimal numbers with unit denominations are deprecated. "
- "You can use an expression of the form \"0x1234 * 1 day\" instead."
- );
- }
+ m_errorReporter.fatalTypeError(
+ _literal.location(),
+ "Hexadecimal numbers cannot be used with unit denominations. "
+ "You can use an expression of the form \"0x1234 * 1 day\" instead."
+ );
if (_literal.subDenomination() == Literal::SubDenomination::Year)
m_errorReporter.typeError(
diff --git a/libsolidity/analysis/ViewPureChecker.cpp b/libsolidity/analysis/ViewPureChecker.cpp
index 107eb3aa..18c642c3 100644
--- a/libsolidity/analysis/ViewPureChecker.cpp
+++ b/libsolidity/analysis/ViewPureChecker.cpp
@@ -116,31 +116,22 @@ private:
bool ViewPureChecker::check()
{
- // The bool means "enforce view with errors".
- vector<pair<ContractDefinition const*, bool>> contracts;
+ vector<ContractDefinition const*> contracts;
for (auto const& node: m_ast)
{
SourceUnit const* source = dynamic_cast<SourceUnit const*>(node.get());
solAssert(source, "");
- bool enforceView = source->annotation().experimentalFeatures.count(ExperimentalFeature::V050);
- for (ContractDefinition const* c: source->filteredNodes<ContractDefinition>(source->nodes()))
- contracts.emplace_back(c, enforceView);
+ contracts += source->filteredNodes<ContractDefinition>(source->nodes());
}
// Check modifiers first to infer their state mutability.
for (auto const& contract: contracts)
- {
- m_enforceViewWithError = contract.second;
- for (ModifierDefinition const* mod: contract.first->functionModifiers())
+ for (ModifierDefinition const* mod: contract->functionModifiers())
mod->accept(*this);
- }
for (auto const& contract: contracts)
- {
- m_enforceViewWithError = contract.second;
- contract.first->accept(*this);
- }
+ contract->accept(*this);
return !m_errors;
}
@@ -232,17 +223,20 @@ void ViewPureChecker::reportMutability(StateMutability _mutability, SourceLocati
{
if (m_currentFunction && m_currentFunction->stateMutability() < _mutability)
{
- string text;
if (_mutability == StateMutability::View)
- text =
+ m_errorReporter.typeError(
+ _location,
"Function declared as pure, but this expression (potentially) reads from the "
- "environment or state and thus requires \"view\".";
+ "environment or state and thus requires \"view\"."
+ );
else if (_mutability == StateMutability::NonPayable)
- text =
+ m_errorReporter.typeError(
+ _location,
"Function declared as " +
stateMutabilityToString(m_currentFunction->stateMutability()) +
", but this expression (potentially) modifies the state and thus "
- "requires non-payable (the default) or payable.";
+ "requires non-payable (the default) or payable."
+ );
else
solAssert(false, "");
@@ -251,13 +245,7 @@ void ViewPureChecker::reportMutability(StateMutability _mutability, SourceLocati
m_currentFunction->stateMutability() == StateMutability::Pure,
""
);
- if (!m_enforceViewWithError && m_currentFunction->stateMutability() == StateMutability::View)
- m_errorReporter.warning(_location, text);
- else
- {
- m_errors = true;
- m_errorReporter.typeError(_location, text);
- }
+ m_errors = true;
}
if (_mutability > m_currentBestMutability)
m_currentBestMutability = _mutability;
diff --git a/libsolidity/analysis/ViewPureChecker.h b/libsolidity/analysis/ViewPureChecker.h
index 0b882cd8..3db52e7e 100644
--- a/libsolidity/analysis/ViewPureChecker.h
+++ b/libsolidity/analysis/ViewPureChecker.h
@@ -71,7 +71,6 @@ private:
ErrorReporter& m_errorReporter;
bool m_errors = false;
- bool m_enforceViewWithError = false;
StateMutability m_currentBestMutability = StateMutability::Payable;
FunctionDefinition const* m_currentFunction = nullptr;
std::map<ModifierDefinition const*, StateMutability> m_inferredMutability;
diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h
index d703ae53..9906fa68 100644
--- a/libsolidity/ast/AST.h
+++ b/libsolidity/ast/AST.h
@@ -1250,13 +1250,12 @@ private:
};
/**
- * Definition of a variable as a statement inside a function. It requires a type name (which can
- * also be "var") but the actual assignment can be missing.
- * Examples: var a = 2; uint256 a;
- * As a second form, multiple variables can be declared, cannot have a type and must be assigned
- * right away. If the first or last component is unnamed, it can "consume" an arbitrary number
- * of components.
- * Examples: var (a, b) = f(); var (a,,,c) = g(); var (a,) = d();
+ * Definition of one or more variables as a statement inside a function.
+ * If multiple variables are declared, a value has to be assigned directly.
+ * If only a single variable is declared, the value can be missing.
+ * Examples:
+ * uint[] memory a; uint a = 2;
+ * (uint a, bytes32 b, ) = f(); (, uint a, , StructName storage x) = g();
*/
class VariableDeclarationStatement: public Statement
{
@@ -1278,6 +1277,9 @@ public:
private:
/// List of variables, some of which can be empty pointers (unnamed components).
+ /// Note that the ``m_value`` member of these is unused. Instead, ``m_initialValue``
+ /// below is used, because the initial value can be a single expression assigned
+ /// to all variables.
std::vector<ASTPointer<VariableDeclaration>> m_variables;
/// The assigned expression / initial value.
ASTPointer<Expression> m_initialValue;
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp
index 1c4eb76e..23614e58 100644
--- a/libsolidity/ast/Types.cpp
+++ b/libsolidity/ast/Types.cpp
@@ -2238,25 +2238,13 @@ bool TupleType::isImplicitlyConvertibleTo(Type const& _other) const
TypePointers const& targets = tupleType->components();
if (targets.empty())
return components().empty();
- if (components().size() != targets.size() && !targets.front() && !targets.back())
- return false; // (,a,) = (1,2,3,4) - unable to position `a` in the tuple.
- size_t minNumValues = targets.size();
- if (!targets.back() || !targets.front())
- --minNumValues; // wildcards can also match 0 components
- if (components().size() < minNumValues)
+ if (components().size() != targets.size())
return false;
- if (components().size() > targets.size() && targets.front() && targets.back())
- return false; // larger source and no wildcard
- bool fillRight = !targets.back() || targets.front();
- for (size_t i = 0; i < min(targets.size(), components().size()); ++i)
- {
- auto const& s = components()[fillRight ? i : components().size() - i - 1];
- auto const& t = targets[fillRight ? i : targets.size() - i - 1];
- if (!s && t)
+ for (size_t i = 0; i < targets.size(); ++i)
+ if (!components()[i] && targets[i])
return false;
- else if (s && t && !s->isImplicitlyConvertibleTo(*t))
+ else if (components()[i] && targets[i] && !components()[i]->isImplicitlyConvertibleTo(*targets[i]))
return false;
- }
return true;
}
else
diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp
index a5e96335..2f45765a 100644
--- a/libsolidity/codegen/CompilerUtils.cpp
+++ b/libsolidity/codegen/CompilerUtils.cpp
@@ -510,7 +510,7 @@ void CompilerUtils::zeroInitialiseMemoryArray(ArrayType const& _type)
codecopy(memptr, codesize(), size)
memptr := add(memptr, size)
})");
- templ("element_size", to_string(_type.baseType()->memoryHeadSize()));
+ templ("element_size", to_string(_type.isByteArray() ? 1 : _type.baseType()->memoryHeadSize()));
m_context.appendInlineAssembly(templ.render(), {"length", "memptr"});
}
else
diff --git a/libsolidity/inlineasm/AsmParser.cpp b/libsolidity/inlineasm/AsmParser.cpp
index 7df9ab88..cd429a98 100644
--- a/libsolidity/inlineasm/AsmParser.cpp
+++ b/libsolidity/inlineasm/AsmParser.cpp
@@ -150,7 +150,7 @@ assembly::Statement Parser::parseStatement()
expectToken(Token::Comma);
elementary = parseElementaryOperation();
if (elementary.type() != typeid(assembly::Identifier))
- fatalParserError("Variable name expected in multiple assignemnt.");
+ fatalParserError("Variable name expected in multiple assignment.");
assignment.variableNames.emplace_back(boost::get<assembly::Identifier>(elementary));
}
while (currentToken() == Token::Comma);
diff --git a/scripts/bytecodecompare/storebytecode.bat b/scripts/bytecodecompare/storebytecode.bat
index e64e9276..ef20a320 100644
--- a/scripts/bytecodecompare/storebytecode.bat
+++ b/scripts/bytecodecompare/storebytecode.bat
@@ -39,4 +39,5 @@ set REPORT=%DIRECTORY%/windows.txt
cp ../report.txt %REPORT%
git add %REPORT%
git commit -a -m "Added report."
+git pull --rebase
git push origin 2>&1
diff --git a/scripts/isolate_tests.py b/scripts/isolate_tests.py
index 82dff1e0..1f913504 100755
--- a/scripts/isolate_tests.py
+++ b/scripts/isolate_tests.py
@@ -10,7 +10,7 @@ import sys
import re
import os
import hashlib
-from os.path import join
+from os.path import join, isfile
def extract_test_cases(path):
lines = open(path, 'rb').read().splitlines()
@@ -77,24 +77,31 @@ def write_cases(tests):
for test in tests:
open('test_%s.sol' % hashlib.sha256(test).hexdigest(), 'wb').write(test)
+
+def extract_and_write(f, path):
+ if docs:
+ cases = extract_docs_cases(path)
+ else:
+ if f.endswith('.sol'):
+ cases = [open(path, 'r').read()]
+ else:
+ cases = extract_test_cases(path)
+ write_cases(cases)
+
if __name__ == '__main__':
path = sys.argv[1]
docs = False
if len(sys.argv) > 2 and sys.argv[2] == 'docs':
docs = True
- for root, subdirs, files in os.walk(path):
- if '_build' in subdirs:
- subdirs.remove('_build')
- if 'compilationTests' in subdirs:
- subdirs.remove('compilationTests')
- for f in files:
- path = join(root, f)
- if docs:
- cases = extract_docs_cases(path)
- else:
- if f.endswith(".sol"):
- cases = [open(path, "r").read()]
- else:
- cases = extract_test_cases(path)
- write_cases(cases)
+ if isfile(path):
+ extract_and_write(path, path)
+ else:
+ for root, subdirs, files in os.walk(path):
+ if '_build' in subdirs:
+ subdirs.remove('_build')
+ if 'compilationTests' in subdirs:
+ subdirs.remove('compilationTests')
+ for f in files:
+ path = join(root, f)
+ extract_and_write(f, path)
diff --git a/scripts/tests.sh b/scripts/tests.sh
index 7fb260bc..ab9b2f76 100755
--- a/scripts/tests.sh
+++ b/scripts/tests.sh
@@ -56,7 +56,6 @@ fi
function printError() { echo "$(tput setaf 1)$1$(tput sgr0)"; }
function printTask() { echo "$(tput bold)$(tput setaf 2)$1$(tput sgr0)"; }
-
printTask "Running commandline tests..."
"$REPO_ROOT/test/cmdlineTests.sh" &
CMDLINE_PID=$!
@@ -70,58 +69,58 @@ then
fi
fi
-function download_eth()
+function download_aleth()
{
if [[ "$OSTYPE" == "darwin"* ]]; then
- ETH_PATH="$REPO_ROOT/eth"
+ ALETH_PATH="$REPO_ROOT/aleth"
elif [ -z $CI ]; then
- ETH_PATH="eth"
+ ALETH_PATH="aleth"
else
mkdir -p /tmp/test
if grep -i trusty /etc/lsb-release >/dev/null 2>&1
then
# built from d661ac4fec0aeffbedcdc195f67f5ded0c798278 at 2018-06-20
- ETH_BINARY=aleth_2018-06-20_trusty
- ETH_HASH="54b8a5455e45b295e3a962f353ff8f1580ed106c"
+ ALETH_BINARY=aleth_2018-06-20_trusty
+ ALETH_HASH="54b8a5455e45b295e3a962f353ff8f1580ed106c"
else
# built from d661ac4fec0aeffbedcdc195f67f5ded0c798278 at 2018-06-20
- ETH_BINARY=aleth_2018-06-20_artful
- ETH_HASH="02e6c4b3d98299885e73f7db6c9e3fbe3d66d444"
+ ALETH_BINARY=aleth_2018-06-20_artful
+ ALETH_HASH="02e6c4b3d98299885e73f7db6c9e3fbe3d66d444"
fi
- wget -q -O /tmp/test/eth https://github.com/ethereum/cpp-ethereum/releases/download/solidityTester/$ETH_BINARY
- test "$(shasum /tmp/test/eth)" = "$ETH_HASH /tmp/test/eth"
+ ALETH_PATH="/tmp/test/aleth"
+ wget -q -O $ALETH_PATH https://github.com/ethereum/cpp-ethereum/releases/download/solidityTester/$ALETH_BINARY
+ test "$(shasum $ALETH_PATH)" = "$ALETH_HASH $ALETH_PATH"
sync
- chmod +x /tmp/test/eth
+ chmod +x $ALETH_PATH
sync # Otherwise we might get a "text file busy" error
- ETH_PATH="/tmp/test/eth"
fi
}
# $1: data directory
# echos the PID
-function run_eth()
+function run_aleth()
{
- $ETH_PATH --test -d "$1" >/dev/null 2>&1 &
+ $ALETH_PATH --test -d "$1" >/dev/null 2>&1 &
echo $!
# Wait until the IPC endpoint is available.
while [ ! -S "$1"/geth.ipc ] ; do sleep 1; done
sleep 2
}
-function check_eth() {
- printTask "Running IPC tests with $ETH_PATH..."
- if ! hash $ETH_PATH 2>/dev/null; then
- printError "$ETH_PATH not found"
+function check_aleth() {
+ printTask "Running IPC tests with $ALETH_PATH..."
+ if ! hash $ALETH_PATH 2>/dev/null; then
+ printError "$ALETH_PATH not found"
exit 1
fi
}
if [ "$IPC_ENABLED" = true ];
then
- download_eth
- check_eth
- ETH_PID=$(run_eth /tmp/test)
+ download_aleth
+ check_aleth
+ ALETH_PID=$(run_aleth /tmp/test)
fi
progress="--show-progress"
@@ -166,7 +165,7 @@ fi
if [ "$IPC_ENABLED" = true ]
then
- pkill "$ETH_PID" || true
+ pkill "$ALETH_PID" || true
sleep 4
- pgrep "$ETH_PID" && pkill -9 "$ETH_PID" || true
+ pgrep "$ALETH_PID" && pkill -9 "$ALETH_PID" || true
fi
diff --git a/test/compilationTests/corion/ico.sol b/test/compilationTests/corion/ico.sol
index b6d8e035..80444395 100644
--- a/test/compilationTests/corion/ico.sol
+++ b/test/compilationTests/corion/ico.sol
@@ -49,8 +49,8 @@ contract ico is safeMath {
mapping (address => mapping(uint256 => interest_s)) public interestDB;
uint256 public totalMint;
uint256 public totalPremiumMint;
-
- constructor(address foundation, address priceSet, uint256 exchangeRate, uint256 startBlockNum, address[] genesisAddr, uint256[] genesisValue) {
+
+ constructor(address foundation, address priceSet, uint256 exchangeRate, uint256 startBlockNum, address[] genesisAddr, uint256[] genesisValue) public {
/*
Installation function.
@@ -283,8 +283,8 @@ contract ico is safeMath {
require( isICO() );
require( buy(msg.sender, address(0x00)) );
}
-
- function buy(address beneficiaryAddress, address affilateAddress) payable returns (bool success) {
+
+ function buy(address beneficiaryAddress, address affilateAddress) public payable returns (bool success) {
/*
Buying a token
diff --git a/test/compilationTests/corion/moduleHandler.sol b/test/compilationTests/corion/moduleHandler.sol
index b3d03c2a..441f7fba 100644
--- a/test/compilationTests/corion/moduleHandler.sol
+++ b/test/compilationTests/corion/moduleHandler.sol
@@ -34,10 +34,10 @@ contract moduleHandler is multiOwner, announcementTypes {
modules_s[] public modules;
address public foundationAddress;
uint256 debugModeUntil = block.number + 1000000;
-
-
- constructor(address[] newOwners) multiOwner(newOwners) {}
- function load(address foundation, bool forReplace, address Token, address Premium, address Publisher, address Schelling, address Provider) {
+
+
+ constructor(address[] newOwners) multiOwner(newOwners) public {}
+ function load(address foundation, bool forReplace, address Token, address Premium, address Publisher, address Schelling, address Provider) public {
/*
Loading modulest to ModuleHandler.
diff --git a/test/compilationTests/corion/multiOwner.sol b/test/compilationTests/corion/multiOwner.sol
index 78f7109c..337467db 100644
--- a/test/compilationTests/corion/multiOwner.sol
+++ b/test/compilationTests/corion/multiOwner.sol
@@ -12,7 +12,7 @@ contract multiOwner is safeMath {
/*
Constructor
*/
- constructor(address[] newOwners) {
+ constructor(address[] newOwners) public {
for ( uint256 a=0 ; a<newOwners.length ; a++ ) {
_addOwner(newOwners[a]);
}
diff --git a/test/compilationTests/corion/premium.sol b/test/compilationTests/corion/premium.sol
index 695dd344..14f18ad2 100644
--- a/test/compilationTests/corion/premium.sol
+++ b/test/compilationTests/corion/premium.sol
@@ -39,8 +39,8 @@ contract premium is module, safeMath {
bool public isICO;
mapping(address => bool) public genesis;
-
- constructor(bool forReplace, address moduleHandler, address dbAddress, address icoContractAddr, address[] genesisAddr, uint256[] genesisValue) {
+
+ constructor(bool forReplace, address moduleHandler, address dbAddress, address icoContractAddr, address[] genesisAddr, uint256[] genesisValue) public {
/*
Setup function.
If an ICOaddress is defined then the balance of the genesis addresses will be set as well.
@@ -139,8 +139,8 @@ contract premium is module, safeMath {
require( db.setAllowance(msg.sender, spender, amount, nonce) );
emit Approval(msg.sender, spender, amount);
}
-
- function allowance(address owner, address spender) view returns (uint256 remaining, uint256 nonce) {
+
+ function allowance(address owner, address spender) public view returns (uint256 remaining, uint256 nonce) {
/*
Get the quantity of tokens given to be used
@@ -318,8 +318,8 @@ contract premium is module, safeMath {
}
return _codeLength > 0;
}
-
- function balanceOf(address owner) view returns (uint256 value) {
+
+ function balanceOf(address owner) public view returns (uint256 value) {
/*
Token balance query
@@ -328,8 +328,8 @@ contract premium is module, safeMath {
*/
return db.balanceOf(owner);
}
-
- function totalSupply() view returns (uint256 value) {
+
+ function totalSupply() public view returns (uint256 value) {
/*
Total token quantity query
diff --git a/test/compilationTests/corion/provider.sol b/test/compilationTests/corion/provider.sol
index 16546809..83edcc01 100644
--- a/test/compilationTests/corion/provider.sol
+++ b/test/compilationTests/corion/provider.sol
@@ -118,7 +118,7 @@ contract provider is module, safeMath, announcementTypes {
uint256 private currentSchellingRound = 1;
- constructor(address _moduleHandler) {
+ constructor(address _moduleHandler) public {
/*
Install function.
diff --git a/test/compilationTests/corion/publisher.sol b/test/compilationTests/corion/publisher.sol
index f7d8fdea..3a332706 100644
--- a/test/compilationTests/corion/publisher.sol
+++ b/test/compilationTests/corion/publisher.sol
@@ -60,8 +60,8 @@ contract publisher is announcementTypes, module, safeMath {
uint256 announcementsLength = 1;
mapping (address => uint256[]) public opponents;
-
- constructor(address moduleHandler) {
+
+ constructor(address moduleHandler) public {
/*
Installation function. The installer will be registered in the admin list automatically
diff --git a/test/compilationTests/corion/schelling.sol b/test/compilationTests/corion/schelling.sol
index 74f8af9d..0f84239d 100644
--- a/test/compilationTests/corion/schelling.sol
+++ b/test/compilationTests/corion/schelling.sol
@@ -45,7 +45,7 @@ contract schellingDB is safeMath, schellingVars {
/*
Constructor
*/
- constructor() {
+ constructor() public {
rounds.length = 2;
rounds[0].blockHeight = block.number;
currentSchellingRound = 1;
@@ -54,7 +54,7 @@ contract schellingDB is safeMath, schellingVars {
Funds
*/
mapping(address => uint256) private funds;
- function getFunds(address _owner) view returns(bool, uint256) {
+ function getFunds(address _owner) public view returns(bool, uint256) {
return (true, funds[_owner]);
}
function setFunds(address _owner, uint256 _amount) isOwner external returns(bool) {
@@ -65,7 +65,7 @@ contract schellingDB is safeMath, schellingVars {
Rounds
*/
_rounds[] private rounds;
- function getRound(uint256 _id) view returns(bool, uint256, uint256, uint256, uint256, bool) {
+ function getRound(uint256 _id) public view returns(bool, uint256, uint256, uint256, uint256, bool) {
if ( rounds.length <= _id ) { return (false, 0, 0, 0, 0, false); }
else { return (true, rounds[_id].totalAboveWeight, rounds[_id].totalBelowWeight, rounds[_id].reward, rounds[_id].blockHeight, rounds[_id].voted); }
}
@@ -76,14 +76,14 @@ contract schellingDB is safeMath, schellingVars {
rounds[_id] = _rounds(_totalAboveWeight, _totalBelowWeight, _reward, _blockHeight, _voted);
return true;
}
- function getCurrentRound() view returns(bool, uint256) {
+ function getCurrentRound() public view returns(bool, uint256) {
return (true, rounds.length-1);
}
/*
Voter
*/
mapping(address => _voter) private voter;
- function getVoter(address _owner) view returns(bool success, uint256 roundID,
+ function getVoter(address _owner) public view returns(bool success, uint256 roundID,
bytes32 hash, voterStatus status, bool voteResult, uint256 rewards) {
roundID = voter[_owner].roundID;
hash = voter[_owner].hash;
@@ -106,7 +106,7 @@ contract schellingDB is safeMath, schellingVars {
Schelling Token emission
*/
mapping(uint256 => uint256) private schellingExpansion;
- function getSchellingExpansion(uint256 _id) view returns(bool, uint256) {
+ function getSchellingExpansion(uint256 _id) public view returns(bool, uint256) {
return (true, schellingExpansion[_id]);
}
function setSchellingExpansion(uint256 _id, uint256 _expansion) isOwner external returns(bool) {
@@ -121,7 +121,7 @@ contract schellingDB is safeMath, schellingVars {
currentSchellingRound = _id;
return true;
}
- function getCurrentSchellingRound() view returns(bool, uint256) {
+ function getCurrentSchellingRound() public view returns(bool, uint256) {
return (true, currentSchellingRound);
}
}
@@ -246,8 +246,8 @@ contract schelling is module, announcementTypes, schellingVars {
bytes1 public aboveChar = 0x31;
bytes1 public belowChar = 0x30;
schellingDB private db;
-
- constructor(address _moduleHandler, address _db, bool _forReplace) {
+
+ constructor(address _moduleHandler, address _db, bool _forReplace) public {
/*
Installation function.
diff --git a/test/compilationTests/corion/token.sol b/test/compilationTests/corion/token.sol
index fecbce3d..195b4ada 100644
--- a/test/compilationTests/corion/token.sol
+++ b/test/compilationTests/corion/token.sol
@@ -47,8 +47,8 @@ contract token is safeMath, module, announcementTypes {
bool public isICO = true;
mapping(address => bool) public genesis;
-
- constructor(bool forReplace, address moduleHandler, address dbAddr, address icoContractAddr, address exchangeContractAddress, address[] genesisAddr, uint256[] genesisValue) payable {
+
+ constructor(bool forReplace, address moduleHandler, address dbAddr, address icoContractAddr, address exchangeContractAddress, address[] genesisAddr, uint256[] genesisValue) public payable {
/*
Installation function
@@ -154,8 +154,8 @@ contract token is safeMath, module, announcementTypes {
require( db.setAllowance(msg.sender, spender, amount, nonce) );
emit Approval(msg.sender, spender, amount);
}
-
- function allowance(address owner, address spender) view returns (uint256 remaining, uint256 nonce) {
+
+ function allowance(address owner, address spender) public view returns (uint256 remaining, uint256 nonce) {
/*
Get the quantity of tokens given to be used
@@ -471,8 +471,8 @@ contract token is safeMath, module, announcementTypes {
}
return _codeLength > 0;
}
-
- function balanceOf(address owner) view returns (uint256 value) {
+
+ function balanceOf(address owner) public view returns (uint256 value) {
/*
Token balance query
@@ -482,8 +482,8 @@ contract token is safeMath, module, announcementTypes {
*/
return db.balanceOf(owner);
}
-
- function totalSupply() view returns (uint256 value) {
+
+ function totalSupply() public view returns (uint256 value) {
/*
Total token quantity query
diff --git a/test/compilationTests/corion/tokenDB.sol b/test/compilationTests/corion/tokenDB.sol
index 40304a54..484135ca 100644
--- a/test/compilationTests/corion/tokenDB.sol
+++ b/test/compilationTests/corion/tokenDB.sol
@@ -60,8 +60,8 @@ contract tokenDB is safeMath, ownedDB {
allowance[owner][spender].nonce = nonce;
return true;
}
-
- function getAllowance(address owner, address spender) view returns(bool success, uint256 remaining, uint256 nonce) {
+
+ function getAllowance(address owner, address spender) public view returns(bool success, uint256 remaining, uint256 nonce) {
/*
Get allowance from the database.
diff --git a/test/compilationTests/gnosis/Migrations.sol b/test/compilationTests/gnosis/Migrations.sol
index c7d09bd2..f1a3ea9d 100644
--- a/test/compilationTests/gnosis/Migrations.sol
+++ b/test/compilationTests/gnosis/Migrations.sol
@@ -8,15 +8,15 @@ contract Migrations {
if (msg.sender == owner) _;
}
- constructor() {
+ constructor() public {
owner = msg.sender;
}
- function setCompleted(uint completed) restricted {
+ function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
- function upgrade(address new_address) restricted {
+ function upgrade(address new_address) public restricted {
Migrations upgraded = Migrations(new_address);
upgraded.setCompleted(last_completed_migration);
}
diff --git a/test/compilationTests/milestonetracker/MilestoneTracker.sol b/test/compilationTests/milestonetracker/MilestoneTracker.sol
index 378f7b73..545acb0a 100644
--- a/test/compilationTests/milestonetracker/MilestoneTracker.sol
+++ b/test/compilationTests/milestonetracker/MilestoneTracker.sol
@@ -112,7 +112,7 @@ contract MilestoneTracker {
address _arbitrator,
address _donor,
address _recipient
- ) {
+ ) public {
arbitrator = _arbitrator;
donor = _donor;
recipient = _recipient;
@@ -124,7 +124,7 @@ contract MilestoneTracker {
/////////
/// @return The number of milestones ever created even if they were canceled
- function numberOfMilestones() view returns (uint) {
+ function numberOfMilestones() public view returns (uint) {
return milestones.length;
}
@@ -135,19 +135,19 @@ contract MilestoneTracker {
/// @notice `onlyArbitrator` Reassigns the arbitrator to a new address
/// @param _newArbitrator The new arbitrator
- function changeArbitrator(address _newArbitrator) onlyArbitrator {
+ function changeArbitrator(address _newArbitrator) public onlyArbitrator {
arbitrator = _newArbitrator;
}
/// @notice `onlyDonor` Reassigns the `donor` to a new address
/// @param _newDonor The new donor
- function changeDonor(address _newDonor) onlyDonor {
+ function changeDonor(address _newDonor) public onlyDonor {
donor = _newDonor;
}
/// @notice `onlyRecipient` Reassigns the `recipient` to a new address
/// @param _newRecipient The new recipient
- function changeRecipient(address _newRecipient) onlyRecipient {
+ function changeRecipient(address _newRecipient) public onlyRecipient {
recipient = _newRecipient;
}
@@ -176,7 +176,7 @@ contract MilestoneTracker {
/// address paymentSource,
/// bytes payData,
function proposeMilestones(bytes _newMilestones
- ) onlyRecipient campaignNotCanceled {
+ ) public onlyRecipient campaignNotCanceled {
proposedMilestones = _newMilestones;
changingMilestones = true;
emit NewMilestoneListProposed();
@@ -189,7 +189,7 @@ contract MilestoneTracker {
/// @notice `onlyRecipient` Cancels the proposed milestones and reactivates
/// the previous set of milestones
- function unproposeMilestones() onlyRecipient campaignNotCanceled {
+ function unproposeMilestones() public onlyRecipient campaignNotCanceled {
delete proposedMilestones;
changingMilestones = false;
emit NewMilestoneListUnproposed();
@@ -200,7 +200,7 @@ contract MilestoneTracker {
/// bytecode; this confirms that the `donor` knows the set of milestones
/// they are approving
function acceptProposedMilestones(bytes32 _hashProposals
- ) onlyDonor campaignNotCanceled {
+ ) public onlyDonor campaignNotCanceled {
uint i;
@@ -256,7 +256,7 @@ contract MilestoneTracker {
/// ready for review
/// @param _idMilestone ID of the milestone that has been completed
function markMilestoneComplete(uint _idMilestone)
- campaignNotCanceled notChanging
+ public campaignNotCanceled notChanging
{
if (_idMilestone >= milestones.length) throw;
Milestone milestone = milestones[_idMilestone];
@@ -274,7 +274,7 @@ contract MilestoneTracker {
/// @notice `onlyReviewer` Approves a specific milestone
/// @param _idMilestone ID of the milestone that is approved
function approveCompletedMilestone(uint _idMilestone)
- campaignNotCanceled notChanging
+ public campaignNotCanceled notChanging
{
if (_idMilestone >= milestones.length) throw;
Milestone milestone = milestones[_idMilestone];
@@ -289,7 +289,7 @@ contract MilestoneTracker {
/// state
/// @param _idMilestone ID of the milestone that is being rejected
function rejectMilestone(uint _idMilestone)
- campaignNotCanceled notChanging
+ public campaignNotCanceled notChanging
{
if (_idMilestone >= milestones.length) throw;
Milestone milestone = milestones[_idMilestone];
@@ -305,7 +305,7 @@ contract MilestoneTracker {
/// `reviewTime` has elapsed
/// @param _idMilestone ID of the milestone to be paid out
function requestMilestonePayment(uint _idMilestone
- ) campaignNotCanceled notChanging {
+ ) public campaignNotCanceled notChanging {
if (_idMilestone >= milestones.length) throw;
Milestone milestone = milestones[_idMilestone];
if ( (msg.sender != milestone.milestoneLeadLink)
@@ -321,7 +321,7 @@ contract MilestoneTracker {
/// @notice `onlyRecipient` Cancels a previously accepted milestone
/// @param _idMilestone ID of the milestone to be canceled
function cancelMilestone(uint _idMilestone)
- onlyRecipient campaignNotCanceled notChanging
+ public onlyRecipient campaignNotCanceled notChanging
{
if (_idMilestone >= milestones.length) throw;
Milestone milestone = milestones[_idMilestone];
@@ -337,7 +337,7 @@ contract MilestoneTracker {
/// has not been paid or canceled
/// @param _idMilestone ID of the milestone to be paid out
function arbitrateApproveMilestone(uint _idMilestone
- ) onlyArbitrator campaignNotCanceled notChanging {
+ ) public onlyArbitrator campaignNotCanceled notChanging {
if (_idMilestone >= milestones.length) throw;
Milestone milestone = milestones[_idMilestone];
if ((milestone.status != MilestoneStatus.AcceptedAndInProgress) &&
@@ -348,7 +348,7 @@ contract MilestoneTracker {
/// @notice `onlyArbitrator` Cancels the entire campaign voiding all
/// milestones.
- function arbitrateCancelCampaign() onlyArbitrator campaignNotCanceled {
+ function arbitrateCancelCampaign() public onlyArbitrator campaignNotCanceled {
campaignCanceled = true;
emit CampaignCanceled();
}
diff --git a/test/compilationTests/zeppelin/Bounty.sol b/test/compilationTests/zeppelin/Bounty.sol
index 8be16a54..6341610b 100644
--- a/test/compilationTests/zeppelin/Bounty.sol
+++ b/test/compilationTests/zeppelin/Bounty.sol
@@ -29,7 +29,7 @@ contract Bounty is PullPayment, Destructible {
* msg.sender as a researcher
* @return A target contract
*/
- function createTarget() returns(Target) {
+ function createTarget() public returns(Target) {
Target target = Target(deployContract());
researchers[target] = msg.sender;
emit TargetCreated(target);
@@ -46,7 +46,7 @@ contract Bounty is PullPayment, Destructible {
* @dev Sends the contract funds to the researcher that proved the contract is broken.
* @param target contract
*/
- function claim(Target target) {
+ function claim(Target target) public {
address researcher = researchers[target];
if (researcher == address(0)) {
throw;
@@ -74,5 +74,5 @@ contract Target {
* In order to win the bounty, security researchers will try to cause this broken state.
* @return True if all invariant values are correct, false otherwise.
*/
- function checkInvariant() returns(bool);
+ function checkInvariant() public returns(bool);
}
diff --git a/test/compilationTests/zeppelin/DayLimit.sol b/test/compilationTests/zeppelin/DayLimit.sol
index e55076b7..5a2937b5 100644
--- a/test/compilationTests/zeppelin/DayLimit.sol
+++ b/test/compilationTests/zeppelin/DayLimit.sol
@@ -15,7 +15,7 @@ contract DayLimit {
* @dev Constructor that sets the passed value as a dailyLimit.
* @param _limit uint256 to represent the daily limit.
*/
- constructor(uint256 _limit) {
+ constructor(uint256 _limit) public {
dailyLimit = _limit;
lastDay = today();
}
diff --git a/test/compilationTests/zeppelin/LimitBalance.sol b/test/compilationTests/zeppelin/LimitBalance.sol
index 40edd014..cf040097 100644
--- a/test/compilationTests/zeppelin/LimitBalance.sol
+++ b/test/compilationTests/zeppelin/LimitBalance.sol
@@ -15,7 +15,7 @@ contract LimitBalance {
* @dev Constructor that sets the passed value as a limit.
* @param _limit uint256 to represent the limit.
*/
- constructor(uint256 _limit) {
+ constructor(uint256 _limit) public {
limit = _limit;
}
diff --git a/test/compilationTests/zeppelin/MultisigWallet.sol b/test/compilationTests/zeppelin/MultisigWallet.sol
index 96624d3a..e8e8d05d 100644
--- a/test/compilationTests/zeppelin/MultisigWallet.sol
+++ b/test/compilationTests/zeppelin/MultisigWallet.sol
@@ -25,19 +25,19 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
* @param _owners A list of owners.
* @param _required The amount required for a transaction to be approved.
*/
- constructor(address[] _owners, uint256 _required, uint256 _daylimit)
+ constructor(address[] _owners, uint256 _required, uint256 _daylimit)
Shareable(_owners, _required)
- DayLimit(_daylimit) { }
+ DayLimit(_daylimit) public { }
- /**
- * @dev destroys the contract sending everything to `_to`.
+ /**
+ * @dev destroys the contract sending everything to `_to`.
*/
function destroy(address _to) onlymanyowners(keccak256(msg.data)) external {
selfdestruct(_to);
}
- /**
- * @dev Fallback function, receives value and emits a deposit event.
+ /**
+ * @dev Fallback function, receives value and emits a deposit event.
*/
function() external payable {
// just being sent some cash?
@@ -46,10 +46,10 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
}
/**
- * @dev Outside-visible transaction entry point. Executes transaction immediately if below daily
- * spending limit. If not, goes into multisig process. We provide a hash on return to allow the
- * sender to provide shortcuts for the other confirmations (allowing them to avoid replicating
- * the _to, _value, and _data arguments). They still get the option of using them if they want,
+ * @dev Outside-visible transaction entry point. Executes transaction immediately if below daily
+ * spending limit. If not, goes into multisig process. We provide a hash on return to allow the
+ * sender to provide shortcuts for the other confirmations (allowing them to avoid replicating
+ * the _to, _value, and _data arguments). They still get the option of using them if they want,
* anyways.
* @param _to The receiver address
* @param _value The value to send
@@ -76,11 +76,11 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
}
/**
- * @dev Confirm a transaction by providing just the hash. We use the previous transactions map,
+ * @dev Confirm a transaction by providing just the hash. We use the previous transactions map,
* txs, in order to determine the body of the transaction from the hash provided.
* @param _h The transaction hash to approve.
*/
- function confirm(bytes32 _h) onlymanyowners(_h) returns (bool) {
+ function confirm(bytes32 _h) onlymanyowners(_h) public returns (bool) {
if (txs[_h].to != address(0)) {
if (!txs[_h].to.call.value(txs[_h].value)(txs[_h].data)) {
throw;
@@ -91,15 +91,15 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
}
}
- /**
- * @dev Updates the daily limit value.
+ /**
+ * @dev Updates the daily limit value.
* @param _newLimit uint256 to represent the new limit.
*/
function setDailyLimit(uint256 _newLimit) onlymanyowners(keccak256(msg.data)) external {
_setDailyLimit(_newLimit);
}
- /**
+ /**
* @dev Resets the value spent to enable more spending
*/
function resetSpentToday() onlymanyowners(keccak256(msg.data)) external {
@@ -108,7 +108,7 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
// INTERNAL METHODS
- /**
+ /**
* @dev Clears the list of transactions pending approval.
*/
function clearPending() internal {
diff --git a/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol b/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol
index d4066812..98c8c3d4 100644
--- a/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol
+++ b/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol
@@ -12,7 +12,7 @@ contract CappedCrowdsale is Crowdsale {
uint256 public cap;
- constructor(uint256 _cap) {
+ constructor(uint256 _cap) public {
cap = _cap;
}
diff --git a/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol b/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol
index 1f148a74..51eeb7b8 100644
--- a/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol
+++ b/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol
@@ -4,11 +4,11 @@ import '../token/MintableToken.sol';
import '../math/SafeMath.sol';
/**
- * @title Crowdsale
+ * @title Crowdsale
* @dev Crowdsale is a base contract for managing a token crowdsale.
* Crowdsales have a start and end block, where investors can make
* token purchases and the crowdsale will assign them tokens based
- * on a token per ETH rate. Funds collected are forwarded to a wallet
+ * on a token per ETH rate. Funds collected are forwarded to a wallet
* as they arrive.
*/
contract Crowdsale {
@@ -36,11 +36,11 @@ contract Crowdsale {
* @param beneficiary who got the tokens
* @param value weis paid for purchase
* @param amount amount of tokens purchased
- */
+ */
event TokenPurchase(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
- constructor(uint256 _startBlock, uint256 _endBlock, uint256 _rate, address _wallet) {
+ constructor(uint256 _startBlock, uint256 _endBlock, uint256 _rate, address _wallet) public {
require(_startBlock >= block.number);
require(_endBlock >= _startBlock);
require(_rate > 0);
@@ -53,7 +53,7 @@ contract Crowdsale {
wallet = _wallet;
}
- // creates the token to be sold.
+ // creates the token to be sold.
// override this method to have crowdsale of a specific mintable token.
function createTokenContract() internal returns (MintableToken) {
return new MintableToken();
@@ -66,7 +66,7 @@ contract Crowdsale {
}
// low level token purchase function
- function buyTokens(address beneficiary) payable {
+ function buyTokens(address beneficiary) public payable {
require(beneficiary != address(0x0));
require(validPurchase());
diff --git a/test/compilationTests/zeppelin/crowdsale/FinalizableCrowdsale.sol b/test/compilationTests/zeppelin/crowdsale/FinalizableCrowdsale.sol
index 7965a66d..da4e3b7f 100644
--- a/test/compilationTests/zeppelin/crowdsale/FinalizableCrowdsale.sol
+++ b/test/compilationTests/zeppelin/crowdsale/FinalizableCrowdsale.sol
@@ -18,7 +18,7 @@ contract FinalizableCrowdsale is Crowdsale, Ownable {
// should be called after crowdsale ends, to do
// some extra finalization work
- function finalize() onlyOwner {
+ function finalize() public onlyOwner {
require(!isFinalized);
require(hasEnded());
diff --git a/test/compilationTests/zeppelin/crowdsale/RefundVault.sol b/test/compilationTests/zeppelin/crowdsale/RefundVault.sol
index 0be45ec4..19346c42 100644
--- a/test/compilationTests/zeppelin/crowdsale/RefundVault.sol
+++ b/test/compilationTests/zeppelin/crowdsale/RefundVault.sol
@@ -22,31 +22,31 @@ contract RefundVault is Ownable {
event RefundsEnabled();
event Refunded(address indexed beneficiary, uint256 weiAmount);
- constructor(address _wallet) {
+ constructor(address _wallet) public {
require(_wallet != address(0x0));
wallet = _wallet;
state = State.Active;
}
- function deposit(address investor) onlyOwner payable {
+ function deposit(address investor) public onlyOwner payable {
require(state == State.Active);
deposited[investor] = deposited[investor].add(msg.value);
}
- function close() onlyOwner {
+ function close() public onlyOwner {
require(state == State.Active);
state = State.Closed;
emit Closed();
wallet.transfer(this.balance);
}
- function enableRefunds() onlyOwner {
+ function enableRefunds() public onlyOwner {
require(state == State.Active);
state = State.Refunding;
emit RefundsEnabled();
}
- function refund(address investor) {
+ function refund(address investor) public {
require(state == State.Refunding);
uint256 depositedValue = deposited[investor];
deposited[investor] = 0;
diff --git a/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol b/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol
index bb6b5e17..94e3af99 100644
--- a/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol
+++ b/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol
@@ -21,7 +21,7 @@ contract RefundableCrowdsale is FinalizableCrowdsale {
// refund vault used to hold funds while crowdsale is running
RefundVault public vault;
- constructor(uint256 _goal) {
+ constructor(uint256 _goal) public {
vault = new RefundVault(wallet);
goal = _goal;
}
@@ -34,7 +34,7 @@ contract RefundableCrowdsale is FinalizableCrowdsale {
}
// if crowdsale is unsuccessful, investors can claim refunds here
- function claimRefund() {
+ function claimRefund() public {
require(isFinalized);
require(!goalReached());
diff --git a/test/compilationTests/zeppelin/lifecycle/Destructible.sol b/test/compilationTests/zeppelin/lifecycle/Destructible.sol
index 00492590..5b0e9f58 100644
--- a/test/compilationTests/zeppelin/lifecycle/Destructible.sol
+++ b/test/compilationTests/zeppelin/lifecycle/Destructible.sol
@@ -10,16 +10,16 @@ import "../ownership/Ownable.sol";
*/
contract Destructible is Ownable {
- constructor() payable { }
+ constructor() public payable { }
/**
* @dev Transfers the current balance to the owner and terminates the contract.
*/
- function destroy() onlyOwner {
+ function destroy() public onlyOwner {
selfdestruct(owner);
}
- function destroyAndSend(address _recipient) onlyOwner {
+ function destroyAndSend(address _recipient) public onlyOwner {
selfdestruct(_recipient);
}
}
diff --git a/test/compilationTests/zeppelin/lifecycle/Migrations.sol b/test/compilationTests/zeppelin/lifecycle/Migrations.sol
index d5b05308..4ca95d36 100644
--- a/test/compilationTests/zeppelin/lifecycle/Migrations.sol
+++ b/test/compilationTests/zeppelin/lifecycle/Migrations.sol
@@ -10,11 +10,11 @@ import '../ownership/Ownable.sol';
contract Migrations is Ownable {
uint256 public lastCompletedMigration;
- function setCompleted(uint256 completed) onlyOwner {
+ function setCompleted(uint256 completed) public onlyOwner {
lastCompletedMigration = completed;
}
- function upgrade(address newAddress) onlyOwner {
+ function upgrade(address newAddress) public onlyOwner {
Migrations upgraded = Migrations(newAddress);
upgraded.setCompleted(lastCompletedMigration);
}
diff --git a/test/compilationTests/zeppelin/lifecycle/Pausable.sol b/test/compilationTests/zeppelin/lifecycle/Pausable.sol
index 10b0fcd8..4ffd281a 100644
--- a/test/compilationTests/zeppelin/lifecycle/Pausable.sol
+++ b/test/compilationTests/zeppelin/lifecycle/Pausable.sol
@@ -34,7 +34,7 @@ contract Pausable is Ownable {
/**
* @dev called by the owner to pause, triggers stopped state
*/
- function pause() onlyOwner whenNotPaused returns (bool) {
+ function pause() public onlyOwner whenNotPaused returns (bool) {
paused = true;
emit Pause();
return true;
@@ -43,7 +43,7 @@ contract Pausable is Ownable {
/**
* @dev called by the owner to unpause, returns to normal state
*/
- function unpause() onlyOwner whenPaused returns (bool) {
+ function unpause() public onlyOwner whenPaused returns (bool) {
paused = false;
emit Unpause();
return true;
diff --git a/test/compilationTests/zeppelin/lifecycle/TokenDestructible.sol b/test/compilationTests/zeppelin/lifecycle/TokenDestructible.sol
index f88a55aa..0b19eb71 100644
--- a/test/compilationTests/zeppelin/lifecycle/TokenDestructible.sol
+++ b/test/compilationTests/zeppelin/lifecycle/TokenDestructible.sol
@@ -12,7 +12,7 @@ import "../token/ERC20Basic.sol";
*/
contract TokenDestructible is Ownable {
- constructor() payable { }
+ constructor() public payable { }
/**
* @notice Terminate contract and refund to owner
@@ -21,7 +21,7 @@ contract TokenDestructible is Ownable {
* @notice The called token contracts could try to re-enter this contract. Only
supply token contracts you trust.
*/
- function destroy(address[] tokens) onlyOwner {
+ function destroy(address[] tokens) public onlyOwner {
// Transfer tokens to owner
for(uint256 i = 0; i < tokens.length; i++) {
diff --git a/test/compilationTests/zeppelin/ownership/Claimable.sol b/test/compilationTests/zeppelin/ownership/Claimable.sol
index 14d0ac6a..72390411 100644
--- a/test/compilationTests/zeppelin/ownership/Claimable.sol
+++ b/test/compilationTests/zeppelin/ownership/Claimable.sol
@@ -26,14 +26,14 @@ contract Claimable is Ownable {
* @dev Allows the current owner to set the pendingOwner address.
* @param newOwner The address to transfer ownership to.
*/
- function transferOwnership(address newOwner) onlyOwner {
+ function transferOwnership(address newOwner) public onlyOwner {
pendingOwner = newOwner;
}
/**
* @dev Allows the pendingOwner address to finalize the transfer.
*/
- function claimOwnership() onlyPendingOwner {
+ function claimOwnership() public onlyPendingOwner {
owner = pendingOwner;
pendingOwner = address(0x0);
}
diff --git a/test/compilationTests/zeppelin/ownership/Contactable.sol b/test/compilationTests/zeppelin/ownership/Contactable.sol
index 0db3ee07..11b0e1dd 100644
--- a/test/compilationTests/zeppelin/ownership/Contactable.sol
+++ b/test/compilationTests/zeppelin/ownership/Contactable.sol
@@ -15,7 +15,7 @@ contract Contactable is Ownable{
* @dev Allows the owner to set a string with their contact information.
* @param info The contact information to attach to the contract.
*/
- function setContactInformation(string info) onlyOwner{
+ function setContactInformation(string info) public onlyOwner{
contactInformation = info;
}
}
diff --git a/test/compilationTests/zeppelin/ownership/DelayedClaimable.sol b/test/compilationTests/zeppelin/ownership/DelayedClaimable.sol
index 93177dc6..f019d2f1 100644
--- a/test/compilationTests/zeppelin/ownership/DelayedClaimable.sol
+++ b/test/compilationTests/zeppelin/ownership/DelayedClaimable.sol
@@ -20,7 +20,7 @@ contract DelayedClaimable is Claimable {
* @param _start The earliest time ownership can be claimed.
* @param _end The latest time ownership can be claimed.
*/
- function setLimits(uint256 _start, uint256 _end) onlyOwner {
+ function setLimits(uint256 _start, uint256 _end) public onlyOwner {
if (_start > _end)
throw;
end = _end;
@@ -32,7 +32,7 @@ contract DelayedClaimable is Claimable {
* @dev Allows the pendingOwner address to finalize the transfer, as long as it is called within
* the specified start and end time.
*/
- function claimOwnership() onlyPendingOwner {
+ function claimOwnership() public onlyPendingOwner {
if ((block.number > end) || (block.number < start))
throw;
owner = pendingOwner;
diff --git a/test/compilationTests/zeppelin/ownership/HasNoEther.sol b/test/compilationTests/zeppelin/ownership/HasNoEther.sol
index 8f9edc03..ffd1d76f 100644
--- a/test/compilationTests/zeppelin/ownership/HasNoEther.sol
+++ b/test/compilationTests/zeppelin/ownership/HasNoEther.sol
@@ -21,7 +21,7 @@ contract HasNoEther is Ownable {
* constructor. By doing it this way we prevent a payable constructor from working. Alternatively
* we could use assembly to access msg.value.
*/
- constructor() payable {
+ constructor() public payable {
if(msg.value > 0) {
throw;
}
diff --git a/test/compilationTests/zeppelin/ownership/Multisig.sol b/test/compilationTests/zeppelin/ownership/Multisig.sol
index 76c78411..25531d8d 100644
--- a/test/compilationTests/zeppelin/ownership/Multisig.sol
+++ b/test/compilationTests/zeppelin/ownership/Multisig.sol
@@ -24,5 +24,5 @@ contract Multisig {
// TODO: document
function changeOwner(address _from, address _to) external;
function execute(address _to, uint256 _value, bytes _data) external returns (bytes32);
- function confirm(bytes32 _h) returns (bool);
+ function confirm(bytes32 _h) public returns (bool);
}
diff --git a/test/compilationTests/zeppelin/ownership/Ownable.sol b/test/compilationTests/zeppelin/ownership/Ownable.sol
index 0a2257d6..7417b2bd 100644
--- a/test/compilationTests/zeppelin/ownership/Ownable.sol
+++ b/test/compilationTests/zeppelin/ownership/Ownable.sol
@@ -14,7 +14,7 @@ contract Ownable {
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
- constructor() {
+ constructor() public {
owner = msg.sender;
}
@@ -34,7 +34,7 @@ contract Ownable {
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
- function transferOwnership(address newOwner) onlyOwner {
+ function transferOwnership(address newOwner) public onlyOwner {
if (newOwner != address(0)) {
owner = newOwner;
}
diff --git a/test/compilationTests/zeppelin/ownership/Shareable.sol b/test/compilationTests/zeppelin/ownership/Shareable.sol
index c954052b..d44f63b8 100644
--- a/test/compilationTests/zeppelin/ownership/Shareable.sol
+++ b/test/compilationTests/zeppelin/ownership/Shareable.sol
@@ -59,7 +59,7 @@ contract Shareable {
* @param _owners A list of owners.
* @param _required The amount required for a transaction to be approved.
*/
- constructor(address[] _owners, uint256 _required) {
+ constructor(address[] _owners, uint256 _required) public {
owners[1] = msg.sender;
ownerIndex[msg.sender] = 1;
for (uint256 i = 0; i < _owners.length; ++i) {
@@ -105,7 +105,7 @@ contract Shareable {
* @param _addr address The address which you want to check.
* @return True if the address is an owner and fase otherwise.
*/
- function isOwner(address _addr) view returns (bool) {
+ function isOwner(address _addr) public view returns (bool) {
return ownerIndex[_addr] > 0;
}
@@ -115,7 +115,7 @@ contract Shareable {
* @param _owner The owner address.
* @return True if the owner has confirmed and false otherwise.
*/
- function hasConfirmed(bytes32 _operation, address _owner) view returns (bool) {
+ function hasConfirmed(bytes32 _operation, address _owner) public view returns (bool) {
PendingState memory pending = pendings[_operation];
uint256 index = ownerIndex[_owner];
diff --git a/test/compilationTests/zeppelin/payment/PullPayment.sol b/test/compilationTests/zeppelin/payment/PullPayment.sol
index ba710b53..6db7df78 100644
--- a/test/compilationTests/zeppelin/payment/PullPayment.sol
+++ b/test/compilationTests/zeppelin/payment/PullPayment.sol
@@ -28,7 +28,7 @@ contract PullPayment {
/**
* @dev withdraw accumulated balance, called by payee.
*/
- function withdrawPayments() {
+ function withdrawPayments() public {
address payee = msg.sender;
uint256 payment = payments[payee];
diff --git a/test/compilationTests/zeppelin/token/BasicToken.sol b/test/compilationTests/zeppelin/token/BasicToken.sol
index 8a3d8ead..bc085f85 100644
--- a/test/compilationTests/zeppelin/token/BasicToken.sol
+++ b/test/compilationTests/zeppelin/token/BasicToken.sol
@@ -19,7 +19,7 @@ contract BasicToken is ERC20Basic {
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
*/
- function transfer(address _to, uint256 _value) {
+ function transfer(address _to, uint256 _value) public {
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
@@ -30,7 +30,7 @@ contract BasicToken is ERC20Basic {
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
- function balanceOf(address _owner) view returns (uint256 balance) {
+ function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
diff --git a/test/compilationTests/zeppelin/token/ERC20.sol b/test/compilationTests/zeppelin/token/ERC20.sol
index ae5aa624..5b5dc748 100644
--- a/test/compilationTests/zeppelin/token/ERC20.sol
+++ b/test/compilationTests/zeppelin/token/ERC20.sol
@@ -9,8 +9,8 @@ import './ERC20Basic.sol';
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 is ERC20Basic {
- function allowance(address owner, address spender) view returns (uint256);
- function transferFrom(address from, address to, uint256 value);
- function approve(address spender, uint256 value);
+ function allowance(address owner, address spender) public view returns (uint256);
+ function transferFrom(address from, address to, uint256 value) public;
+ function approve(address spender, uint256 value) public;
event Approval(address indexed owner, address indexed spender, uint256 value);
}
diff --git a/test/compilationTests/zeppelin/token/ERC20Basic.sol b/test/compilationTests/zeppelin/token/ERC20Basic.sol
index 94fb7bcf..fbe33134 100644
--- a/test/compilationTests/zeppelin/token/ERC20Basic.sol
+++ b/test/compilationTests/zeppelin/token/ERC20Basic.sol
@@ -8,7 +8,7 @@ pragma solidity ^0.4.11;
*/
contract ERC20Basic {
uint256 public totalSupply;
- function balanceOf(address who) view returns (uint256);
- function transfer(address to, uint256 value);
+ function balanceOf(address who) public view returns (uint256);
+ function transfer(address to, uint256 value) public;
event Transfer(address indexed from, address indexed to, uint256 value);
}
diff --git a/test/compilationTests/zeppelin/token/LimitedTransferToken.sol b/test/compilationTests/zeppelin/token/LimitedTransferToken.sol
index 0ccd60b2..5a056f78 100644
--- a/test/compilationTests/zeppelin/token/LimitedTransferToken.sol
+++ b/test/compilationTests/zeppelin/token/LimitedTransferToken.sol
@@ -32,7 +32,7 @@ contract LimitedTransferToken is ERC20 {
* @param _to The address that will recieve the tokens.
* @param _value The amount of tokens to be transferred.
*/
- function transfer(address _to, uint256 _value) canTransfer(msg.sender, _value) {
+ function transfer(address _to, uint256 _value) canTransfer(msg.sender, _value) public {
super.transfer(_to, _value);
}
@@ -42,7 +42,7 @@ contract LimitedTransferToken is ERC20 {
* @param _to The address that will recieve the tokens.
* @param _value The amount of tokens to be transferred.
*/
- function transferFrom(address _from, address _to, uint256 _value) canTransfer(_from, _value) {
+ function transferFrom(address _from, address _to, uint256 _value) public canTransfer(_from, _value) {
super.transferFrom(_from, _to, _value);
}
diff --git a/test/compilationTests/zeppelin/token/MintableToken.sol b/test/compilationTests/zeppelin/token/MintableToken.sol
index 45926afb..4c4787e3 100644
--- a/test/compilationTests/zeppelin/token/MintableToken.sol
+++ b/test/compilationTests/zeppelin/token/MintableToken.sol
@@ -31,7 +31,7 @@ contract MintableToken is StandardToken, Ownable {
* @param _amount The amount of tokens to mint.
* @return A boolean that indicates if the operation was successful.
*/
- function mint(address _to, uint256 _amount) onlyOwner canMint returns (bool) {
+ function mint(address _to, uint256 _amount) public onlyOwner canMint returns (bool) {
totalSupply = totalSupply.add(_amount);
balances[_to] = balances[_to].add(_amount);
emit Mint(_to, _amount);
@@ -42,7 +42,7 @@ contract MintableToken is StandardToken, Ownable {
* @dev Function to stop minting new tokens.
* @return True if the operation was successful.
*/
- function finishMinting() onlyOwner returns (bool) {
+ function finishMinting() public onlyOwner returns (bool) {
mintingFinished = true;
emit MintFinished();
return true;
diff --git a/test/compilationTests/zeppelin/token/PausableToken.sol b/test/compilationTests/zeppelin/token/PausableToken.sol
index 8ee114e1..66f80b80 100644
--- a/test/compilationTests/zeppelin/token/PausableToken.sol
+++ b/test/compilationTests/zeppelin/token/PausableToken.sol
@@ -11,11 +11,11 @@ import '../lifecycle/Pausable.sol';
contract PausableToken is StandardToken, Pausable {
- function transfer(address _to, uint _value) whenNotPaused {
+ function transfer(address _to, uint _value) public whenNotPaused {
super.transfer(_to, _value);
}
- function transferFrom(address _from, address _to, uint _value) whenNotPaused {
+ function transferFrom(address _from, address _to, uint _value) public whenNotPaused {
super.transferFrom(_from, _to, _value);
}
}
diff --git a/test/compilationTests/zeppelin/token/SimpleToken.sol b/test/compilationTests/zeppelin/token/SimpleToken.sol
index a4ba9eb3..d0232bca 100644
--- a/test/compilationTests/zeppelin/token/SimpleToken.sol
+++ b/test/compilationTests/zeppelin/token/SimpleToken.sol
@@ -20,7 +20,7 @@ contract SimpleToken is StandardToken {
/**
* @dev Contructor that gives msg.sender all of existing tokens.
*/
- constructor() {
+ constructor() public {
totalSupply = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
diff --git a/test/compilationTests/zeppelin/token/StandardToken.sol b/test/compilationTests/zeppelin/token/StandardToken.sol
index 900a9102..a55d961c 100644
--- a/test/compilationTests/zeppelin/token/StandardToken.sol
+++ b/test/compilationTests/zeppelin/token/StandardToken.sol
@@ -23,7 +23,7 @@ contract StandardToken is ERC20, BasicToken {
* @param _to address The address which you want to transfer to
* @param _value uint256 the amout of tokens to be transfered
*/
- function transferFrom(address _from, address _to, uint256 _value) {
+ function transferFrom(address _from, address _to, uint256 _value) public {
uint256 _allowance = allowed[_from][msg.sender];
// Check is not needed because sub(_allowance, _value) will already throw if this condition is not met
@@ -40,7 +40,7 @@ contract StandardToken is ERC20, BasicToken {
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
- function approve(address _spender, uint256 _value) {
+ function approve(address _spender, uint256 _value) public {
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(_spender, 0)` if it is not
@@ -58,7 +58,7 @@ contract StandardToken is ERC20, BasicToken {
* @param _spender address The address which will spend the funds.
* @return A uint256 specifing the amount of tokens still avaible for the spender.
*/
- function allowance(address _owner, address _spender) view returns (uint256 remaining) {
+ function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowed[_owner][_spender];
}
diff --git a/test/compilationTests/zeppelin/token/TokenTimelock.sol b/test/compilationTests/zeppelin/token/TokenTimelock.sol
index e9f998ba..fa1af025 100644
--- a/test/compilationTests/zeppelin/token/TokenTimelock.sol
+++ b/test/compilationTests/zeppelin/token/TokenTimelock.sol
@@ -19,7 +19,7 @@ contract TokenTimelock {
// timestamp when token release is enabled
uint releaseTime;
- constructor(ERC20Basic _token, address _beneficiary, uint _releaseTime) {
+ constructor(ERC20Basic _token, address _beneficiary, uint _releaseTime) public {
require(_releaseTime > now);
token = _token;
beneficiary = _beneficiary;
@@ -29,7 +29,7 @@ contract TokenTimelock {
/**
* @dev beneficiary claims tokens held by time lock
*/
- function claim() {
+ function claim() public {
require(msg.sender == beneficiary);
require(now >= releaseTime);
diff --git a/test/compilationTests/zeppelin/token/VestedToken.sol b/test/compilationTests/zeppelin/token/VestedToken.sol
index 3953612d..17141bdf 100644
--- a/test/compilationTests/zeppelin/token/VestedToken.sol
+++ b/test/compilationTests/zeppelin/token/VestedToken.sol
@@ -130,7 +130,7 @@ contract VestedToken is StandardToken, LimitedTransferToken {
* @param _holder The holder of the grants.
* @return A uint256 representing the total amount of grants.
*/
- function tokenGrantsCount(address _holder) view returns (uint256 index) {
+ function tokenGrantsCount(address _holder) public view returns (uint256 index) {
return grants[_holder].length;
}
@@ -163,7 +163,7 @@ contract VestedToken is StandardToken, LimitedTransferToken {
uint256 time,
uint256 start,
uint256 cliff,
- uint256 vesting) view returns (uint256)
+ uint256 vesting) public view returns (uint256)
{
// Shortcuts for before cliff and after vesting cases.
if (time < cliff) return 0;
@@ -192,7 +192,7 @@ contract VestedToken is StandardToken, LimitedTransferToken {
* @return Returns all the values that represent a TokenGrant(address, value, start, cliff,
* revokability, burnsOnRevoke, and vesting) plus the vested value at the current time.
*/
- function tokenGrant(address _holder, uint256 _grantId) view returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) {
+ function tokenGrant(address _holder, uint256 _grantId) public view returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) {
TokenGrant grant = grants[_holder][_grantId];
granter = grant.granter;
diff --git a/test/libjulia/Parser.cpp b/test/libjulia/Parser.cpp
index 07154718..3f329d28 100644
--- a/test/libjulia/Parser.cpp
+++ b/test/libjulia/Parser.cpp
@@ -267,7 +267,7 @@ BOOST_AUTO_TEST_CASE(recursion_depth)
BOOST_AUTO_TEST_CASE(multiple_assignment)
{
CHECK_ERROR("{ let x:u256 function f() -> a:u256, b:u256 {} 123:u256, x := f() }", ParserError, "Label name / variable name must precede \",\" (multiple assignment).");
- CHECK_ERROR("{ let x:u256 function f() -> a:u256, b:u256 {} x, 123:u256 := f() }", ParserError, "Variable name expected in multiple assignemnt.");
+ CHECK_ERROR("{ let x:u256 function f() -> a:u256, b:u256 {} x, 123:u256 := f() }", ParserError, "Variable name expected in multiple assignment.");
/// NOTE: Travis hiccups if not having a variable
char const* text = R"(
diff --git a/test/libsolidity/ABIDecoderTests.cpp b/test/libsolidity/ABIDecoderTests.cpp
index b4f829ca..6504f6bc 100644
--- a/test/libsolidity/ABIDecoderTests.cpp
+++ b/test/libsolidity/ABIDecoderTests.cpp
@@ -285,7 +285,7 @@ BOOST_AUTO_TEST_CASE(decode_from_memory_simple)
contract C {
uint public _a;
uint[] public _b;
- constructor(uint a, uint[] b) {
+ constructor(uint a, uint[] b) public {
_a = a;
_b = b;
}
@@ -310,24 +310,24 @@ BOOST_AUTO_TEST_CASE(decode_function_type)
string sourceCode = R"(
contract D {
function () external returns (uint) public _a;
- constructor(function () external returns (uint) a) {
+ constructor(function () external returns (uint) a) public {
_a = a;
}
}
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
return 3;
}
- function g(function () external returns (uint) _f) returns (uint) {
+ function g(function () external returns (uint) _f) public returns (uint) {
return _f();
}
// uses "decode from memory"
- function test1() returns (uint) {
+ function test1() public returns (uint) {
D d = new D(this.f);
return d._a()();
}
// uses "decode from calldata"
- function test2() returns (uint) {
+ function test2() public returns (uint) {
return this.g(this.f);
}
}
@@ -344,13 +344,13 @@ BOOST_AUTO_TEST_CASE(decode_function_type_array)
string sourceCode = R"(
contract D {
function () external returns (uint)[] public _a;
- constructor(function () external returns (uint)[] a) {
+ constructor(function () external returns (uint)[] a) public {
_a = a;
}
}
contract E {
function () external returns (uint)[3] public _a;
- constructor(function () external returns (uint)[3] a) {
+ constructor(function () external returns (uint)[3] a) public {
_a = a;
}
}
@@ -412,7 +412,7 @@ BOOST_AUTO_TEST_CASE(decode_from_memory_complex)
uint public _a;
uint[] public _b;
bytes[2] public _c;
- constructor(uint a, uint[] b, bytes[2] c) {
+ constructor(uint a, uint[] b, bytes[2] c) public {
_a = a;
_b = b;
_c = c;
diff --git a/test/libsolidity/ASTJSON.cpp b/test/libsolidity/ASTJSON.cpp
index 5d5b14e8..03e74097 100644
--- a/test/libsolidity/ASTJSON.cpp
+++ b/test/libsolidity/ASTJSON.cpp
@@ -44,7 +44,7 @@ BOOST_AUTO_TEST_SUITE(SolidityASTJSON)
BOOST_AUTO_TEST_CASE(short_type_name)
{
CompilerStack c;
- c.addSource("a", "contract c { function f() { uint[] memory x; } }");
+ c.addSource("a", "contract c { function f() public { uint[] memory x; } }");
c.setEVMVersion(dev::test::Options::get().evmVersion());
c.parseAndAnalyze();
map<string, unsigned> sourceIndices;
@@ -59,7 +59,7 @@ BOOST_AUTO_TEST_CASE(short_type_name)
BOOST_AUTO_TEST_CASE(short_type_name_ref)
{
CompilerStack c;
- c.addSource("a", "contract c { function f() { uint[][] memory rows; } }");
+ c.addSource("a", "contract c { function f() public { uint[][] memory rows; } }");
c.setEVMVersion(dev::test::Options::get().evmVersion());
c.parseAndAnalyze();
map<string, unsigned> sourceIndices;
diff --git a/test/libsolidity/ASTLegacyJSON.cpp b/test/libsolidity/ASTLegacyJSON.cpp
index cd8384ea..69cb1bb9 100644
--- a/test/libsolidity/ASTLegacyJSON.cpp
+++ b/test/libsolidity/ASTLegacyJSON.cpp
@@ -124,7 +124,7 @@ BOOST_AUTO_TEST_CASE(enum_value)
BOOST_AUTO_TEST_CASE(modifier_definition)
{
CompilerStack c;
- c.addSource("a", "contract C { modifier M(uint i) { _; } function F() M(1) {} }");
+ c.addSource("a", "contract C { modifier M(uint i) { _; } function F() M(1) public {} }");
c.setEVMVersion(dev::test::Options::get().evmVersion());
c.parseAndAnalyze();
map<string, unsigned> sourceIndices;
@@ -139,7 +139,7 @@ BOOST_AUTO_TEST_CASE(modifier_definition)
BOOST_AUTO_TEST_CASE(modifier_invocation)
{
CompilerStack c;
- c.addSource("a", "contract C { modifier M(uint i) { _; } function F() M(1) {} }");
+ c.addSource("a", "contract C { modifier M(uint i) { _; } function F() M(1) public {} }");
c.setEVMVersion(dev::test::Options::get().evmVersion());
c.parseAndAnalyze();
map<string, unsigned> sourceIndices;
@@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE(array_type_name)
BOOST_AUTO_TEST_CASE(short_type_name)
{
CompilerStack c;
- c.addSource("a", "contract c { function f() { uint[] memory x; } }");
+ c.addSource("a", "contract c { function f() public { uint[] memory x; } }");
c.setEVMVersion(dev::test::Options::get().evmVersion());
c.parseAndAnalyze();
map<string, unsigned> sourceIndices;
@@ -202,7 +202,7 @@ BOOST_AUTO_TEST_CASE(short_type_name)
BOOST_AUTO_TEST_CASE(short_type_name_ref)
{
CompilerStack c;
- c.addSource("a", "contract c { function f() { uint[][] memory rows; } }");
+ c.addSource("a", "contract c { function f() public { uint[][] memory rows; } }");
c.setEVMVersion(dev::test::Options::get().evmVersion());
c.parseAndAnalyze();
map<string, unsigned> sourceIndices;
@@ -230,7 +230,7 @@ BOOST_AUTO_TEST_CASE(placeholder_statement)
BOOST_AUTO_TEST_CASE(non_utf8)
{
CompilerStack c;
- c.addSource("a", "contract C { function f() { var x = hex\"ff\"; } }");
+ c.addSource("a", "contract C { function f() public { var x = hex\"ff\"; } }");
c.setEVMVersion(dev::test::Options::get().evmVersion());
c.parseAndAnalyze();
map<string, unsigned> sourceIndices;
diff --git a/test/libsolidity/Assembly.cpp b/test/libsolidity/Assembly.cpp
index 7b3df043..e815d7d5 100644
--- a/test/libsolidity/Assembly.cpp
+++ b/test/libsolidity/Assembly.cpp
@@ -152,7 +152,7 @@ BOOST_AUTO_TEST_CASE(location_test)
{
char const* sourceCode = R"(
contract test {
- function f() returns (uint256 a) {
+ function f() public returns (uint256 a) {
return 16;
}
}
@@ -160,19 +160,19 @@ BOOST_AUTO_TEST_CASE(location_test)
AssemblyItems items = compileContract(sourceCode);
bool hasShifts = dev::test::Options::get().evmVersion().hasBitwiseShifting();
vector<SourceLocation> locations =
- vector<SourceLocation>(hasShifts ? 23 : 24, SourceLocation(2, 75, make_shared<string>(""))) +
- vector<SourceLocation>(2, SourceLocation(20, 72, make_shared<string>(""))) +
+ vector<SourceLocation>(hasShifts ? 23 : 24, SourceLocation(2, 82, make_shared<string>(""))) +
+ vector<SourceLocation>(2, SourceLocation(20, 79, make_shared<string>(""))) +
vector<SourceLocation>(1, SourceLocation(8, 17, make_shared<string>("--CODEGEN--"))) +
vector<SourceLocation>(3, SourceLocation(5, 7, make_shared<string>("--CODEGEN--"))) +
vector<SourceLocation>(1, SourceLocation(30, 31, make_shared<string>("--CODEGEN--"))) +
vector<SourceLocation>(1, SourceLocation(27, 28, make_shared<string>("--CODEGEN--"))) +
vector<SourceLocation>(1, SourceLocation(20, 32, make_shared<string>("--CODEGEN--"))) +
vector<SourceLocation>(1, SourceLocation(5, 7, make_shared<string>("--CODEGEN--"))) +
- vector<SourceLocation>(24, SourceLocation(20, 72, make_shared<string>(""))) +
- vector<SourceLocation>(1, SourceLocation(42, 51, make_shared<string>(""))) +
- vector<SourceLocation>(1, SourceLocation(65, 67, make_shared<string>(""))) +
- vector<SourceLocation>(2, SourceLocation(58, 67, make_shared<string>(""))) +
- vector<SourceLocation>(2, SourceLocation(20, 72, make_shared<string>("")));
+ vector<SourceLocation>(24, SourceLocation(20, 79, make_shared<string>(""))) +
+ vector<SourceLocation>(1, SourceLocation(49, 58, make_shared<string>(""))) +
+ vector<SourceLocation>(1, SourceLocation(72, 74, make_shared<string>(""))) +
+ vector<SourceLocation>(2, SourceLocation(65, 74, make_shared<string>(""))) +
+ vector<SourceLocation>(2, SourceLocation(20, 79, make_shared<string>("")));
checkAssemblyLocations(items, locations);
}
diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp
index 3046372f..a9ce6e49 100644
--- a/test/libsolidity/InlineAssembly.cpp
+++ b/test/libsolidity/InlineAssembly.cpp
@@ -461,7 +461,7 @@ BOOST_AUTO_TEST_CASE(recursion_depth)
BOOST_AUTO_TEST_CASE(multiple_assignment)
{
CHECK_PARSE_ERROR("{ let x function f() -> a, b {} 123, x := f() }", ParserError, "Label name / variable name must precede \",\" (multiple assignment).");
- CHECK_PARSE_ERROR("{ let x function f() -> a, b {} x, 123 := f() }", ParserError, "Variable name expected in multiple assignemnt.");
+ CHECK_PARSE_ERROR("{ let x function f() -> a, b {} x, 123 := f() }", ParserError, "Variable name expected in multiple assignment.");
/// NOTE: Travis hiccups if not having a variable
char const* text = R"(
diff --git a/test/libsolidity/JSONCompiler.cpp b/test/libsolidity/LibSolc.cpp
index 2b3df3a7..9d5ffa27 100644
--- a/test/libsolidity/JSONCompiler.cpp
+++ b/test/libsolidity/LibSolc.cpp
@@ -16,7 +16,7 @@
*/
/**
* @date 2017
- * Unit tests for solc/jsonCompiler.cpp.
+ * Unit tests for libsolc/libsolc.cpp.
*/
#include <string>
@@ -70,7 +70,7 @@ Json::Value compile(string const& _input)
} // end anonymous namespace
-BOOST_AUTO_TEST_SUITE(JSONCompiler)
+BOOST_AUTO_TEST_SUITE(LibSolc)
BOOST_AUTO_TEST_CASE(read_version)
{
@@ -201,6 +201,26 @@ BOOST_AUTO_TEST_CASE(standard_compilation)
BOOST_CHECK(result.isMember("contracts"));
}
+BOOST_AUTO_TEST_CASE(new_api)
+{
+ char const* input = R"(
+ {
+ "language": "Solidity",
+ "sources": {
+ "fileA": {
+ "content": "contract A { }"
+ }
+ }
+ }
+ )";
+ BOOST_CHECK_EQUAL(string(version()), string(solidity_version()));
+ BOOST_CHECK_EQUAL(string(license()), string(solidity_license()));
+ BOOST_CHECK_EQUAL(
+ string(compileStandard(input, nullptr)),
+ string(solidity_compile(input, nullptr))
+ );
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/SolidityABIJSON.cpp b/test/libsolidity/SolidityABIJSON.cpp
index 6994a290..c366e866 100644
--- a/test/libsolidity/SolidityABIJSON.cpp
+++ b/test/libsolidity/SolidityABIJSON.cpp
@@ -68,7 +68,7 @@ BOOST_AUTO_TEST_CASE(basic_test)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns(uint d) { return a * 7; }
+ function f(uint a) public returns (uint d) { return a * 7; }
}
)";
@@ -111,8 +111,8 @@ BOOST_AUTO_TEST_CASE(multiple_methods)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns(uint d) { return a * 7; }
- function g(uint b) returns(uint e) { return b * 8; }
+ function f(uint a) public returns (uint d) { return a * 7; }
+ function g(uint b) public returns (uint e) { return b * 8; }
}
)";
@@ -164,7 +164,7 @@ BOOST_AUTO_TEST_CASE(multiple_params)
{
char const* sourceCode = R"(
contract test {
- function f(uint a, uint b) returns(uint d) { return a + b; }
+ function f(uint a, uint b) public returns (uint d) { return a + b; }
}
)";
@@ -202,8 +202,8 @@ BOOST_AUTO_TEST_CASE(multiple_methods_order)
// methods are expected to be in alpabetical order
char const* sourceCode = R"(
contract test {
- function f(uint a) returns(uint d) { return a * 7; }
- function c(uint b) returns(uint e) { return b * 8; }
+ function f(uint a) public returns (uint d) { return a * 7; }
+ function c(uint b) public returns (uint e) { return b * 8; }
}
)";
@@ -255,7 +255,7 @@ BOOST_AUTO_TEST_CASE(view_function)
{
char const* sourceCode = R"(
contract test {
- function foo(uint a, uint b) returns(uint d) { return a + b; }
+ function foo(uint a, uint b) public returns (uint d) { return a + b; }
function boo(uint32 a) view returns(uint b) { return a * 4; }
}
)";
@@ -310,7 +310,7 @@ BOOST_AUTO_TEST_CASE(pure_function)
{
char const* sourceCode = R"(
contract test {
- function foo(uint a, uint b) returns(uint d) { return a + b; }
+ function foo(uint a, uint b) public returns (uint d) { return a + b; }
function boo(uint32 a) pure returns(uint b) { return a * 4; }
}
)";
@@ -365,7 +365,7 @@ BOOST_AUTO_TEST_CASE(events)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns(uint d) { return a * 7; }
+ function f(uint a) public returns (uint d) { return a * 7; }
event e1(uint b, address indexed c);
event e2();
event e2(uint a);
@@ -463,11 +463,11 @@ BOOST_AUTO_TEST_CASE(inherited)
{
char const* sourceCode = R"(
contract Base {
- function baseFunction(uint p) returns (uint i) { return p; }
+ function baseFunction(uint p) public returns (uint i) { return p; }
event baseEvent(bytes32 indexed evtArgBase);
}
contract Derived is Base {
- function derivedFunction(bytes32 p) returns (bytes32 i) { return p; }
+ function derivedFunction(bytes32 p) public returns (bytes32 i) { return p; }
event derivedEvent(uint indexed evtArgDerived);
}
)";
@@ -537,7 +537,7 @@ BOOST_AUTO_TEST_CASE(empty_name_input_parameter_with_named_one)
{
char const* sourceCode = R"(
contract test {
- function f(uint, uint k) returns(uint ret_k, uint ret_g) {
+ function f(uint, uint k) public returns (uint ret_k, uint ret_g) {
uint g = 8;
ret_k = k;
ret_g = g;
@@ -582,7 +582,7 @@ BOOST_AUTO_TEST_CASE(empty_name_return_parameter)
{
char const* sourceCode = R"(
contract test {
- function f(uint k) returns(uint) {
+ function f(uint k) public returns (uint) {
return k;
}
}
@@ -683,7 +683,7 @@ BOOST_AUTO_TEST_CASE(return_param_in_abi)
contract test {
enum ActionChoices { GoLeft, GoRight, GoStraight, Sit }
constructor(ActionChoices param) {}
- function ret() returns(ActionChoices) {
+ function ret() public returns (ActionChoices) {
ActionChoices action = ActionChoices.GoLeft;
return action;
}
@@ -756,7 +756,7 @@ BOOST_AUTO_TEST_CASE(library_function)
char const* sourceCode = R"(
library test {
struct StructType { uint a; }
- function f(StructType storage b, uint[] storage c, test d) returns (uint[] e, StructType storage f) {}
+ function f(StructType storage b, uint[] storage c, test d) public returns (uint[] e, StructType storage f) {}
}
)";
@@ -891,7 +891,7 @@ BOOST_AUTO_TEST_CASE(return_structs)
contract C {
struct S { uint a; T[] sub; }
struct T { uint[2] x; }
- function f() returns (uint x, S s) {
+ function f() public returns (uint x, S s) {
}
}
)";
@@ -940,7 +940,7 @@ BOOST_AUTO_TEST_CASE(return_structs_with_contracts)
pragma experimental ABIEncoderV2;
contract C {
struct S { C[] x; C y; }
- function f() returns (S s, C c) {
+ function f() public returns (S s, C c) {
}
}
)";
diff --git a/test/libsolidity/SolidityCompiler.cpp b/test/libsolidity/SolidityCompiler.cpp
index 3348bac5..0cc80dd8 100644
--- a/test/libsolidity/SolidityCompiler.cpp
+++ b/test/libsolidity/SolidityCompiler.cpp
@@ -38,7 +38,7 @@ BOOST_AUTO_TEST_CASE(does_not_include_creation_time_only_internal_functions)
char const* sourceCode = R"(
contract C {
uint x;
- constructor() { f(); }
+ constructor() public { f(); }
function f() internal { for (uint i = 0; i < 10; ++i) x += 3 + i; }
}
)";
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 9e6aa43d..822b8192 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -72,7 +72,7 @@ BOOST_AUTO_TEST_CASE(smoke_test)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns(uint d) { return a * 7; }
+ function f(uint a) public returns(uint d) { return a * 7; }
}
)";
compileAndRun(sourceCode);
@@ -92,7 +92,7 @@ BOOST_AUTO_TEST_CASE(exp_operator)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns(uint d) { return 2 ** a; }
+ function f(uint a) public returns(uint d) { return 2 ** a; }
}
)";
compileAndRun(sourceCode);
@@ -103,7 +103,7 @@ BOOST_AUTO_TEST_CASE(exp_operator_const)
{
char const* sourceCode = R"(
contract test {
- function f() returns(uint d) { return 2 ** 3; }
+ function f() public returns(uint d) { return 2 ** 3; }
}
)";
compileAndRun(sourceCode);
@@ -114,7 +114,7 @@ BOOST_AUTO_TEST_CASE(exp_operator_const_signed)
{
char const* sourceCode = R"(
contract test {
- function f() returns(int d) { return (-2) ** 3; }
+ function f() public returns(int d) { return (-2) ** 3; }
}
)";
compileAndRun(sourceCode);
@@ -125,7 +125,7 @@ BOOST_AUTO_TEST_CASE(exp_zero)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns(uint d) { return a ** 0; }
+ function f(uint a) public returns(uint d) { return a ** 0; }
}
)";
compileAndRun(sourceCode);
@@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(exp_zero_literal)
{
char const* sourceCode = R"(
contract test {
- function f() returns(uint d) { return 0 ** 0; }
+ function f() public returns(uint d) { return 0 ** 0; }
}
)";
compileAndRun(sourceCode);
@@ -148,7 +148,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_true_literal)
{
char const* sourceCode = R"(
contract test {
- function f() returns(uint d) {
+ function f() public returns(uint d) {
return true ? 5 : 10;
}
}
@@ -161,7 +161,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_false_literal)
{
char const* sourceCode = R"(
contract test {
- function f() returns(uint d) {
+ function f() public returns(uint d) {
return false ? 5 : 10;
}
}
@@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_multiple)
{
char const* sourceCode = R"(
contract test {
- function f(uint x) returns(uint d) {
+ function f(uint x) public returns(uint d) {
return x > 100 ?
x > 1000 ? 1000 : 100
:
@@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_with_return_values)
{
char const* sourceCode = R"(
contract test {
- function f(bool cond, uint v) returns (uint a, uint b) {
+ function f(bool cond, uint v) public returns (uint a, uint b) {
cond ? a = v : b = v;
}
}
@@ -208,7 +208,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_storage_memory_1)
char const* sourceCode = R"(
contract test {
bytes2[2] data1;
- function f(bool cond) returns (uint) {
+ function f(bool cond) public returns (uint) {
bytes2[2] memory x;
x[0] = "aa";
bytes2[2] memory y;
@@ -241,7 +241,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_storage_memory_2)
char const* sourceCode = R"(
contract test {
bytes2[2] data1;
- function f(bool cond) returns (uint) {
+ function f(bool cond) public returns (uint) {
data1[0] = "cc";
bytes2[2] memory x;
@@ -274,7 +274,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_different_types)
{
char const* sourceCode = R"(
contract test {
- function f(bool cond) returns (uint) {
+ function f(bool cond) public returns (uint) {
uint8 x = 0xcd;
uint16 y = 0xabab;
return cond ? x : y;
@@ -291,7 +291,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_string_literal)
{
char const* sourceCode = R"(
contract test {
- function f(bool cond) returns (bytes32) {
+ function f(bool cond) public returns (bytes32) {
return cond ? "true" : "false";
}
}
@@ -306,7 +306,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_tuples)
{
char const* sourceCode = R"(
contract test {
- function f(bool cond) returns (uint, uint) {
+ function f(bool cond) public returns (uint, uint) {
return cond ? (1, 2) : (3, 4);
}
}
@@ -320,10 +320,10 @@ BOOST_AUTO_TEST_CASE(conditional_expression_functions)
{
char const* sourceCode = R"(
contract test {
- function x() returns (uint) { return 1; }
- function y() returns (uint) { return 2; }
+ function x() public returns (uint) { return 1; }
+ function y() public returns (uint) { return 2; }
- function f(bool cond) returns (uint) {
+ function f(bool cond) public returns (uint) {
function () returns (uint) z = cond ? x : y;
return z();
}
@@ -386,7 +386,7 @@ BOOST_AUTO_TEST_CASE(recursive_calls)
{
char const* sourceCode = R"(
contract test {
- function f(uint n) returns(uint nfac) {
+ function f(uint n) public returns(uint nfac) {
if (n <= 1) return 1;
else return n * f(n - 1);
}
@@ -408,10 +408,10 @@ BOOST_AUTO_TEST_CASE(multiple_functions)
{
char const* sourceCode = R"(
contract test {
- function a() returns(uint n) { return 0; }
- function b() returns(uint n) { return 1; }
- function c() returns(uint n) { return 2; }
- function f() returns(uint n) { return 3; }
+ function a() public returns(uint n) { return 0; }
+ function b() public returns(uint n) { return 1; }
+ function c() public returns(uint n) { return 2; }
+ function f() public returns(uint n) { return 3; }
}
)";
compileAndRun(sourceCode);
@@ -426,8 +426,8 @@ BOOST_AUTO_TEST_CASE(named_args)
{
char const* sourceCode = R"(
contract test {
- function a(uint a, uint b, uint c) returns (uint r) { r = a * 100 + b * 10 + c * 1; }
- function b() returns (uint r) { r = a({a: 1, b: 2, c: 3}); }
+ function a(uint a, uint b, uint c) public returns (uint r) { r = a * 100 + b * 10 + c * 1; }
+ function b() public returns (uint r) { r = a({a: 1, b: 2, c: 3}); }
}
)";
compileAndRun(sourceCode);
@@ -438,8 +438,8 @@ BOOST_AUTO_TEST_CASE(disorder_named_args)
{
char const* sourceCode = R"(
contract test {
- function a(uint a, uint b, uint c) returns (uint r) { r = a * 100 + b * 10 + c * 1; }
- function b() returns (uint r) { r = a({c: 3, a: 1, b: 2}); }
+ function a(uint a, uint b, uint c) public returns (uint r) { r = a * 100 + b * 10 + c * 1; }
+ function b() public returns (uint r) { r = a({c: 3, a: 1, b: 2}); }
}
)";
compileAndRun(sourceCode);
@@ -450,7 +450,7 @@ BOOST_AUTO_TEST_CASE(while_loop)
{
char const* sourceCode = R"(
contract test {
- function f(uint n) returns(uint nfac) {
+ function f(uint n) public returns(uint nfac) {
nfac = 1;
uint i = 2;
while (i <= n) nfac *= i++;
@@ -477,7 +477,7 @@ BOOST_AUTO_TEST_CASE(do_while_loop)
{
char const* sourceCode = R"(
contract test {
- function f(uint n) returns(uint nfac) {
+ function f(uint n) public returns(uint nfac) {
nfac = 1;
uint i = 2;
do { nfac *= i++; } while (i <= n);
@@ -528,7 +528,7 @@ BOOST_AUTO_TEST_CASE(nested_loops)
// tests that break and continue statements in nested loops jump to the correct place
char const* sourceCode = R"(
contract test {
- function f(uint x) returns(uint y) {
+ function f(uint x) public returns(uint y) {
while (x > 1) {
if (x == 10) break;
while (x > 5) {
@@ -578,7 +578,7 @@ BOOST_AUTO_TEST_CASE(for_loop)
{
char const* sourceCode = R"(
contract test {
- function f(uint n) returns(uint nfac) {
+ function f(uint n) public returns(uint nfac) {
nfac = 1;
uint i;
for (i = 2; i <= n; i++)
@@ -603,7 +603,7 @@ BOOST_AUTO_TEST_CASE(for_loop_empty)
{
char const* sourceCode = R"(
contract test {
- function f() returns(uint ret) {
+ function f() public returns(uint ret) {
ret = 1;
for (;;) {
ret += 1;
@@ -632,7 +632,7 @@ BOOST_AUTO_TEST_CASE(for_loop_simple_init_expr)
{
char const* sourceCode = R"(
contract test {
- function f(uint n) returns(uint nfac) {
+ function f(uint n) public returns(uint nfac) {
nfac = 1;
uint256 i;
for (i = 2; i <= n; i++)
@@ -658,7 +658,7 @@ BOOST_AUTO_TEST_CASE(for_loop_break_continue)
{
char const* sourceCode = R"(
contract test {
- function f(uint n) returns (uint r)
+ function f(uint n) public returns (uint r)
{
uint i = 1;
uint k = 0;
@@ -704,16 +704,16 @@ BOOST_AUTO_TEST_CASE(calling_other_functions)
{
char const* sourceCode = R"(
contract collatz {
- function run(uint x) returns(uint y) {
+ function run(uint x) public returns(uint y) {
while ((y = x) > 1) {
if (x % 2 == 0) x = evenStep(x);
else x = oddStep(x);
}
}
- function evenStep(uint x) returns(uint y) {
+ function evenStep(uint x) public returns(uint y) {
return x / 2;
}
- function oddStep(uint x) returns(uint y) {
+ function oddStep(uint x) public returns(uint y) {
return 3 * x + 1;
}
}
@@ -754,7 +754,7 @@ BOOST_AUTO_TEST_CASE(many_local_variables)
{
char const* sourceCode = R"(
contract test {
- function run(uint x1, uint x2, uint x3) returns(uint y) {
+ function run(uint x1, uint x2, uint x3) public returns(uint y) {
uint8 a = 0x1; uint8 b = 0x10; uint16 c = 0x100;
y = a + b + c + x1 + x2 + x3;
y += b + x2;
@@ -777,7 +777,7 @@ BOOST_AUTO_TEST_CASE(packing_unpacking_types)
{
char const* sourceCode = R"(
contract test {
- function run(bool a, uint32 b, uint64 c) returns(uint256 y) {
+ function run(bool a, uint32 b, uint64 c) public returns(uint256 y) {
if (a) y = 1;
y = y * 0x100000000 | ~b;
y = y * 0x10000000000000000 | ~c;
@@ -795,7 +795,7 @@ BOOST_AUTO_TEST_CASE(packing_signed_types)
{
char const* sourceCode = R"(
contract test {
- function run() returns(int8 y) {
+ function run() public returns(int8 y) {
uint8 x = 0xfa;
return int8(x);
}
@@ -812,7 +812,7 @@ BOOST_AUTO_TEST_CASE(multiple_return_values)
{
char const* sourceCode = R"(
contract test {
- function run(bool x1, uint x2) returns(uint y1, bool y2, uint y3) {
+ function run(bool x1, uint x2) public returns(uint y1, bool y2, uint y3) {
y1 = x2; y2 = x1;
}
}
@@ -825,7 +825,7 @@ BOOST_AUTO_TEST_CASE(short_circuiting)
{
char const* sourceCode = R"(
contract test {
- function run(uint x) returns(uint y) {
+ function run(uint x) public returns(uint y) {
x == 0 || ((x = 8) > 0);
return x;
}
@@ -846,7 +846,7 @@ BOOST_AUTO_TEST_CASE(high_bits_cleaning)
{
char const* sourceCode = R"(
contract test {
- function run() returns(uint256 y) {
+ function run() public returns(uint256 y) {
uint32 t = uint32(0xffffffff);
uint32 x = t + 10;
if (x >= 0xffffffff) return 0;
@@ -870,7 +870,7 @@ BOOST_AUTO_TEST_CASE(sign_extension)
{
char const* sourceCode = R"(
contract test {
- function run() returns(uint256 y) {
+ function run() public returns(uint256 y) {
int64 x = -int32(0xff);
if (x >= 0xff) return 0;
return -uint256(x);
@@ -892,7 +892,7 @@ BOOST_AUTO_TEST_CASE(small_unsigned_types)
{
char const* sourceCode = R"(
contract test {
- function run() returns(uint256 y) {
+ function run() public returns(uint256 y) {
uint32 t = uint32(0xffffff);
uint32 x = t * 0xffffff;
return x / 0x100;
@@ -913,7 +913,7 @@ BOOST_AUTO_TEST_CASE(small_signed_types)
{
char const* sourceCode = R"(
contract test {
- function run() returns(int256 y) {
+ function run() public returns(int256 y) {
return -int32(10) * -int64(20);
}
}
@@ -930,10 +930,10 @@ BOOST_AUTO_TEST_CASE(strings)
{
char const* sourceCode = R"(
contract test {
- function fixedBytes() returns(bytes32 ret) {
+ function fixedBytes() public returns(bytes32 ret) {
return "abc\x00\xff__";
}
- function pipeThrough(bytes2 small, bool one) returns(bytes16 large, bool oneRet) {
+ function pipeThrough(bytes2 small, bool one) public returns(bytes16 large, bool oneRet) {
oneRet = one;
large = small;
}
@@ -950,7 +950,7 @@ BOOST_AUTO_TEST_CASE(inc_dec_operators)
contract test {
uint8 x;
uint v;
- function f() returns (uint r) {
+ function f() public returns (uint r) {
uint a = 6;
r = a;
r += (a++) * 0x10;
@@ -969,7 +969,7 @@ BOOST_AUTO_TEST_CASE(bytes_comparison)
{
char const* sourceCode = R"(
contract test {
- function f() returns (bool) {
+ function f() public returns (bool) {
bytes2 a = "a";
bytes2 x = "aa";
bytes2 b = "b";
@@ -987,7 +987,7 @@ BOOST_AUTO_TEST_CASE(state_smoke_test)
contract test {
uint256 value1;
uint256 value2;
- function get(uint8 which) returns (uint256 value) {
+ function get(uint8 which) public returns (uint256 value) {
if (which == 0) return value1;
else return value2;
}
@@ -1014,7 +1014,7 @@ BOOST_AUTO_TEST_CASE(compound_assign)
contract test {
uint value1;
uint value2;
- function f(uint x, uint y) returns (uint w) {
+ function f(uint x, uint y) public returns (uint w) {
uint value3 = y;
value1 += x;
value3 *= x;
@@ -1050,7 +1050,7 @@ BOOST_AUTO_TEST_CASE(simple_mapping)
char const* sourceCode = R"(
contract test {
mapping(uint8 => uint8) table;
- function get(uint8 k) returns (uint8 v) {
+ function get(uint8 k) public returns (uint8 v) {
return table[k];
}
function set(uint8 k, uint8 v) {
@@ -1084,13 +1084,13 @@ BOOST_AUTO_TEST_CASE(mapping_state)
mapping(address => bool) canVote;
mapping(address => uint) voteCount;
mapping(address => bool) voted;
- function getVoteCount(address addr) returns (uint retVoteCount) {
+ function getVoteCount(address addr) public returns (uint retVoteCount) {
return voteCount[addr];
}
function grantVoteRight(address addr) {
canVote[addr] = true;
}
- function vote(address voter, address vote) returns (bool success) {
+ function vote(address voter, address vote) public returns (bool success) {
if (!canVote[voter] || voted[voter]) return false;
voted[voter] = true;
voteCount[vote] = voteCount[vote] + 1;
@@ -1160,7 +1160,7 @@ BOOST_AUTO_TEST_CASE(mapping_state_inc_dec)
contract test {
uint value;
mapping(uint => uint) table;
- function f(uint x) returns (uint y) {
+ function f(uint x) public returns (uint y) {
value = x;
if (x > 0) table[++value] = 8;
if (x > 1) value--;
@@ -1192,7 +1192,7 @@ BOOST_AUTO_TEST_CASE(multi_level_mapping)
char const* sourceCode = R"(
contract test {
mapping(uint => mapping(uint => uint)) table;
- function f(uint x, uint y, uint z) returns (uint w) {
+ function f(uint x, uint y, uint z) public returns (uint w) {
if (z == 0) return table[x][y];
else return table[x][y] = z;
}
@@ -1230,7 +1230,7 @@ BOOST_AUTO_TEST_CASE(structs)
mapping(uint8 => s2) recursive;
}
s2 data;
- function check() returns (bool ok) {
+ function check() public returns (bool ok) {
return data.z == 1 && data.s1data.x == 2 &&
data.s1data.y == true &&
data.recursive[3].recursive[4].z == 5 &&
@@ -1238,7 +1238,7 @@ BOOST_AUTO_TEST_CASE(structs)
data.recursive[0].s1data.y == false &&
data.recursive[4].z == 9;
}
- function set() {
+ function set() public {
data.z = 1;
data.s1data.x = 2;
data.s1data.y = true;
@@ -1264,13 +1264,13 @@ BOOST_AUTO_TEST_CASE(struct_reference)
mapping(uint8 => s2) recursive;
}
s2 data;
- function check() returns (bool ok) {
+ function check() public returns (bool ok) {
return data.z == 2 &&
data.recursive[0].z == 3 &&
data.recursive[0].recursive[1].z == 0 &&
data.recursive[0].recursive[0].z == 1;
}
- function set() {
+ function set() public {
data.z = 2;
mapping(uint8 => s2) map = data.recursive;
s2 inner = map[0];
@@ -1312,19 +1312,19 @@ BOOST_AUTO_TEST_CASE(deleteStruct)
delete str;
delete toDelete;
}
- function getToDelete() returns (uint res){
+ function getToDelete() public returns (uint res){
res = toDelete;
}
- function getTopValue() returns(uint topValue){
+ function getTopValue() public returns(uint topValue){
topValue = str.topValue;
}
- function getNestedValue() returns(uint nestedValue){
+ function getNestedValue() public returns(uint nestedValue){
nestedValue = str.nstr.nestedValue;
}
- function getTopMapping(uint index) returns(uint ret) {
+ function getTopMapping(uint index) public returns(uint ret) {
ret = str.topMapping[index];
}
- function getNestedMapping(uint index) returns(bool ret) {
+ function getNestedMapping(uint index) public returns(bool ret) {
return str.nstr.nestedMapping[index];
}
}
@@ -1344,7 +1344,7 @@ BOOST_AUTO_TEST_CASE(deleteLocal)
{
char const* sourceCode = R"(
contract test {
- function delLocal() returns (uint res){
+ function delLocal() public returns (uint res){
uint v = 5;
delete v;
res = v;
@@ -1359,7 +1359,7 @@ BOOST_AUTO_TEST_CASE(deleteLocals)
{
char const* sourceCode = R"(
contract test {
- function delLocal() returns (uint res1, uint res2){
+ function delLocal() public returns (uint res1, uint res2){
uint v = 5;
uint w = 6;
uint x = 7;
@@ -1378,10 +1378,10 @@ BOOST_AUTO_TEST_CASE(constructor)
char const* sourceCode = R"(
contract test {
mapping(uint => uint) data;
- constructor() {
+ constructor() public {
data[7] = 8;
}
- function get(uint key) returns (uint value) {
+ function get(uint key) public returns (uint value) {
return data[key];
}
}
@@ -1402,7 +1402,7 @@ BOOST_AUTO_TEST_CASE(simple_accessor)
char const* sourceCode = R"(
contract test {
uint256 public data;
- constructor() {
+ constructor() public {
data = 8;
}
}
@@ -1421,7 +1421,7 @@ BOOST_AUTO_TEST_CASE(array_accessor)
struct st { uint a; uint[] finalArray; }
mapping(uint256 => mapping(uint256 => st[5])) public multiple_map;
- constructor() {
+ constructor() public {
data[0] = 8;
dynamicData.length = 3;
dynamicData[2] = 8;
@@ -1451,7 +1451,7 @@ BOOST_AUTO_TEST_CASE(accessors_mapping_for_array)
contract test {
mapping(uint => uint[8]) public data;
mapping(uint => uint[]) public dynamicData;
- constructor() {
+ constructor() public {
data[2][2] = 8;
dynamicData[2].length = 3;
dynamicData[2][2] = 8;
@@ -1473,7 +1473,7 @@ BOOST_AUTO_TEST_CASE(multiple_elementary_accessors)
bytes6 public name;
bytes32 public a_hash;
address public an_address;
- constructor() {
+ constructor() public {
data = 8;
name = "Celina";
a_hash = keccak256("\x7b");
@@ -1499,7 +1499,7 @@ BOOST_AUTO_TEST_CASE(complex_accessors)
mapping(uint256 => bool) public to_bool_map;
mapping(uint256 => uint256) public to_uint_map;
mapping(uint256 => mapping(uint256 => uint256)) public to_multiple_map;
- constructor() {
+ constructor() public {
to_string_map[42] = "24";
to_bool_map[42] = false;
to_uint_map[42] = 12;
@@ -1520,7 +1520,7 @@ BOOST_AUTO_TEST_CASE(struct_accessor)
contract test {
struct Data { uint a; uint8 b; mapping(uint => uint) c; bool d; }
mapping(uint => Data) public data;
- constructor() {
+ constructor() public {
data[7].a = 1;
data[7].b = 2;
data[7].c[0] = 3;
@@ -1536,8 +1536,8 @@ BOOST_AUTO_TEST_CASE(balance)
{
char const* sourceCode = R"(
contract test {
- constructor() payable {}
- function getBalance() returns (uint256 balance) {
+ constructor() public payable {}
+ function getBalance() public returns (uint256 balance) {
return address(this).balance;
}
}
@@ -1550,8 +1550,8 @@ BOOST_AUTO_TEST_CASE(blockchain)
{
char const* sourceCode = R"(
contract test {
- constructor() payable {}
- function someInfo() payable returns (uint256 value, address coinbase, uint256 blockNumber) {
+ constructor() public payable {}
+ function someInfo() public payable returns (uint256 value, address coinbase, uint256 blockNumber) {
value = msg.value;
coinbase = block.coinbase;
blockNumber = block.number;
@@ -1568,7 +1568,7 @@ BOOST_AUTO_TEST_CASE(msg_sig)
{
char const* sourceCode = R"(
contract test {
- function foo(uint256 a) returns (bytes4 value) {
+ function foo(uint256 a) public returns (bytes4 value) {
return msg.sig;
}
}
@@ -1581,10 +1581,10 @@ BOOST_AUTO_TEST_CASE(msg_sig_after_internal_call_is_same)
{
char const* sourceCode = R"(
contract test {
- function boo() returns (bytes4 value) {
+ function boo() public returns (bytes4 value) {
return msg.sig;
}
- function foo(uint256 a) returns (bytes4 value) {
+ function foo(uint256 a) public returns (bytes4 value) {
return boo();
}
}
@@ -1597,7 +1597,7 @@ BOOST_AUTO_TEST_CASE(now)
{
char const* sourceCode = R"(
contract test {
- function someInfo() returns (bool equal, uint val) {
+ function someInfo() public returns (bool equal, uint val) {
equal = block.timestamp == now;
val = now;
}
@@ -1620,7 +1620,7 @@ BOOST_AUTO_TEST_CASE(type_conversions_cleanup)
// integer should drop the first two bytes
char const* sourceCode = R"(
contract Test {
- function test() returns (uint ret) { return uint(address(Test(address(0x11223344556677889900112233445566778899001122)))); }
+ function test() public returns (uint ret) { return uint(address(Test(address(0x11223344556677889900112233445566778899001122)))); }
}
)";
compileAndRun(sourceCode);
@@ -1633,7 +1633,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_fixed_bytes_smaller_size)
{
char const* sourceCode = R"(
contract Test {
- function bytesToBytes(bytes4 input) returns (bytes2 ret) {
+ function bytesToBytes(bytes4 input) public returns (bytes2 ret) {
return bytes2(input);
}
}
@@ -1646,7 +1646,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_fixed_bytes_greater_size)
{
char const* sourceCode = R"(
contract Test {
- function bytesToBytes(bytes2 input) returns (bytes4 ret) {
+ function bytesToBytes(bytes2 input) public returns (bytes4 ret) {
return bytes4(input);
}
}
@@ -1659,7 +1659,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_fixed_bytes_same_size)
{
char const* sourceCode = R"(
contract Test {
- function bytesToBytes(bytes4 input) returns (bytes4 ret) {
+ function bytesToBytes(bytes4 input) public returns (bytes4 ret) {
return bytes4(input);
}
}
@@ -1673,7 +1673,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_uint_same_size)
{
char const* sourceCode = R"(
contract Test {
- function bytesToUint(bytes32 s) returns (uint256 h) {
+ function bytesToUint(bytes32 s) public returns (uint256 h) {
return uint(s);
}
}
@@ -1689,7 +1689,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_uint_same_min_size)
{
char const* sourceCode = R"(
contract Test {
- function bytesToUint(bytes1 s) returns (uint8 h) {
+ function bytesToUint(bytes1 s) public returns (uint8 h) {
return uint8(s);
}
}
@@ -1705,7 +1705,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_uint_smaller_size)
{
char const* sourceCode = R"(
contract Test {
- function bytesToUint(bytes4 s) returns (uint16 h) {
+ function bytesToUint(bytes4 s) public returns (uint16 h) {
return uint16(uint32(s));
}
}
@@ -1721,7 +1721,7 @@ BOOST_AUTO_TEST_CASE(convert_fixed_bytes_to_uint_greater_size)
{
char const* sourceCode = R"(
contract Test {
- function bytesToUint(bytes4 s) returns (uint64 h) {
+ function bytesToUint(bytes4 s) public returns (uint64 h) {
return uint64(uint32(s));
}
}
@@ -1738,7 +1738,7 @@ BOOST_AUTO_TEST_CASE(convert_uint_to_fixed_bytes_same_size)
{
char const* sourceCode = R"(
contract Test {
- function uintToBytes(uint256 h) returns (bytes32 s) {
+ function uintToBytes(uint256 h) public returns (bytes32 s) {
return bytes32(h);
}
}
@@ -1752,7 +1752,7 @@ BOOST_AUTO_TEST_CASE(convert_uint_to_fixed_bytes_same_min_size)
{
char const* sourceCode = R"(
contract Test {
- function UintToBytes(uint8 h) returns (bytes1 s) {
+ function UintToBytes(uint8 h) public returns (bytes1 s) {
return bytes1(h);
}
}
@@ -1768,7 +1768,7 @@ BOOST_AUTO_TEST_CASE(convert_uint_to_fixed_bytes_smaller_size)
{
char const* sourceCode = R"(
contract Test {
- function uintToBytes(uint32 h) returns (bytes2 s) {
+ function uintToBytes(uint32 h) public returns (bytes2 s) {
return bytes2(uint16(h));
}
}
@@ -1784,7 +1784,7 @@ BOOST_AUTO_TEST_CASE(convert_uint_to_fixed_bytes_greater_size)
{
char const* sourceCode = R"(
contract Test {
- function UintToBytes(uint16 h) returns (bytes8 s) {
+ function UintToBytes(uint16 h) public returns (bytes8 s) {
return bytes8(uint64(h));
}
}
@@ -1800,8 +1800,8 @@ BOOST_AUTO_TEST_CASE(send_ether)
{
char const* sourceCode = R"(
contract test {
- constructor() payable {}
- function a(address addr, uint amount) returns (uint ret) {
+ constructor() payable public {}
+ function a(address addr, uint amount) public returns (uint ret) {
addr.send(amount);
return address(this).balance;
}
@@ -1818,8 +1818,8 @@ BOOST_AUTO_TEST_CASE(transfer_ether)
{
char const* sourceCode = R"(
contract A {
- constructor() payable {}
- function a(address addr, uint amount) returns (uint) {
+ constructor() public payable {}
+ function a(address addr, uint amount) public returns (uint) {
addr.transfer(amount);
return this.balance;
}
@@ -1856,7 +1856,7 @@ BOOST_AUTO_TEST_CASE(uncalled_blockhash)
contract C {
function f() public view returns (bytes32)
{
- return (block.blockhash)(block.number - 1);
+ return (blockhash)(block.number - 1);
}
}
)";
@@ -1882,7 +1882,7 @@ BOOST_AUTO_TEST_CASE(log0)
{
char const* sourceCode = R"(
contract test {
- function a() {
+ function a() public {
log0(1);
}
}
@@ -1899,7 +1899,7 @@ BOOST_AUTO_TEST_CASE(log1)
{
char const* sourceCode = R"(
contract test {
- function a() {
+ function a() public {
log1(1, 2);
}
}
@@ -1917,7 +1917,7 @@ BOOST_AUTO_TEST_CASE(log2)
{
char const* sourceCode = R"(
contract test {
- function a() {
+ function a() public {
log2(1, 2, 3);
}
}
@@ -1936,7 +1936,7 @@ BOOST_AUTO_TEST_CASE(log3)
{
char const* sourceCode = R"(
contract test {
- function a() {
+ function a() public {
log3(1, 2, 3, 4);
}
}
@@ -1955,7 +1955,7 @@ BOOST_AUTO_TEST_CASE(log4)
{
char const* sourceCode = R"(
contract test {
- function a() {
+ function a() public {
log4(1, 2, 3, 4, 5);
}
}
@@ -1974,7 +1974,7 @@ BOOST_AUTO_TEST_CASE(log_in_constructor)
{
char const* sourceCode = R"(
contract test {
- constructor() {
+ constructor() public {
log1(1, 2);
}
}
@@ -1991,8 +1991,8 @@ BOOST_AUTO_TEST_CASE(selfdestruct)
{
char const* sourceCode = R"(
contract test {
- constructor() payable {}
- function a(address receiver) returns (uint ret) {
+ constructor() public payable {}
+ function a(address receiver) public returns (uint ret) {
selfdestruct(receiver);
return 10;
}
@@ -2010,7 +2010,7 @@ BOOST_AUTO_TEST_CASE(keccak256)
{
char const* sourceCode = R"(
contract test {
- function a(bytes32 input) returns (bytes32 hash) {
+ function a(bytes32 input) public returns (bytes32 hash) {
return keccak256(abi.encodePacked(input));
}
}
@@ -2029,7 +2029,7 @@ BOOST_AUTO_TEST_CASE(sha256)
{
char const* sourceCode = R"(
contract test {
- function a(bytes32 input) returns (bytes32 sha256hash) {
+ function a(bytes32 input) public returns (bytes32 sha256hash) {
return sha256(abi.encodePacked(input));
}
}
@@ -2054,7 +2054,7 @@ BOOST_AUTO_TEST_CASE(ripemd)
{
char const* sourceCode = R"(
contract test {
- function a(bytes32 input) returns (bytes32 sha256hash) {
+ function a(bytes32 input) public returns (bytes32 sha256hash) {
return ripemd160(abi.encodePacked(input));
}
}
@@ -2079,7 +2079,7 @@ BOOST_AUTO_TEST_CASE(packed_keccak256)
{
char const* sourceCode = R"(
contract test {
- function a(bytes32 input) returns (bytes32 hash) {
+ function a(bytes32 input) public returns (bytes32 hash) {
uint24 b = 65536;
uint c = 256;
return keccak256(abi.encodePacked(8, input, b, input, c));
@@ -2107,7 +2107,7 @@ BOOST_AUTO_TEST_CASE(packed_keccak256_complex_types)
char const* sourceCode = R"(
contract test {
uint120[3] x;
- function f() returns (bytes32 hash1, bytes32 hash2, bytes32 hash3) {
+ function f() public returns (bytes32 hash1, bytes32 hash2, bytes32 hash3) {
uint120[] memory y = new uint120[](3);
x[0] = y[0] = uint120(-2);
x[1] = y[1] = uint120(-3);
@@ -2131,7 +2131,7 @@ BOOST_AUTO_TEST_CASE(packed_sha256)
{
char const* sourceCode = R"(
contract test {
- function a(bytes32 input) returns (bytes32 hash) {
+ function a(bytes32 input) public returns (bytes32 hash) {
uint24 b = 65536;
uint c = 256;
return sha256(abi.encodePacked(8, input, b, input, c));
@@ -2158,7 +2158,7 @@ BOOST_AUTO_TEST_CASE(packed_ripemd160)
{
char const* sourceCode = R"(
contract test {
- function a(bytes32 input) returns (bytes32 hash) {
+ function a(bytes32 input) public returns (bytes32 hash) {
uint24 b = 65536;
uint c = 256;
return ripemd160(abi.encodePacked(8, input, b, input, c));
@@ -2185,7 +2185,7 @@ BOOST_AUTO_TEST_CASE(ecrecover)
{
char const* sourceCode = R"(
contract test {
- function a(bytes32 h, uint8 v, bytes32 r, bytes32 s) returns (address addr) {
+ function a(bytes32 h, uint8 v, bytes32 r, bytes32 s) public returns (address addr) {
return ecrecover(h, v, r, s);
}
}
@@ -2203,16 +2203,16 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls)
{
char const* sourceCode = R"(
contract Helper {
- function multiply(uint a, uint b) returns (uint c) {
+ function multiply(uint a, uint b) public returns (uint c) {
return a * b;
}
}
contract Main {
Helper h;
- function callHelper(uint a, uint b) returns (uint c) {
+ function callHelper(uint a, uint b) public returns (uint c) {
return h.multiply(a, b);
}
- function getHelper() returns (address haddress) {
+ function getHelper() public returns (address haddress) {
return address(h);
}
function setHelper(address haddress) {
@@ -2234,16 +2234,16 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls_with_complex_parameters)
{
char const* sourceCode = R"(
contract Helper {
- function sel(uint a, bool select, uint b) returns (uint c) {
+ function sel(uint a, bool select, uint b) public returns (uint c) {
if (select) return a; else return b;
}
}
contract Main {
Helper h;
- function callHelper(uint a, bool select, uint b) returns (uint c) {
+ function callHelper(uint a, bool select, uint b) public returns (uint c) {
return h.sel(a, select, b) * 3;
}
- function getHelper() returns (address haddress) {
+ function getHelper() public returns (address haddress) {
return address(h);
}
function setHelper(address haddress) {
@@ -2266,16 +2266,16 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls_accessing_this)
{
char const* sourceCode = R"(
contract Helper {
- function getAddress() returns (address addr) {
+ function getAddress() public returns (address addr) {
return address(this);
}
}
contract Main {
Helper h;
- function callHelper() returns (address addr) {
+ function callHelper() public returns (address addr) {
return h.getAddress();
}
- function getHelper() returns (address addr) {
+ function getHelper() public returns (address addr) {
return address(h);
}
function setHelper(address addr) {
@@ -2295,19 +2295,19 @@ BOOST_AUTO_TEST_CASE(calls_to_this)
{
char const* sourceCode = R"(
contract Helper {
- function invoke(uint a, uint b) returns (uint c) {
+ function invoke(uint a, uint b) public returns (uint c) {
return this.multiply(a, b, 10);
}
- function multiply(uint a, uint b, uint8 c) returns (uint ret) {
+ function multiply(uint a, uint b, uint8 c) public returns (uint ret) {
return a * b + c;
}
}
contract Main {
Helper h;
- function callHelper(uint a, uint b) returns (uint ret) {
+ function callHelper(uint a, uint b) public returns (uint ret) {
return h.invoke(a, b);
}
- function getHelper() returns (address addr) {
+ function getHelper() public returns (address addr) {
return address(h);
}
function setHelper(address addr) {
@@ -2331,18 +2331,18 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls_with_local_vars)
// so this tests correct stack slot allocation
char const* sourceCode = R"(
contract Helper {
- function multiply(uint a, uint b) returns (uint c) {
+ function multiply(uint a, uint b) public returns (uint c) {
return a * b;
}
}
contract Main {
Helper h;
- function callHelper(uint a, uint b) returns (uint c) {
+ function callHelper(uint a, uint b) public returns (uint c) {
uint8 y = 9;
uint256 ret = h.multiply(a, b);
return ret + y;
}
- function getHelper() returns (address haddress) {
+ function getHelper() public returns (address haddress) {
return address(h);
}
function setHelper(address haddress) {
@@ -2364,16 +2364,16 @@ BOOST_AUTO_TEST_CASE(fixed_bytes_in_calls)
{
char const* sourceCode = R"(
contract Helper {
- function invoke(bytes3 x, bool stop) returns (bytes4 ret) {
+ function invoke(bytes3 x, bool stop) public returns (bytes4 ret) {
return x;
}
}
contract Main {
Helper h;
- function callHelper(bytes2 x, bool stop) returns (bytes5 ret) {
+ function callHelper(bytes2 x, bool stop) public returns (bytes5 ret) {
return h.invoke(x, stop);
}
- function getHelper() returns (address addr) {
+ function getHelper() public returns (address addr) {
return address(h);
}
function setHelper(address addr) {
@@ -2396,20 +2396,20 @@ BOOST_AUTO_TEST_CASE(constructor_arguments_internal)
bytes3 name;
bool flag;
- constructor(bytes3 x, bool f) {
+ constructor(bytes3 x, bool f) public {
name = x;
flag = f;
}
- function getName() returns (bytes3 ret) { return name; }
- function getFlag() returns (bool ret) { return flag; }
+ function getName() public returns (bytes3 ret) { return name; }
+ function getFlag() public returns (bool ret) { return flag; }
}
contract Main {
Helper h;
- constructor() {
+ constructor() public {
h = new Helper("abc", true);
}
- function getFlag() returns (bool ret) { return h.getFlag(); }
- function getName() returns (bytes3 ret) { return h.getName(); }
+ function getFlag() public returns (bool ret) { return h.getFlag(); }
+ function getName() public returns (bytes3 ret) { return h.getName(); }
}
)";
compileAndRun(sourceCode, 0, "Main");
@@ -2424,12 +2424,12 @@ BOOST_AUTO_TEST_CASE(constructor_arguments_external)
bytes3 name;
bool flag;
- constructor(bytes3 x, bool f) {
+ constructor(bytes3 x, bool f) public {
name = x;
flag = f;
}
- function getName() returns (bytes3 ret) { return name; }
- function getFlag() returns (bool ret) { return flag; }
+ function getName() public returns (bytes3 ret) { return name; }
+ function getFlag() public returns (bool ret) { return flag; }
}
)";
compileAndRun(sourceCode, 0, "Main", encodeArgs("abc", true));
@@ -2444,7 +2444,7 @@ BOOST_AUTO_TEST_CASE(constructor_with_long_arguments)
string public a;
string public b;
- constructor(string _a, string _b) {
+ constructor(string _a, string _b) public {
a = _a;
b = _b;
}
@@ -2472,7 +2472,7 @@ BOOST_AUTO_TEST_CASE(constructor_static_array_argument)
uint public a;
uint[3] public b;
- constructor(uint _a, uint[3] _b) {
+ constructor(uint _a, uint[3] _b) public {
a = _a;
b = _b;
}
@@ -2492,7 +2492,7 @@ BOOST_AUTO_TEST_CASE(constant_var_as_array_length)
uint constant LEN = 3;
uint[LEN] public a;
- constructor(uint[LEN] _a) {
+ constructor(uint[LEN] _a) public {
a = _a;
}
}
@@ -2509,10 +2509,10 @@ BOOST_AUTO_TEST_CASE(functions_called_by_constructor)
contract Test {
bytes3 name;
bool flag;
- constructor() {
+ constructor() public {
setName("abc");
}
- function getName() returns (bytes3 ret) { return name; }
+ function getName() public returns (bytes3 ret) { return name; }
function setName(bytes3 _name) private { name = _name; }
}
)";
@@ -2528,8 +2528,8 @@ BOOST_AUTO_TEST_CASE(contracts_as_addresses)
}
contract test {
helper h;
- constructor() payable { h = new helper(); h.send(5); }
- function getBalance() returns (uint256 myBalance, uint256 helperBalance) {
+ constructor() public payable { h = new helper(); h.send(5); }
+ function getBalance() public returns (uint256 myBalance, uint256 helperBalance) {
myBalance = this.balance;
helperBalance = h.balance;
}
@@ -2545,23 +2545,23 @@ BOOST_AUTO_TEST_CASE(gas_and_value_basic)
char const* sourceCode = R"(
contract helper {
bool flag;
- function getBalance() payable returns (uint256 myBalance) {
+ function getBalance() payable public returns (uint256 myBalance) {
return this.balance;
}
- function setFlag() { flag = true; }
- function getFlag() returns (bool fl) { return flag; }
+ function setFlag() public { flag = true; }
+ function getFlag() public returns (bool fl) { return flag; }
}
contract test {
helper h;
- constructor() payable { h = new helper(); }
- function sendAmount(uint amount) payable returns (uint256 bal) {
+ constructor() public payable { h = new helper(); }
+ function sendAmount(uint amount) public payable returns (uint256 bal) {
return h.getBalance.value(amount)();
}
- function outOfGas() returns (bool ret) {
+ function outOfGas() public returns (bool ret) {
h.setFlag.gas(2)(); // should fail due to OOG
return true;
}
- function checkState() returns (bool flagAfter, uint myBal) {
+ function checkState() public returns (bool flagAfter, uint myBal) {
flagAfter = h.getFlag();
myBal = this.balance;
}
@@ -2578,13 +2578,13 @@ BOOST_AUTO_TEST_CASE(value_complex)
{
char const* sourceCode = R"(
contract helper {
- function getBalance() payable returns (uint256 myBalance) {
+ function getBalance() payable public returns (uint256 myBalance) {
return this.balance;
}
}
contract test {
helper h;
- constructor() payable { h = new helper(); }
+ constructor() public payable { h = new helper(); }
function sendAmount(uint amount) payable returns (uint256 bal) {
uint someStackElement = 20;
return h.getBalance.value(amount).gas(1000).value(amount + 3)();
@@ -2599,14 +2599,14 @@ BOOST_AUTO_TEST_CASE(value_insane)
{
char const* sourceCode = R"(
contract helper {
- function getBalance() payable returns (uint256 myBalance) {
+ function getBalance() payable public returns (uint256 myBalance) {
return this.balance;
}
}
contract test {
helper h;
- constructor() payable { h = new helper(); }
- function sendAmount(uint amount) returns (uint256 bal) {
+ constructor() public payable { h = new helper(); }
+ function sendAmount(uint amount) public returns (uint256 bal) {
return h.getBalance.value(amount).gas(1000).value(amount + 3)();// overwrite value
}
}
@@ -2625,17 +2625,17 @@ BOOST_AUTO_TEST_CASE(value_for_constructor)
name = x;
flag = f;
}
- function getName() returns (bytes3 ret) { return name; }
- function getFlag() returns (bool ret) { return flag; }
+ function getName() public returns (bytes3 ret) { return name; }
+ function getFlag() public returns (bool ret) { return flag; }
}
contract Main {
Helper h;
constructor() payable {
h = (new Helper).value(10)("abc", true);
}
- 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;}
+ function getFlag() public returns (bool ret) { return h.getFlag(); }
+ function getName() public returns (bytes3 ret) { return h.getName(); }
+ function getBalances() public returns (uint me, uint them) { me = this.balance; them = h.balance;}
}
)";
compileAndRun(sourceCode, 22, "Main");
@@ -2648,11 +2648,11 @@ BOOST_AUTO_TEST_CASE(virtual_function_calls)
{
char const* sourceCode = R"(
contract Base {
- function f() returns (uint i) { return g(); }
- function g() returns (uint i) { return 1; }
+ function f() public returns (uint i) { return g(); }
+ function g() public returns (uint i) { return 1; }
}
contract Derived is Base {
- function g() returns (uint i) { return 2; }
+ function g() public returns (uint i) { return 2; }
}
)";
compileAndRun(sourceCode, 0, "Derived");
@@ -2665,16 +2665,16 @@ BOOST_AUTO_TEST_CASE(access_base_storage)
char const* sourceCode = R"(
contract Base {
uint dataBase;
- function getViaBase() returns (uint i) { return dataBase; }
+ function getViaBase() public returns (uint i) { return dataBase; }
}
contract Derived is Base {
uint dataDerived;
- function setData(uint base, uint derived) returns (bool r) {
+ function setData(uint base, uint derived) public returns (bool r) {
dataBase = base;
dataDerived = derived;
return true;
}
- function getViaDerived() returns (uint base, uint derived) {
+ function getViaDerived() public returns (uint base, uint derived) {
base = dataBase;
derived = dataDerived;
}
@@ -2692,10 +2692,10 @@ BOOST_AUTO_TEST_CASE(single_copy_with_multiple_inheritance)
contract Base {
uint data;
function setData(uint i) { data = i; }
- function getViaBase() returns (uint i) { return data; }
+ function getViaBase() public returns (uint i) { return data; }
}
contract A is Base { function setViaA(uint i) { setData(i); } }
- contract B is Base { function getViaB() returns (uint i) { return getViaBase(); } }
+ contract B is Base { function getViaB() public returns (uint i) { return getViaBase(); } }
contract Derived is Base, B, A { }
)";
compileAndRun(sourceCode, 0, "Derived");
@@ -2707,11 +2707,11 @@ BOOST_AUTO_TEST_CASE(single_copy_with_multiple_inheritance)
BOOST_AUTO_TEST_CASE(explicit_base_class)
{
char const* sourceCode = R"(
- contract BaseBase { function g() returns (uint r) { return 1; } }
- contract Base is BaseBase { function g() returns (uint r) { return 2; } }
+ contract BaseBase { function g() public returns (uint r) { return 1; } }
+ contract Base is BaseBase { function g() public returns (uint r) { return 2; } }
contract Derived is Base {
- function f() returns (uint r) { return BaseBase.g(); }
- function g() returns (uint r) { return 3; }
+ function f() public returns (uint r) { return BaseBase.g(); }
+ function g() public returns (uint r) { return 3; }
}
)";
compileAndRun(sourceCode, 0, "Derived");
@@ -2724,17 +2724,17 @@ BOOST_AUTO_TEST_CASE(base_constructor_arguments)
char const* sourceCode = R"(
contract BaseBase {
uint m_a;
- constructor(uint a) {
+ constructor(uint a) public {
m_a = a;
}
}
contract Base is BaseBase(7) {
- constructor() {
+ constructor() public {
m_a *= m_a;
}
}
contract Derived is Base() {
- function getA() returns (uint r) { return m_a; }
+ function getA() public returns (uint r) { return m_a; }
}
)";
compileAndRun(sourceCode, 0, "Derived");
@@ -2746,15 +2746,15 @@ BOOST_AUTO_TEST_CASE(function_usage_in_constructor_arguments)
char const* sourceCode = R"(
contract BaseBase {
uint m_a;
- constructor(uint a) {
+ constructor(uint a) public {
m_a = a;
}
- function g() returns (uint r) { return 2; }
+ function g() public returns (uint r) { return 2; }
}
contract Base is BaseBase(BaseBase.g()) {
}
contract Derived is Base() {
- function getA() returns (uint r) { return m_a; }
+ function getA() public returns (uint r) { return m_a; }
}
)";
compileAndRun(sourceCode, 0, "Derived");
@@ -2766,17 +2766,17 @@ BOOST_AUTO_TEST_CASE(virtual_function_usage_in_constructor_arguments)
char const* sourceCode = R"(
contract BaseBase {
uint m_a;
- constructor(uint a) {
+ constructor(uint a) public {
m_a = a;
}
- function overridden() returns (uint r) { return 1; }
- function g() returns (uint r) { return overridden(); }
+ function overridden() public returns (uint r) { return 1; }
+ function g() public returns (uint r) { return overridden(); }
}
contract Base is BaseBase(BaseBase.g()) {
}
contract Derived is Base() {
- function getA() returns (uint r) { return m_a; }
- function overridden() returns (uint r) { return 2; }
+ function getA() public returns (uint r) { return m_a; }
+ function overridden() public returns (uint r) { return 2; }
}
)";
compileAndRun(sourceCode, 0, "Derived");
@@ -2797,7 +2797,7 @@ BOOST_AUTO_TEST_CASE(function_modifier)
{
char const* sourceCode = R"(
contract C {
- function getOne() payable nonFree returns (uint r) { return 1; }
+ function getOne() payable nonFree public returns (uint r) { return 1; }
modifier nonFree { if (msg.value > 0) _; }
}
)";
@@ -2812,7 +2812,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_local_variables)
contract C {
modifier mod1 { uint8 a = 1; uint8 b = 2; _; }
modifier mod2(bool a) { if (a) return; else _; }
- function f(bool a) mod1 mod2(a) returns (uint r) { return 3; }
+ function f(bool a) mod1 mod2(a) public returns (uint r) { return 3; }
}
)";
compileAndRun(sourceCode);
@@ -2825,7 +2825,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_loop)
char const* sourceCode = R"(
contract C {
modifier repeat(uint count) { uint i; for (i = 0; i < count; ++i) _; }
- function f() repeat(10) returns (uint r) { r += 1; }
+ function f() repeat(10) public returns (uint r) { r += 1; }
}
)";
compileAndRun(sourceCode);
@@ -2837,7 +2837,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_multi_invocation)
char const* sourceCode = R"(
contract C {
modifier repeat(bool twice) { if (twice) _; _; }
- function f(bool twice) repeat(twice) returns (uint r) { r += 1; }
+ function f(bool twice) repeat(twice) public returns (uint r) { r += 1; }
}
)";
compileAndRun(sourceCode);
@@ -2852,7 +2852,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_multi_with_return)
char const* sourceCode = R"(
contract C {
modifier repeat(bool twice) { if (twice) _; _; }
- function f(bool twice) repeat(twice) returns (uint r) { r += 1; return r; }
+ function f(bool twice) repeat(twice) public returns (uint r) { r += 1; return r; }
}
)";
compileAndRun(sourceCode);
@@ -2864,7 +2864,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_overriding)
{
char const* sourceCode = R"(
contract A {
- function f() mod returns (bool r) { return true; }
+ function f() mod public returns (bool r) { return true; }
modifier mod { _; }
}
contract C is A {
@@ -2880,18 +2880,18 @@ BOOST_AUTO_TEST_CASE(function_modifier_calling_functions_in_creation_context)
char const* sourceCode = R"(
contract A {
uint data;
- constructor() mod1 { f1(); }
- function f1() mod2 { data |= 0x1; }
- function f2() { data |= 0x20; }
- function f3() { }
+ constructor() mod1 public { f1(); }
+ function f1() mod2 public { data |= 0x1; }
+ function f2() public { data |= 0x20; }
+ function f3() public { }
modifier mod1 { f2(); _; }
modifier mod2 { f3(); if (false) _; }
- function getData() returns (uint r) { return data; }
+ function getData() public returns (uint r) { return data; }
}
contract C is A {
modifier mod1 { f4(); _; }
- function f3() { data |= 0x300; }
- function f4() { data |= 0x4000; }
+ function f3() public { data |= 0x300; }
+ function f4() public { data |= 0x4000; }
}
)";
compileAndRun(sourceCode);
@@ -2905,7 +2905,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_for_constructor)
uint data;
constructor() mod1 { data |= 2; }
modifier mod1 { data |= 1; _; }
- function getData() returns (uint r) { return data; }
+ function getData() public returns (uint r) { return data; }
}
contract C is A {
modifier mod1 { data |= 4; _; }
@@ -2921,7 +2921,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_multiple_times)
contract C {
uint public a;
modifier mod(uint x) { a += x; _; }
- function f(uint x) mod(2) mod(5) mod(x) returns(uint) { return a; }
+ function f(uint x) mod(2) mod(5) mod(x) public returns(uint) { return a; }
}
)";
compileAndRun(sourceCode);
@@ -2935,7 +2935,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_multiple_times_local_vars)
contract C {
uint public a;
modifier mod(uint x) { uint b = x; a += b; _; a -= b; assert(b == x); }
- function f(uint x) mod(2) mod(5) mod(x) returns(uint) { return a; }
+ function f(uint x) mod(2) mod(5) mod(x) public returns(uint) { return a; }
}
)";
compileAndRun(sourceCode);
@@ -2999,7 +2999,7 @@ BOOST_AUTO_TEST_CASE(crazy_elementary_typenames_on_stack)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint r) {
+ function f() public returns (uint r) {
uint; uint; uint; uint;
int x = -7;
return uint(x);
@@ -3013,10 +3013,10 @@ BOOST_AUTO_TEST_CASE(crazy_elementary_typenames_on_stack)
BOOST_AUTO_TEST_CASE(super)
{
char const* sourceCode = R"(
- contract A { function f() returns (uint r) { return 1; } }
- contract B is A { function f() returns (uint r) { return super.f() | 2; } }
- contract C is A { function f() returns (uint r) { return super.f() | 4; } }
- contract D is B, C { function f() returns (uint r) { return super.f() | 8; } }
+ contract A { function f() public returns (uint r) { return 1; } }
+ contract B is A { function f() public returns (uint r) { return super.f() | 2; } }
+ contract C is A { function f() public returns (uint r) { return super.f() | 4; } }
+ contract D is B, C { function f() public returns (uint r) { return super.f() | 8; } }
)";
compileAndRun(sourceCode, 0, "D");
ABI_CHECK(callContractFunction("f()"), encodeArgs(1 | 2 | 4 | 8));
@@ -3025,10 +3025,10 @@ BOOST_AUTO_TEST_CASE(super)
BOOST_AUTO_TEST_CASE(super_in_constructor)
{
char const* sourceCode = R"(
- contract A { function f() returns (uint r) { return 1; } }
- contract B is A { function f() returns (uint r) { return super.f() | 2; } }
- contract C is A { function f() returns (uint r) { return super.f() | 4; } }
- contract D is B, C { uint data; constructor() { data = super.f() | 8; } function f() returns (uint r) { return data; } }
+ contract A { function f() public returns (uint r) { return 1; } }
+ contract B is A { function f() public returns (uint r) { return super.f() | 2; } }
+ contract C is A { function f() public returns (uint r) { return super.f() | 4; } }
+ contract D is B, C { uint data; constructor() public { data = super.f() | 8; } function f() public returns (uint r) { return data; } }
)";
compileAndRun(sourceCode, 0, "D");
ABI_CHECK(callContractFunction("f()"), encodeArgs(1 | 2 | 4 | 8));
@@ -3037,7 +3037,7 @@ BOOST_AUTO_TEST_CASE(super_in_constructor)
BOOST_AUTO_TEST_CASE(super_alone)
{
char const* sourceCode = R"(
- contract A { function f() { super; } }
+ contract A { function f() public { super; } }
)";
compileAndRun(sourceCode, 0, "A");
ABI_CHECK(callContractFunction("f()"), encodeArgs());
@@ -3049,7 +3049,7 @@ BOOST_AUTO_TEST_CASE(fallback_function)
contract A {
uint data;
function() external { data = 1; }
- function getData() returns (uint r) { return data; }
+ function getData() public returns (uint r) { return data; }
}
)";
compileAndRun(sourceCode);
@@ -3064,7 +3064,7 @@ BOOST_AUTO_TEST_CASE(inherited_fallback_function)
contract A {
uint data;
function() external { data = 1; }
- function getData() returns (uint r) { return data; }
+ function getData() public returns (uint r) { return data; }
}
contract B is A {}
)";
@@ -3078,7 +3078,7 @@ BOOST_AUTO_TEST_CASE(default_fallback_throws)
{
char const* sourceCode = R"YY(
contract A {
- function f() returns (bool) {
+ function f() public returns (bool) {
return this.call("");
}
}
@@ -3093,7 +3093,7 @@ BOOST_AUTO_TEST_CASE(short_data_calls_fallback)
contract A {
uint public x;
// Signature is d88e0b00
- function fow() { x = 3; }
+ function fow() public { x = 3; }
function () external { x = 2; }
}
)";
@@ -3167,7 +3167,7 @@ BOOST_AUTO_TEST_CASE(event_no_arguments)
char const* sourceCode = R"(
contract ClientReceipt {
event Deposit();
- function deposit() {
+ function deposit() public {
emit Deposit();
}
}
@@ -3189,7 +3189,7 @@ BOOST_AUTO_TEST_CASE(event_access_through_base_name_emit)
event x();
}
contract B is A {
- function f() returns (uint) {
+ function f() public returns (uint) {
emit A.x();
return 1;
}
@@ -3211,15 +3211,15 @@ BOOST_AUTO_TEST_CASE(events_with_same_name)
event Deposit();
event Deposit(address _addr);
event Deposit(address _addr, uint _amount);
- function deposit() returns (uint) {
+ function deposit() public returns (uint) {
emit Deposit();
return 1;
}
- function deposit(address _addr) returns (uint) {
+ function deposit(address _addr) public returns (uint) {
emit Deposit(_addr);
return 1;
}
- function deposit(address _addr, uint _amount) returns (uint) {
+ function deposit(address _addr, uint _amount) public returns (uint) {
emit Deposit(_addr, _amount);
return 1;
}
@@ -3263,15 +3263,15 @@ BOOST_AUTO_TEST_CASE(events_with_same_name_inherited_emit)
contract ClientReceipt is A, B {
event Deposit(address _addr, uint _amount);
- function deposit() returns (uint) {
+ function deposit() public returns (uint) {
emit Deposit();
return 1;
}
- function deposit(address _addr) returns (uint) {
+ function deposit(address _addr) public returns (uint) {
emit Deposit(_addr);
return 1;
}
- function deposit(address _addr, uint _amount) returns (uint) {
+ function deposit(address _addr, uint _amount) public returns (uint) {
emit Deposit(_addr, _amount);
return 1;
}
@@ -3307,7 +3307,7 @@ BOOST_AUTO_TEST_CASE(event_anonymous)
char const* sourceCode = R"(
contract ClientReceipt {
event Deposit() anonymous;
- function deposit() {
+ function deposit() public {
emit Deposit();
}
}
@@ -3367,7 +3367,7 @@ BOOST_AUTO_TEST_CASE(event_really_lots_of_data)
char const* sourceCode = R"(
contract ClientReceipt {
event Deposit(uint fixeda, bytes dynx, uint fixedb);
- function deposit() {
+ function deposit() public {
emit Deposit(10, msg.data, 15);
}
}
@@ -3387,7 +3387,7 @@ BOOST_AUTO_TEST_CASE(event_really_lots_of_data_from_storage)
contract ClientReceipt {
bytes x;
event Deposit(uint fixeda, bytes dynx, uint fixedb);
- function deposit() {
+ function deposit() public {
x.length = 3;
x[0] = "A";
x[1] = "B";
@@ -3411,7 +3411,7 @@ BOOST_AUTO_TEST_CASE(event_really_really_lots_of_data_from_storage)
contract ClientReceipt {
bytes x;
event Deposit(uint fixeda, bytes dynx, uint fixedb);
- function deposit() {
+ function deposit() public {
x.length = 31;
x[0] = "A";
x[1] = "B";
@@ -3437,7 +3437,7 @@ BOOST_AUTO_TEST_CASE(event_indexed_string)
string x;
uint[4] y;
event E(string indexed r, uint[4] indexed t);
- function deposit() {
+ function deposit() public {
bytes(x).length = 90;
for (uint8 i = 0; i < 90; i++)
bytes(x)[i] = byte(i);
@@ -3469,7 +3469,7 @@ BOOST_AUTO_TEST_CASE(empty_name_input_parameter_with_named_one)
{
char const* sourceCode = R"(
contract test {
- function f(uint, uint k) returns(uint ret_k, uint ret_g){
+ function f(uint, uint k) public returns(uint ret_k, uint ret_g){
uint g = 8;
ret_k = k;
ret_g = g;
@@ -3485,7 +3485,7 @@ BOOST_AUTO_TEST_CASE(empty_name_return_parameter)
{
char const* sourceCode = R"(
contract test {
- function f(uint k) returns(uint){
+ function f(uint k) public returns(uint){
return k;
}
}
@@ -3498,7 +3498,7 @@ BOOST_AUTO_TEST_CASE(sha256_empty)
{
char const* sourceCode = R"(
contract C {
- function f() returns (bytes32) {
+ function f() public returns (bytes32) {
return sha256("");
}
}
@@ -3511,7 +3511,7 @@ BOOST_AUTO_TEST_CASE(ripemd160_empty)
{
char const* sourceCode = R"(
contract C {
- function f() returns (bytes20) {
+ function f() public returns (bytes20) {
return ripemd160("");
}
}
@@ -3524,7 +3524,7 @@ BOOST_AUTO_TEST_CASE(keccak256_empty)
{
char const* sourceCode = R"(
contract C {
- function f() returns (bytes32) {
+ function f() public returns (bytes32) {
return keccak256("");
}
}
@@ -3537,7 +3537,7 @@ BOOST_AUTO_TEST_CASE(keccak256_multiple_arguments)
{
char const* sourceCode = R"(
contract c {
- function foo(uint a, uint b, uint c) returns (bytes32 d)
+ function foo(uint a, uint b, uint c) public returns (bytes32 d)
{
d = keccak256(abi.encodePacked(a, b, c));
}
@@ -3558,7 +3558,7 @@ BOOST_AUTO_TEST_CASE(keccak256_multiple_arguments_with_numeric_literals)
{
char const* sourceCode = R"(
contract c {
- function foo(uint a, uint16 b) returns (bytes32 d)
+ function foo(uint a, uint16 b) public returns (bytes32 d)
{
d = keccak256(abi.encodePacked(a, b, 145));
}
@@ -3579,11 +3579,11 @@ BOOST_AUTO_TEST_CASE(keccak256_multiple_arguments_with_string_literals)
{
char const* sourceCode = R"(
contract c {
- function foo() returns (bytes32 d)
+ function foo() public returns (bytes32 d)
{
d = keccak256("foo");
}
- function bar(uint a, uint16 b) returns (bytes32 d)
+ function bar(uint a, uint16 b) public returns (bytes32 d)
{
d = keccak256(abi.encodePacked(a, b, 145, "foo"));
}
@@ -3608,7 +3608,7 @@ BOOST_AUTO_TEST_CASE(keccak256_with_bytes)
char const* sourceCode = R"(
contract c {
bytes data;
- function foo() returns (bool)
+ function foo() public returns (bool)
{
data.length = 3;
data[0] = "f";
@@ -3627,7 +3627,7 @@ BOOST_AUTO_TEST_CASE(iterated_keccak256_with_bytes)
char const* sourceCode = R"ABC(
contract c {
bytes data;
- function foo() returns (bytes32)
+ function foo() public returns (bytes32)
{
data.length = 3;
data[0] = "x";
@@ -3651,8 +3651,8 @@ BOOST_AUTO_TEST_CASE(generic_call)
function receive(uint256 x) payable { received = x; }
}
contract sender {
- constructor() payable {}
- function doSend(address rec) returns (uint d)
+ constructor() public payable {}
+ function doSend(address rec) public returns (uint d)
{
bytes4 signature = bytes4(bytes32(keccak256("receive(uint256)")));
rec.call.value(2)(abi.encodeWithSelector(signature, 23));
@@ -3711,10 +3711,10 @@ BOOST_AUTO_TEST_CASE(generic_delegatecall)
BOOST_AUTO_TEST_CASE(library_call_in_homestead)
{
char const* sourceCode = R"(
- library Lib { function m() returns (address) { return msg.sender; } }
+ library Lib { function m() public returns (address) { return msg.sender; } }
contract Test {
address public sender;
- function f() {
+ function f() public {
sender = Lib.m();
}
}
@@ -3763,7 +3763,7 @@ BOOST_AUTO_TEST_CASE(store_bytes)
// this test just checks that the copy loop does not mess up the stack
char const* sourceCode = R"(
contract C {
- function save() returns (uint r) {
+ function save() public returns (uint r) {
r = 23;
savedData = msg.data;
r = 24;
@@ -3781,7 +3781,7 @@ BOOST_AUTO_TEST_CASE(bytes_from_calldata_to_memory)
{
char const* sourceCode = R"(
contract C {
- function f() returns (bytes32) {
+ function f() public returns (bytes32) {
return keccak256(abi.encodePacked("abc", msg.data));
}
}
@@ -3798,15 +3798,15 @@ BOOST_AUTO_TEST_CASE(call_forward_bytes)
char const* sourceCode = R"(
contract receiver {
uint public received;
- function receive(uint x) { received += x + 1; }
+ function receive(uint x) public { received += x + 1; }
function() external { received = 0x80; }
}
contract sender {
- constructor() { rec = new receiver(); }
+ constructor() public { rec = new receiver(); }
function() external { savedData = msg.data; }
- function forward() returns (bool) { !rec.call(savedData); return true; }
- function clear() returns (bool) { delete savedData; return true; }
- function val() returns (uint) { return rec.received(); }
+ function forward() public returns (bool) { !rec.call(savedData); return true; }
+ function clear() public returns (bool) { delete savedData; return true; }
+ function val() public returns (uint) { return rec.received(); }
receiver rec;
bytes savedData;
}
@@ -3831,18 +3831,18 @@ BOOST_AUTO_TEST_CASE(call_forward_bytes_length)
}
contract sender {
receiver rec;
- constructor() { rec = new receiver(); }
- function viaCalldata() returns (uint) {
+ constructor() public { rec = new receiver(); }
+ function viaCalldata() public returns (uint) {
require(rec.call(msg.data));
return rec.calledLength();
}
- function viaMemory() returns (uint) {
+ function viaMemory() public returns (uint) {
bytes memory x = msg.data;
require(rec.call(x));
return rec.calledLength();
}
bytes s;
- function viaStorage() returns (uint) {
+ function viaStorage() public returns (uint) {
s = msg.data;
require(rec.call(s));
return rec.calledLength();
@@ -3872,14 +3872,14 @@ BOOST_AUTO_TEST_CASE(copying_bytes_multiassign)
function() external { received = 0x80; }
}
contract sender {
- constructor() { rec = new receiver(); }
+ constructor() public { rec = new receiver(); }
function() external { savedData1 = savedData2 = msg.data; }
- function forward(bool selector) returns (bool) {
+ function forward(bool selector) public returns (bool) {
if (selector) { rec.call(savedData1); delete savedData1; }
else { rec.call(savedData2); delete savedData2; }
return true;
}
- function val() returns (uint) { return rec.received(); }
+ function val() public returns (uint) { return rec.received(); }
receiver rec;
bytes savedData1;
bytes savedData2;
@@ -3901,7 +3901,7 @@ BOOST_AUTO_TEST_CASE(delete_removes_bytes_data)
char const* sourceCode = R"(
contract c {
function() external { data = msg.data; }
- function del() returns (bool) { delete data; return true; }
+ function del() public returns (bool) { delete data; return true; }
bytes data;
}
)";
@@ -3916,7 +3916,7 @@ BOOST_AUTO_TEST_CASE(copy_from_calldata_removes_bytes_data)
{
char const* sourceCode = R"(
contract c {
- function set() returns (bool) { data = msg.data; return true; }
+ function set() public returns (bool) { data = msg.data; return true; }
function() external { data = msg.data; }
bytes data;
}
@@ -3934,8 +3934,8 @@ BOOST_AUTO_TEST_CASE(copy_removes_bytes_data)
{
char const* sourceCode = R"(
contract c {
- function set() returns (bool) { data1 = msg.data; return true; }
- function reset() returns (bool) { data1 = data2; return true; }
+ function set() public returns (bool) { data1 = msg.data; return true; }
+ function reset() public returns (bool) { data1 = data2; return true; }
bytes data1;
bytes data2;
}
@@ -3951,8 +3951,8 @@ BOOST_AUTO_TEST_CASE(bytes_inside_mappings)
{
char const* sourceCode = R"(
contract c {
- function set(uint key) returns (bool) { data[key] = msg.data; return true; }
- function copy(uint from, uint to) returns (bool) { data[to] = data[from]; return true; }
+ function set(uint key) public returns (bool) { data[key] = msg.data; return true; }
+ function copy(uint from, uint to) public returns (bool) { data[to] = data[from]; return true; }
mapping(uint => bytes) data;
}
)";
@@ -3975,8 +3975,8 @@ BOOST_AUTO_TEST_CASE(bytes_length_member)
{
char const* sourceCode = R"(
contract c {
- function set() returns (bool) { data = msg.data; return true; }
- function getLength() returns (uint) { return data.length; }
+ function set() public returns (bool) { data = msg.data; return true; }
+ function getLength() public returns (uint) { return data.length; }
bytes data;
}
)";
@@ -3993,18 +3993,18 @@ BOOST_AUTO_TEST_CASE(struct_copy)
struct Nested { uint x; uint y; }
struct Struct { uint a; mapping(uint => Struct) b; Nested nested; uint c; }
mapping(uint => Struct) data;
- function set(uint k) returns (bool) {
+ function set(uint k) public returns (bool) {
data[k].a = 1;
data[k].nested.x = 3;
data[k].nested.y = 4;
data[k].c = 2;
return true;
}
- function copy(uint from, uint to) returns (bool) {
+ function copy(uint from, uint to) public returns (bool) {
data[to] = data[from];
return true;
}
- function retrieve(uint k) returns (uint a, uint x, uint y, uint c)
+ function retrieve(uint k) public returns (uint a, uint x, uint y, uint c)
{
a = data[k].a;
x = data[k].nested.x;
@@ -4039,11 +4039,11 @@ BOOST_AUTO_TEST_CASE(struct_containing_bytes_copy_and_delete)
data1.data = _data;
return true;
}
- function copy() returns (bool) {
+ function copy() public returns (bool) {
data1 = data2;
return true;
}
- function del() returns (bool) {
+ function del() public returns (bool) {
delete data1;
return true;
}
@@ -4069,7 +4069,7 @@ BOOST_AUTO_TEST_CASE(struct_copy_via_local)
struct Struct { uint a; uint b; }
Struct data1;
Struct data2;
- function test() returns (bool) {
+ function test() public returns (bool) {
data1.a = 1;
data1.b = 2;
Struct memory x = data1;
@@ -4091,7 +4091,7 @@ BOOST_AUTO_TEST_CASE(using_enums)
{
choices = ActionChoices.GoStraight;
}
- function getChoice() returns (uint d)
+ function getChoice() public returns (uint d)
{
d = uint256(choices);
}
@@ -4110,17 +4110,17 @@ BOOST_AUTO_TEST_CASE(enum_explicit_overflow)
constructor()
{
}
- function getChoiceExp(uint x) returns (uint d)
+ function getChoiceExp(uint x) public returns (uint d)
{
choice = ActionChoices(x);
d = uint256(choice);
}
- function getChoiceFromSigned(int x) returns (uint d)
+ function getChoiceFromSigned(int x) public returns (uint d)
{
choice = ActionChoices(x);
d = uint256(choice);
}
- function getChoiceFromNegativeLiteral() returns (uint d)
+ function getChoiceFromNegativeLiteral() public returns (uint d)
{
choice = ActionChoices(-1);
d = uint256(choice);
@@ -4144,7 +4144,7 @@ BOOST_AUTO_TEST_CASE(storing_invalid_boolean)
contract C {
event Ev(bool);
bool public perm;
- function set() returns(uint) {
+ function set() public returns(uint) {
bool tmp;
assembly {
tmp := 5
@@ -4152,14 +4152,14 @@ BOOST_AUTO_TEST_CASE(storing_invalid_boolean)
perm = tmp;
return 1;
}
- function ret() returns(bool) {
+ function ret() public returns(bool) {
bool tmp;
assembly {
tmp := 5
}
return tmp;
}
- function ev() returns(uint) {
+ function ev() public returns(uint) {
bool tmp;
assembly {
tmp := 5
@@ -4187,7 +4187,7 @@ BOOST_AUTO_TEST_CASE(using_contract_enums_with_explicit_contract_name)
char const* sourceCode = R"(
contract test {
enum Choice { A, B, C }
- function answer () returns (test.Choice _ret)
+ function answer () public returns (test.Choice _ret)
{
_ret = test.Choice.B;
}
@@ -4205,7 +4205,7 @@ BOOST_AUTO_TEST_CASE(using_inherited_enum)
}
contract test is base {
- function answer () returns (Choice _ret)
+ function answer () public returns (Choice _ret)
{
_ret = Choice.B;
}
@@ -4223,7 +4223,7 @@ BOOST_AUTO_TEST_CASE(using_inherited_enum_excplicitly)
}
contract test is base {
- function answer () returns (base.Choice _ret)
+ function answer () public returns (base.Choice _ret)
{
_ret = base.Choice.B;
}
@@ -4238,7 +4238,7 @@ BOOST_AUTO_TEST_CASE(constructing_enums_from_ints)
char const* sourceCode = R"(
contract c {
enum Truth { False, True }
- function test() returns (uint)
+ function test() public returns (uint)
{
return uint(Truth(uint8(0x701)));
}
@@ -4259,7 +4259,7 @@ BOOST_AUTO_TEST_CASE(inline_member_init)
uint m_a = 5;
uint m_b;
uint m_c = 7;
- function get() returns (uint a, uint b, uint c){
+ function get() public returns (uint a, uint b, uint c){
a = m_a;
b = m_b;
c = m_c;
@@ -4276,12 +4276,12 @@ BOOST_AUTO_TEST_CASE(inline_member_init_inheritence)
contract Base {
constructor(){}
uint m_base = 5;
- function getBMember() returns (uint i) { return m_base; }
+ function getBMember() public returns (uint i) { return m_base; }
}
contract Derived is Base {
constructor(){}
uint m_derived = 6;
- function getDMember() returns (uint i) { return m_derived; }
+ function getDMember() public returns (uint i) { return m_derived; }
}
)";
compileAndRun(sourceCode);
@@ -4294,11 +4294,11 @@ BOOST_AUTO_TEST_CASE(inline_member_init_inheritence_without_constructor)
char const* sourceCode = R"(
contract Base {
uint m_base = 5;
- function getBMember() returns (uint i) { return m_base; }
+ function getBMember() public returns (uint i) { return m_base; }
}
contract Derived is Base {
uint m_derived = 6;
- function getDMember() returns (uint i) { return m_derived; }
+ function getDMember() public returns (uint i) { return m_derived; }
}
)";
compileAndRun(sourceCode);
@@ -4310,7 +4310,7 @@ BOOST_AUTO_TEST_CASE(external_function)
{
char const* sourceCode = R"(
contract c {
- function f(uint a) returns (uint) { return a; }
+ function f(uint a) public returns (uint) { return a; }
function test(uint a, uint b) external returns (uint r_a, uint r_b) {
r_a = f(a + 7);
r_b = b;
@@ -4362,9 +4362,9 @@ BOOST_AUTO_TEST_CASE(fixed_arrays_in_storage)
function setIDStatic(uint id) { ids[2] = id; }
function setID(uint index, uint id) { ids[index] = id; }
function setData(uint index, uint x, uint y) { data[index].x = x; data[index].y = y; }
- function getID(uint index) returns (uint) { return ids[index]; }
- function getData(uint index) returns (uint x, uint y) { x = data[index].x; y = data[index].y; }
- function getLengths() returns (uint l1, uint l2) { l1 = data.length; l2 = ids.length; }
+ function getID(uint index) public returns (uint) { return ids[index]; }
+ function getData(uint index) public returns (uint x, uint y) { x = data[index].x; y = data[index].y; }
+ function getLengths() public returns (uint l1, uint l2) { l1 = data.length; l2 = ids.length; }
}
)";
compileAndRun(sourceCode);
@@ -4389,9 +4389,9 @@ BOOST_AUTO_TEST_CASE(dynamic_arrays_in_storage)
function setIDStatic(uint id) { ids[2] = id; }
function setID(uint index, uint id) { ids[index] = id; }
function setData(uint index, uint x, uint y) { data[index].x = x; data[index].y = y; }
- function getID(uint index) returns (uint) { return ids[index]; }
- function getData(uint index) returns (uint x, uint y) { x = data[index].x; y = data[index].y; }
- function getLengths() returns (uint l1, uint l2) { l1 = data.length; l2 = ids.length; }
+ function getID(uint index) public returns (uint) { return ids[index]; }
+ function getData(uint index) public returns (uint x, uint y) { x = data[index].x; y = data[index].y; }
+ function getLengths() public returns (uint l1, uint l2) { l1 = data.length; l2 = ids.length; }
function setLengths(uint l1, uint l2) { data.length = l1; ids.length = l2; }
}
)";
@@ -4414,9 +4414,9 @@ BOOST_AUTO_TEST_CASE(fixed_out_of_bounds_array_access)
char const* sourceCode = R"(
contract c {
uint[4] data;
- function set(uint index, uint value) returns (bool) { data[index] = value; return true; }
- function get(uint index) returns (uint) { return data[index]; }
- function length() returns (uint) { return data.length; }
+ function set(uint index, uint value) public returns (bool) { data[index] = value; return true; }
+ function get(uint index) public returns (uint) { return data[index]; }
+ function length() public returns (uint) { return data.length; }
}
)";
compileAndRun(sourceCode);
@@ -4435,10 +4435,10 @@ BOOST_AUTO_TEST_CASE(dynamic_out_of_bounds_array_access)
char const* sourceCode = R"(
contract c {
uint[] data;
- function enlarge(uint amount) returns (uint) { return data.length += amount; }
- function set(uint index, uint value) returns (bool) { data[index] = value; return true; }
- function get(uint index) returns (uint) { return data[index]; }
- function length() returns (uint) { return data.length; }
+ function enlarge(uint amount) public returns (uint) { return data.length += amount; }
+ function set(uint index, uint value) public returns (bool) { data[index] = value; return true; }
+ function get(uint index) public returns (uint) { return data[index]; }
+ function length() public returns (uint) { return data.length; }
}
)";
compileAndRun(sourceCode);
@@ -4460,10 +4460,10 @@ BOOST_AUTO_TEST_CASE(fixed_array_cleanup)
uint spacer1;
uint spacer2;
uint[20] data;
- function fill() {
+ function fill() public {
for (uint i = 0; i < data.length; ++i) data[i] = i+1;
}
- function clear() { delete data; }
+ function clear() public { delete data; }
}
)";
compileAndRun(sourceCode);
@@ -4481,10 +4481,10 @@ BOOST_AUTO_TEST_CASE(short_fixed_array_cleanup)
uint spacer1;
uint spacer2;
uint[3] data;
- function fill() {
+ function fill() public {
for (uint i = 0; i < data.length; ++i) data[i] = i+1;
}
- function clear() { delete data; }
+ function clear() public { delete data; }
}
)";
compileAndRun(sourceCode);
@@ -4501,12 +4501,12 @@ BOOST_AUTO_TEST_CASE(dynamic_array_cleanup)
contract c {
uint[20] spacer;
uint[] dynamic;
- function fill() {
+ function fill() public {
dynamic.length = 21;
for (uint i = 0; i < dynamic.length; ++i) dynamic[i] = i+1;
}
- function halfClear() { dynamic.length = 5; }
- function fullClear() { delete dynamic; }
+ function halfClear() public { dynamic.length = 5; }
+ function fullClear() public { delete dynamic; }
}
)";
compileAndRun(sourceCode);
@@ -4525,14 +4525,14 @@ BOOST_AUTO_TEST_CASE(dynamic_multi_array_cleanup)
contract c {
struct s { uint[][] d; }
s[] data;
- function fill() returns (uint) {
+ function fill() public returns (uint) {
data.length = 3;
data[2].d.length = 4;
data[2].d[3].length = 5;
data[2].d[3][4] = 8;
return data[2].d[3][4];
}
- function clear() { delete data; }
+ function clear() public { delete data; }
}
)";
compileAndRun(sourceCode);
@@ -4552,8 +4552,8 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_storage_dyn_dyn)
function setData1(uint length, uint index, uint value) {
data1.length = length; if (index < length) data1[index] = value;
}
- function copyStorageStorage() { data2 = data1; }
- function getData2(uint index) returns (uint len, uint val) {
+ function copyStorageStorage() public { data2 = data1; }
+ function getData2(uint index) public returns (uint len, uint val) {
len = data2.length; if (index < len) val = data2[index];
}
}
@@ -4574,7 +4574,7 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_storage_static_static)
contract c {
uint[40] data1;
uint[20] data2;
- function test() returns (uint x, uint y){
+ function test() public returns (uint x, uint y){
data1[30] = 4;
data1[2] = 7;
data1[3] = 9;
@@ -4595,7 +4595,7 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_storage_static_dynamic)
contract c {
uint[9] data1;
uint[] data2;
- function test() returns (uint x, uint y){
+ function test() public returns (uint x, uint y){
data1[8] = 4;
data2 = data1;
x = data2.length;
@@ -4613,7 +4613,7 @@ BOOST_AUTO_TEST_CASE(array_copy_different_packing)
contract c {
bytes8[] data1; // 4 per slot
bytes10[] data2; // 3 per slot
- function test() returns (bytes10 a, bytes10 b, bytes10 c, bytes10 d, bytes10 e) {
+ function test() public returns (bytes10 a, bytes10 b, bytes10 c, bytes10 d, bytes10 e) {
data1.length = 9;
for (uint i = 0; i < data1.length; ++i)
data1[i] = bytes8(uint64(i));
@@ -4642,7 +4642,7 @@ BOOST_AUTO_TEST_CASE(array_copy_target_simple)
contract c {
bytes8[9] data1; // 4 per slot
bytes17[10] data2; // 1 per slot, no offset counter
- function test() returns (bytes17 a, bytes17 b, bytes17 c, bytes17 d, bytes17 e) {
+ function test() public returns (bytes17 a, bytes17 b, bytes17 c, bytes17 d, bytes17 e) {
for (uint i = 0; i < data1.length; ++i)
data1[i] = bytes8(uint64(i));
data2[8] = data2[9] = 2;
@@ -4672,7 +4672,7 @@ BOOST_AUTO_TEST_CASE(array_copy_target_leftover)
contract c {
byte[10] data1;
bytes2[32] data2;
- function test() returns (uint check, uint res1, uint res2) {
+ function test() public returns (uint check, uint res1, uint res2) {
uint i;
for (i = 0; i < data2.length; ++i)
data2[i] = 0xffff;
@@ -4703,7 +4703,7 @@ BOOST_AUTO_TEST_CASE(array_copy_target_leftover2)
contract c {
bytes8[4] data1; // fits into one slot
bytes10[6] data2; // 4 elements need two slots
- function test() returns (bytes10 r1, bytes10 r2, bytes10 r3) {
+ function test() public returns (bytes10 r1, bytes10 r2, bytes10 r3) {
data1[0] = 1;
data1[1] = 2;
data1[2] = 3;
@@ -4732,7 +4732,7 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_storage_struct)
struct Data { uint x; uint y; }
Data[] data1;
Data[] data2;
- function test() returns (uint x, uint y) {
+ function test() public returns (uint x, uint y) {
data1.length = 9;
data1[8].x = 4;
data1[8].y = 5;
@@ -4760,22 +4760,22 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_abi)
uint16[] y;
uint24[] z;
uint24[][] w;
- function test1() returns (uint8[]) {
+ function test1() public returns (uint8[]) {
for (uint i = 0; i < 101; ++i)
x.push(uint8(i));
return x;
}
- function test2() returns (uint16[]) {
+ function test2() public returns (uint16[]) {
for (uint i = 0; i < 101; ++i)
y.push(uint16(i));
return y;
}
- function test3() returns (uint24[]) {
+ function test3() public returns (uint24[]) {
for (uint i = 0; i < 101; ++i)
z.push(uint24(i));
return z;
}
- function test4() returns (uint24[][]) {
+ function test4() public returns (uint24[][]) {
w.length = 5;
for (uint i = 0; i < 5; ++i)
for (uint j = 0; j < 101; ++j)
@@ -4808,7 +4808,7 @@ BOOST_AUTO_TEST_CASE(array_copy_storage_abi_signed)
char const* sourceCode = R"(
contract c {
int16[] x;
- function test() returns (int16[]) {
+ function test() public returns (int16[]) {
x.push(int16(-1));
x.push(int16(-1));
x.push(int16(8));
@@ -4840,7 +4840,7 @@ BOOST_AUTO_TEST_CASE(array_push)
char const* sourceCode = R"(
contract c {
uint[] data;
- function test() returns (uint x, uint y, uint z, uint l) {
+ function test() public returns (uint x, uint y, uint z, uint l) {
data.push(5);
x = data[0];
data.push(4);
@@ -4860,7 +4860,7 @@ BOOST_AUTO_TEST_CASE(array_push_struct)
contract c {
struct S { uint16 a; uint16 b; uint16[3] c; uint16[] d; }
S[] data;
- function test() returns (uint16, uint16, uint16, uint16) {
+ function test() public returns (uint16, uint16, uint16, uint16) {
S memory s;
s.a = 2;
s.b = 3;
@@ -4881,7 +4881,7 @@ BOOST_AUTO_TEST_CASE(array_push_packed_array)
char const* sourceCode = R"(
contract c {
uint80[] x;
- function test() returns (uint80, uint80, uint80, uint80) {
+ function test() public returns (uint80, uint80, uint80, uint80) {
x.push(1);
x.push(2);
x.push(3);
@@ -4901,7 +4901,7 @@ BOOST_AUTO_TEST_CASE(byte_array_push)
char const* sourceCode = R"(
contract c {
bytes data;
- function test() returns (bool x) {
+ function test() public returns (bool x) {
if (data.push(5) != 1) return true;
if (data[0] != 5) return true;
data.push(4);
@@ -4922,7 +4922,7 @@ BOOST_AUTO_TEST_CASE(byte_array_push_transition)
char const* sourceCode = R"(
contract c {
bytes data;
- function test() returns (uint) {
+ function test() public returns (uint) {
for (uint8 i = 1; i < 40; i++)
{
data.push(byte(i));
@@ -5352,7 +5352,7 @@ BOOST_AUTO_TEST_CASE(array_copy_calldata_storage)
m_byte_data = b;
return b[3][1]; // note that access and declaration are reversed to each other
}
- function retrieve() returns (uint a, uint b, uint c, uint d, uint e, uint f, uint g) {
+ function retrieve() public returns (uint a, uint b, uint c, uint d, uint e, uint f, uint g) {
a = m_data.length;
b = m_data[7];
c = m_data_dyn.length;
@@ -5408,7 +5408,7 @@ BOOST_AUTO_TEST_CASE(array_copy_including_mapping)
contract c {
mapping(uint=>uint)[90][] large;
mapping(uint=>uint)[3][] small;
- function test() returns (uint r) {
+ function test() public returns (uint r) {
large.length = small.length = 7;
large[3][2][0] = 2;
large[1] = large[3];
@@ -5422,7 +5422,7 @@ BOOST_AUTO_TEST_CASE(array_copy_including_mapping)
delete small;
delete large;
}
- function clear() returns (uint r) {
+ function clear() public returns (uint r) {
large.length = small.length = 7;
small[3][2][0] = 0;
large[3][2][0] = 0;
@@ -5451,11 +5451,11 @@ BOOST_AUTO_TEST_CASE(swap_in_storage_overwrite)
struct S { uint a; uint b; }
S public x;
S public y;
- function set() {
+ function set() public {
x.a = 1; x.b = 2;
y.a = 3; y.b = 4;
}
- function swap() {
+ function swap() public {
(x, y) = (y, x);
}
}
@@ -5496,17 +5496,17 @@ BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base_base)
{
char const* sourceCode = R"(
contract Base {
- constructor(uint j)
+ constructor(uint j) public
{
m_i = j;
}
uint public m_i;
}
contract Base1 is Base {
- constructor(uint k) Base(k) {}
+ constructor(uint k) Base(k) public {}
}
contract Derived is Base, Base1 {
- constructor(uint i) Base1(i)
+ constructor(uint i) Base1(i) public
{}
}
contract Final is Derived(4) {
@@ -5530,7 +5530,7 @@ BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base_base_with_gap)
constructor(uint k) {}
}
contract Derived is Base, Base1 {
- constructor(uint i) Base(i) Base1(7) {}
+ constructor(uint i) Base(i) Base1(7) public {}
}
contract Final is Derived(4) {
}
@@ -5543,7 +5543,7 @@ BOOST_AUTO_TEST_CASE(simple_constant_variables_test)
{
char const* sourceCode = R"(
contract Foo {
- function getX() returns (uint r) { return x; }
+ function getX() public returns (uint r) { return x; }
uint constant x = 56;
}
)";
@@ -5569,7 +5569,7 @@ BOOST_AUTO_TEST_CASE(assignment_to_const_var_involving_expression)
char const* sourceCode = R"(
contract C {
uint constant x = 0x123 + 0x456;
- function f() returns (uint) { return x + 1; }
+ function f() public returns (uint) { return x + 1; }
}
)";
compileAndRun(sourceCode);
@@ -5581,7 +5581,7 @@ BOOST_AUTO_TEST_CASE(assignment_to_const_var_involving_keccak)
char const* sourceCode = R"(
contract C {
bytes32 constant x = keccak256("abc");
- function f() returns (bytes32) { return x; }
+ function f() public returns (bytes32) { return x; }
}
)";
compileAndRun(sourceCode);
@@ -5595,7 +5595,7 @@ BOOST_AUTO_TEST_CASE(assignment_to_const_var_involving_keccak)
// contract C {
// uint[3] constant x = [uint(1), 2, 3];
// uint constant y = x[0] + x[1] + x[2];
-// function f() returns (uint) { return y; }
+// function f() public returns (uint) { return y; }
// }
// )";
// compileAndRun(sourceCode);
@@ -5609,7 +5609,7 @@ BOOST_AUTO_TEST_CASE(assignment_to_const_var_involving_keccak)
// contract C {
// struct S { uint x; uint[] y; }
// S constant x = S(5, new uint[](4));
-// function f() returns (uint) { return x.x; }
+// function f() public returns (uint) { return x.x; }
// }
// )";
// compileAndRun(sourceCode);
@@ -5622,7 +5622,7 @@ BOOST_AUTO_TEST_CASE(packed_storage_structs_uint)
contract C {
struct str { uint8 a; uint16 b; uint248 c; }
str data;
- function test() returns (uint) {
+ function test() public returns (uint) {
data.a = 2;
if (data.a != 2) return 2;
data.b = 0xabcd;
@@ -5654,7 +5654,7 @@ BOOST_AUTO_TEST_CASE(packed_storage_structs_enum)
enum larger { A, B, C, D, E}
struct str { small a; small b; larger c; larger d; }
str data;
- function test() returns (uint) {
+ function test() public returns (uint) {
data.a = small.B;
if (data.a != small.B) return 2;
data.b = small.C;
@@ -5687,7 +5687,7 @@ BOOST_AUTO_TEST_CASE(packed_storage_structs_bytes)
byte x;
s2 data;
byte y;
- function test() returns (bool) {
+ function test() public returns (bool) {
x = 1;
data.a = 2;
data.inner.a = 3;
@@ -5716,7 +5716,7 @@ BOOST_AUTO_TEST_CASE(packed_storage_structs_delete)
uint8 x;
uint16 y;
str data;
- function test() returns (uint) {
+ function test() public returns (uint) {
x = 1;
y = 2;
data.a = 2;
@@ -5743,9 +5743,9 @@ BOOST_AUTO_TEST_CASE(overloaded_function_call_resolve_to_first)
{
char const* sourceCode = R"(
contract test {
- function f(uint k) returns(uint d) { return k; }
- function f(uint a, uint b) returns(uint d) { return a + b; }
- function g() returns(uint d) { return f(3); }
+ function f(uint k) public returns(uint d) { return k; }
+ function f(uint a, uint b) public returns(uint d) { return a + b; }
+ function g() public returns(uint d) { return f(3); }
}
)";
compileAndRun(sourceCode);
@@ -5756,9 +5756,9 @@ BOOST_AUTO_TEST_CASE(overloaded_function_call_resolve_to_second)
{
char const* sourceCode = R"(
contract test {
- function f(uint a, uint b) returns(uint d) { return a + b; }
- function f(uint k) returns(uint d) { return k; }
- function g() returns(uint d) { return f(3, 7); }
+ function f(uint a, uint b) public returns(uint d) { return a + b; }
+ function f(uint k) public returns(uint d) { return k; }
+ function g() public returns(uint d) { return f(3, 7); }
}
)";
compileAndRun(sourceCode);
@@ -5769,9 +5769,9 @@ BOOST_AUTO_TEST_CASE(overloaded_function_call_with_if_else)
{
char const* sourceCode = R"(
contract test {
- function f(uint a, uint b) returns(uint d) { return a + b; }
- function f(uint k) returns(uint d) { return k; }
- function g(bool flag) returns(uint d) {
+ function f(uint a, uint b) public returns(uint d) { return a + b; }
+ function f(uint k) public returns(uint d) { return k; }
+ function g(bool flag) public returns(uint d) {
if (flag)
return f(3);
else
@@ -5787,10 +5787,10 @@ BOOST_AUTO_TEST_CASE(overloaded_function_call_with_if_else)
BOOST_AUTO_TEST_CASE(derived_overload_base_function_direct)
{
char const* sourceCode = R"(
- contract B { function f() returns(uint) { return 10; } }
+ contract B { function f() public returns(uint) { return 10; } }
contract C is B {
- function f(uint i) returns(uint) { return 2 * i; }
- function g() returns(uint) { return f(1); }
+ function f(uint i) public returns(uint) { return 2 * i; }
+ function g() public returns(uint) { return f(1); }
}
)";
compileAndRun(sourceCode, 0, "C");
@@ -5800,11 +5800,11 @@ BOOST_AUTO_TEST_CASE(derived_overload_base_function_direct)
BOOST_AUTO_TEST_CASE(derived_overload_base_function_indirect)
{
char const* sourceCode = R"(
- contract A { function f(uint a) returns(uint) { return 2 * a; } }
- contract B { function f() returns(uint) { return 10; } }
+ contract A { function f(uint a) public returns(uint) { return 2 * a; } }
+ contract B { function f() public returns(uint) { return 10; } }
contract C is A, B {
- function g() returns(uint) { return f(); }
- function h() returns(uint) { return f(1); }
+ function g() public returns(uint) { return f(); }
+ function h() public returns(uint) { return f(1); }
}
)";
compileAndRun(sourceCode, 0, "C");
@@ -5815,11 +5815,11 @@ BOOST_AUTO_TEST_CASE(derived_overload_base_function_indirect)
BOOST_AUTO_TEST_CASE(super_overload)
{
char const* sourceCode = R"(
- contract A { function f(uint a) returns(uint) { return 2 * a; } }
- contract B { function f(bool b) returns(uint) { return 10; } }
+ contract A { function f(uint a) public returns(uint) { return 2 * a; } }
+ contract B { function f(bool b) public returns(uint) { return 10; } }
contract C is A, B {
- function g() returns(uint) { return super.f(true); }
- function h() returns(uint) { return super.f(1); }
+ function g() public returns(uint) { return super.f(true); }
+ function h() public returns(uint) { return super.f(1); }
}
)";
compileAndRun(sourceCode, 0, "C");
@@ -5831,8 +5831,8 @@ BOOST_AUTO_TEST_CASE(gasleft_shadow_resolution)
{
char const* sourceCode = R"(
contract C {
- function gasleft() returns(uint256) { return 0; }
- function f() returns(uint256) { return gasleft(); }
+ function gasleft() public returns(uint256) { return 0; }
+ function f() public returns(uint256) { return gasleft(); }
}
)";
compileAndRun(sourceCode, 0, "C");
@@ -5843,13 +5843,13 @@ BOOST_AUTO_TEST_CASE(bool_conversion)
{
char const* sourceCode = R"(
contract C {
- function f(bool _b) returns(uint) {
+ function f(bool _b) public returns(uint) {
if (_b)
return 1;
else
return 0;
}
- function g(bool _in) returns (bool _out) {
+ function g(bool _in) public returns (bool _out) {
_out = _in;
}
}
@@ -5875,7 +5875,7 @@ BOOST_AUTO_TEST_CASE(packed_storage_signed)
uint8 b;
int8 c;
uint8 d;
- function test() returns (uint x1, uint x2, uint x3, uint x4) {
+ function test() public returns (uint x1, uint x2, uint x3, uint x4) {
a = -2;
b = -uint8(a) * 2;
c = a * int8(120) * int8(121);
@@ -5893,15 +5893,15 @@ BOOST_AUTO_TEST_CASE(packed_storage_signed)
BOOST_AUTO_TEST_CASE(external_types_in_calls)
{
char const* sourceCode = R"(
- contract C1 { C1 public bla; constructor(C1 x) { bla = x; } }
+ contract C1 { C1 public bla; constructor(C1 x) public { bla = x; } }
contract C {
- function test() returns (C1 x, C1 y) {
+ function test() public returns (C1 x, C1 y) {
C1 c = new C1(C1(9));
x = c.bla();
y = this.t1(C1(7));
}
- function t1(C1 a) returns (C1) { return a; }
- function t2() returns (C1) { return C1(9); }
+ function t1(C1 a) public returns (C1) { return a; }
+ function t2() public returns (C1) { return C1(9); }
}
)";
compileAndRun(sourceCode, 0, "C");
@@ -5915,18 +5915,18 @@ BOOST_AUTO_TEST_CASE(invalid_enum_compared)
contract C {
enum X { A, B }
- function test_eq() returns (bool) {
+ function test_eq() public returns (bool) {
X garbled;
assembly {
garbled := 5
}
return garbled == garbled;
}
- function test_eq_ok() returns (bool) {
+ function test_eq_ok() public returns (bool) {
X garbled = X.A;
return garbled == garbled;
}
- function test_neq() returns (bool) {
+ function test_neq() public returns (bool) {
X garbled;
assembly {
garbled := 5
@@ -5949,7 +5949,7 @@ BOOST_AUTO_TEST_CASE(invalid_enum_logged)
enum X { A, B }
event Log(X);
- function test_log() returns (uint) {
+ function test_log() public returns (uint) {
X garbled = X.A;
assembly {
garbled := 5
@@ -5957,7 +5957,7 @@ BOOST_AUTO_TEST_CASE(invalid_enum_logged)
emit Log(garbled);
return 1;
}
- function test_log_ok() returns (uint) {
+ function test_log_ok() public returns (uint) {
X x = X.A;
emit Log(x);
return 1;
@@ -5983,7 +5983,7 @@ BOOST_AUTO_TEST_CASE(invalid_enum_stored)
enum X { A, B }
X public x;
- function test_store() returns (uint) {
+ function test_store() public returns (uint) {
X garbled = X.A;
assembly {
garbled := 5
@@ -5991,7 +5991,7 @@ BOOST_AUTO_TEST_CASE(invalid_enum_stored)
x = garbled;
return 1;
}
- function test_store_ok() returns (uint) {
+ function test_store_ok() public returns (uint) {
x = X.A;
return 1;
}
@@ -6011,19 +6011,19 @@ BOOST_AUTO_TEST_CASE(invalid_enum_as_external_ret)
contract C {
enum X { A, B }
- function test_return() returns (X) {
+ function test_return() public returns (X) {
X garbled;
assembly {
garbled := 5
}
return garbled;
}
- function test_inline_assignment() returns (X _ret) {
+ function test_inline_assignment() public returns (X _ret) {
assembly {
_ret := 5
}
}
- function test_assignment() returns (X _ret) {
+ function test_assignment() public returns (X _ret) {
X tmp;
assembly {
tmp := 5
@@ -6045,11 +6045,11 @@ BOOST_AUTO_TEST_CASE(invalid_enum_as_external_arg)
contract C {
enum X { A, B }
- function tested (X x) returns (uint) {
+ function tested (X x) public returns (uint) {
return 1;
}
- function test() returns (uint) {
+ function test() public returns (uint) {
X garbled;
assembly {
@@ -6071,19 +6071,19 @@ BOOST_AUTO_TEST_CASE(proper_order_of_overwriting_of_attributes)
// bug #1798
char const* sourceCode = R"(
contract init {
- function isOk() returns (bool) { return false; }
+ function isOk() public returns (bool) { return false; }
bool public ok = false;
}
contract fix {
- function isOk() returns (bool) { return true; }
+ function isOk() public returns (bool) { return true; }
bool public ok = true;
}
contract init_fix is init, fix {
- function checkOk() returns (bool) { return ok; }
+ function checkOk() public returns (bool) { return ok; }
}
contract fix_init is fix, init {
- function checkOk() returns (bool) { return ok; }
+ function checkOk() public returns (bool) { return ok; }
}
)";
compileAndRun(sourceCode, 0, "init_fix");
@@ -6110,7 +6110,7 @@ BOOST_AUTO_TEST_CASE(struct_assign_reference_to_struct)
{
data1.m_value = 2;
}
- function assign() returns (uint ret_local, uint ret_global, uint ret_global3, uint ret_global1)
+ function assign() public returns (uint ret_local, uint ret_global, uint ret_global3, uint ret_global1)
{
testStruct x = data1; //x is a reference data1.m_value == 2 as well as x.m_value = 2
data2 = data1; // should copy data. data2.m_value == 2
@@ -6142,7 +6142,7 @@ BOOST_AUTO_TEST_CASE(struct_delete_member)
{
data1.m_value = 2;
}
- function deleteMember() returns (uint ret_value)
+ function deleteMember() public returns (uint ret_value)
{
testStruct x = data1; //should not copy the data. data1.m_value == 2 but x.m_value = 0
x.m_value = 4;
@@ -6169,7 +6169,7 @@ BOOST_AUTO_TEST_CASE(struct_delete_struct_in_mapping)
{
campaigns[0].m_value = 2;
}
- function deleteIt() returns (uint)
+ function deleteIt() public returns (uint)
{
delete campaigns[0];
return campaigns[0].m_value;
@@ -6186,11 +6186,11 @@ BOOST_AUTO_TEST_CASE(evm_exceptions_out_of_band_access)
contract A {
uint[3] arr;
bool public test = false;
- function getElement(uint i) returns (uint)
+ function getElement(uint i) public returns (uint)
{
return arr[i];
}
- function testIt() returns (bool)
+ function testIt() public returns (bool)
{
uint i = this.getElement(5);
test = true;
@@ -6271,8 +6271,8 @@ BOOST_AUTO_TEST_CASE(failing_send)
}
}
contract Main {
- constructor() payable {}
- function callHelper(address _a) returns (bool r, uint bal) {
+ constructor() public payable {}
+ function callHelper(address _a) public returns (bool r, uint bal) {
r = !_a.send(5);
bal = this.balance;
}
@@ -6294,8 +6294,8 @@ BOOST_AUTO_TEST_CASE(send_zero_ether)
}
}
contract Main {
- constructor() payable {}
- function s() returns (bool) {
+ constructor() public payable {}
+ function s() public returns (bool) {
Receiver r = new Receiver();
return r.send(0);
}
@@ -6311,17 +6311,17 @@ BOOST_AUTO_TEST_CASE(reusing_memory)
char const* sourceCode = R"(
contract Helper {
uint public flag;
- constructor(uint x) {
+ constructor(uint x) public {
flag = x;
}
}
contract Main {
mapping(uint => uint) map;
- function f(uint x) returns (uint) {
+ function f(uint x) public returns (uint) {
map[x] = x;
return (new Helper(uint(keccak256(abi.encodePacked(this.g(map[x])))))).flag();
}
- function g(uint a) returns (uint)
+ function g(uint a) public returns (uint)
{
return map[a];
}
@@ -6339,10 +6339,10 @@ BOOST_AUTO_TEST_CASE(return_string)
function set(string _s) external {
s = _s;
}
- function get1() returns (string r) {
+ function get1() public returns (string r) {
return s;
}
- function get2() returns (string r) {
+ function get2() public returns (string r) {
r = s;
}
}
@@ -6367,7 +6367,7 @@ BOOST_AUTO_TEST_CASE(return_multiple_strings_of_various_sizes)
s2 = _s2;
return x;
}
- function get() returns (string r1, string r2) {
+ function get() public returns (string r1, string r2) {
r1 = s1;
r2 = s2;
}
@@ -6440,12 +6440,12 @@ BOOST_AUTO_TEST_CASE(bytes_in_function_calls)
contract Main {
string public s1;
string public s2;
- function set(string _s1, uint x, string _s2) returns (uint) {
+ function set(string _s1, uint x, string _s2) public returns (uint) {
s1 = _s1;
s2 = _s2;
return x;
}
- function setIndirectFromMemory(string _s1, uint x, string _s2) returns (uint) {
+ function setIndirectFromMemory(string _s1, uint x, string _s2) public returns (uint) {
return this.set(_s1, x, _s2);
}
function setIndirectFromCalldata(string _s1, uint x, string _s2) external returns (uint) {
@@ -6485,7 +6485,7 @@ BOOST_AUTO_TEST_CASE(return_bytes_internal)
char const* sourceCode = R"(
contract Main {
bytes s1;
- function doSet(bytes _s1) returns (bytes _r1) {
+ function doSet(bytes _s1) public returns (bytes _r1) {
s1 = _s1;
_r1 = s1;
}
@@ -6513,15 +6513,15 @@ BOOST_AUTO_TEST_CASE(bytes_index_access_memory)
{
char const* sourceCode = R"(
contract Main {
- function f(bytes _s1, uint i1, uint i2, uint i3) returns (byte c1, byte c2, byte c3) {
+ function f(bytes _s1, uint i1, uint i2, uint i3) public returns (byte c1, byte c2, byte c3) {
c1 = _s1[i1];
c2 = intern(_s1, i2);
c3 = internIndirect(_s1)[i3];
}
- function intern(bytes _s1, uint i) returns (byte c) {
+ function intern(bytes _s1, uint i) public returns (byte c) {
return _s1[i];
}
- function internIndirect(bytes _s1) returns (bytes) {
+ function internIndirect(bytes _s1) public returns (bytes) {
return _s1;
}
}
@@ -6542,7 +6542,7 @@ BOOST_AUTO_TEST_CASE(bytes_in_constructors_unpacker)
contract Test {
uint public m_x;
bytes public m_s;
- constructor(uint x, bytes s) {
+ constructor(uint x, bytes s) public {
m_x = x;
m_s = s;
}
@@ -6563,22 +6563,22 @@ BOOST_AUTO_TEST_CASE(bytes_in_constructors_packer)
contract Base {
uint public m_x;
bytes m_s;
- constructor(uint x, bytes s) {
+ constructor(uint x, bytes s) public {
m_x = x;
m_s = s;
}
- function part(uint i) returns (byte) {
+ function part(uint i) public returns (byte) {
return m_s[i];
}
}
contract Main is Base {
- constructor(bytes s, uint x) Base(x, f(s)) {}
- function f(bytes s) returns (bytes) {
+ constructor(bytes s, uint x) Base(x, f(s)) public {}
+ function f(bytes s) public returns (bytes) {
return s;
}
}
contract Creator {
- function f(uint x, bytes s) returns (uint r, byte ch) {
+ function f(uint x, bytes s) public returns (uint r, byte ch) {
Main c = new Main(s, x);
r = c.m_x();
ch = c.part(x);
@@ -6602,22 +6602,22 @@ BOOST_AUTO_TEST_CASE(arrays_in_constructors)
contract Base {
uint public m_x;
address[] m_s;
- constructor(uint x, address[] s) {
+ constructor(uint x, address[] s) public {
m_x = x;
m_s = s;
}
- function part(uint i) returns (address) {
+ function part(uint i) public returns (address) {
return m_s[i];
}
}
contract Main is Base {
- constructor(address[] s, uint x) Base(x, f(s)) {}
- function f(address[] s) returns (address[]) {
+ constructor(address[] s, uint x) Base(x, f(s)) public {}
+ function f(address[] s) public returns (address[]) {
return s;
}
}
contract Creator {
- function f(uint x, address[] s) returns (uint r, address ch) {
+ function f(uint x, address[] s) public returns (uint r, address ch) {
Main c = new Main(s, x);
r = c.m_x();
ch = c.part(x);
@@ -6641,7 +6641,7 @@ BOOST_AUTO_TEST_CASE(fixed_arrays_in_constructors)
contract Creator {
uint public r;
address public ch;
- constructor(address[3] s, uint x) {
+ constructor(address[3] s, uint x) public {
r = x;
ch = s[2];
}
@@ -6657,11 +6657,11 @@ BOOST_AUTO_TEST_CASE(arrays_from_and_to_storage)
char const* sourceCode = R"(
contract Test {
uint24[] public data;
- function set(uint24[] _data) returns (uint) {
+ function set(uint24[] _data) public returns (uint) {
data = _data;
return data.length;
}
- function get() returns (uint24[]) {
+ function get() public returns (uint24[]) {
return data;
}
}
@@ -6684,11 +6684,11 @@ BOOST_AUTO_TEST_CASE(arrays_complex_from_and_to_storage)
char const* sourceCode = R"(
contract Test {
uint24[3][] public data;
- function set(uint24[3][] _data) returns (uint) {
+ function set(uint24[3][] _data) public returns (uint) {
data = _data;
return data.length;
}
- function get() returns (uint24[3][]) {
+ function get() public returns (uint24[3][]) {
return data;
}
}
@@ -6710,7 +6710,7 @@ BOOST_AUTO_TEST_CASE(arrays_complex_memory_index_access)
{
char const* sourceCode = R"(
contract Test {
- function set(uint24[3][] _data, uint a, uint b) returns (uint l, uint e) {
+ function set(uint24[3][] _data, uint a, uint b) public returns (uint l, uint e) {
l = _data.length;
e = _data[a][b];
}
@@ -6733,7 +6733,7 @@ BOOST_AUTO_TEST_CASE(bytes_memory_index_access)
{
char const* sourceCode = R"(
contract Test {
- function set(bytes _data, uint i) returns (uint l, byte c) {
+ function set(bytes _data, uint i) public returns (uint l, byte c) {
l = _data.length;
c = _data[i];
}
@@ -6780,7 +6780,7 @@ BOOST_AUTO_TEST_CASE(storage_array_ref)
data.length++;
data[data.length - 1] = v;
}
- function find(uint v) returns (uint) {
+ function find(uint v) public returns (uint) {
return find(data, v);
}
}
@@ -6809,13 +6809,13 @@ BOOST_AUTO_TEST_CASE(memory_types_initialisation)
char const* sourceCode = R"(
contract Test {
mapping(uint=>uint) data;
- function stat() returns (uint[5])
+ function stat() public returns (uint[5])
{
data[2] = 3; // make sure to use some memory
}
- function dyn() returns (uint[]) { stat(); }
- function nested() returns (uint[3][]) { stat(); }
- function nestedStat() returns (uint[3][7]) { stat(); }
+ function dyn() public returns (uint[]) { stat(); }
+ function nested() public returns (uint[3][]) { stat(); }
+ function nestedStat() public returns (uint[3][7]) { stat(); }
}
)";
compileAndRun(sourceCode, 0, "Test");
@@ -6830,7 +6830,7 @@ BOOST_AUTO_TEST_CASE(memory_arrays_delete)
{
char const* sourceCode = R"(
contract Test {
- function del() returns (uint24[3][4]) {
+ function del() public returns (uint24[3][4]) {
uint24[3][4] memory x;
for (uint24 i = 0; i < x.length; i ++)
for (uint24 j = 0; j < x[i].length; j ++)
@@ -6863,7 +6863,7 @@ BOOST_AUTO_TEST_CASE(memory_arrays_index_access_write)
x[2][2] = 1;
x[3][2] = 7;
}
- function f() returns (uint24[3][4]){
+ function f() public returns (uint24[3][4]){
uint24[3][4] memory data;
set(data);
return data;
@@ -6888,7 +6888,7 @@ BOOST_AUTO_TEST_CASE(memory_arrays_dynamic_index_access_write)
x[1][3][2] = 7;
return x;
}
- function f() returns (uint24[3][]) {
+ function f() public returns (uint24[3][]) {
data[1].length = 4;
return set(data)[1];
}
@@ -6908,7 +6908,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_read_write)
contract Test {
struct S { uint8 x; uint16 y; uint z; uint8[2] a; }
S[5] data;
- function testInit() returns (uint8 x, uint16 y, uint z, uint8 a, bool flag) {
+ function testInit() public returns (uint8 x, uint16 y, uint z, uint8 a, bool flag) {
S[2] memory d;
x = d[0].x;
y = d[0].y;
@@ -6916,7 +6916,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_read_write)
a = d[0].a[1];
flag = true;
}
- function testCopyRead() returns (uint8 x, uint16 y, uint z, uint8 a) {
+ function testCopyRead() public returns (uint8 x, uint16 y, uint z, uint8 a) {
data[2].x = 1;
data[2].y = 2;
data[2].z = 3;
@@ -6927,7 +6927,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_read_write)
z = s.z;
a = s.a[1];
}
- function testAssign() returns (uint8 x, uint16 y, uint z, uint8 a) {
+ function testAssign() public returns (uint8 x, uint16 y, uint z, uint8 a) {
S memory s;
s.x = 1;
s.y = 2;
@@ -6952,7 +6952,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_as_function_args)
char const* sourceCode = R"(
contract Test {
struct S { uint8 x; uint16 y; uint z; }
- function test() returns (uint x, uint y, uint z) {
+ function test() public returns (uint x, uint y, uint z) {
S memory data = combine(1, 2, 3);
x = extract(data, 0);
y = extract(data, 1);
@@ -6981,7 +6981,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_nested)
contract Test {
struct S { uint8 x; uint16 y; uint z; }
struct X { uint8 x; S s; }
- function test() returns (uint a, uint x, uint y, uint z) {
+ function test() public returns (uint a, uint x, uint y, uint z) {
X memory d = combine(1, 2, 3, 4);
a = extract(d, 0);
x = extract(d, 1);
@@ -7014,7 +7014,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_nested_load)
struct S { uint8 x; uint16 y; uint z; }
struct X { uint8 x; S s; uint8[2] a; }
X m_x;
- function load() returns (uint a, uint x, uint y, uint z, uint a1, uint a2) {
+ function load() public returns (uint a, uint x, uint y, uint z, uint a1, uint a2) {
m_x.x = 1;
m_x.s.x = 2;
m_x.s.y = 3;
@@ -7029,7 +7029,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_nested_load)
a1 = d.a[0];
a2 = d.a[1];
}
- function store() returns (uint a, uint x, uint y, uint z, uint a1, uint a2) {
+ function store() public returns (uint a, uint x, uint y, uint z, uint a1, uint a2) {
X memory d;
d.x = 1;
d.s.x = 2;
@@ -7061,12 +7061,12 @@ BOOST_AUTO_TEST_CASE(struct_constructor_nested)
struct X { uint x1; uint x2; }
struct S { uint s1; uint[3] s2; X s3; }
S s;
- constructor() {
+ constructor() public {
uint[3] memory s2;
s2[1] = 9;
s = S(1, s2, X(4, 5));
}
- function get() returns (uint s1, uint[3] s2, uint x1, uint x2)
+ function get() public returns (uint s1, uint[3] s2, uint x1, uint x2)
{
s1 = s.s1;
s2 = s.s2;
@@ -7087,7 +7087,7 @@ BOOST_AUTO_TEST_CASE(struct_named_constructor)
contract C {
struct S { uint a; bool x; }
S public s;
- constructor() {
+ constructor() public {
s = S({a: 1, x: true});
}
}
@@ -7105,7 +7105,7 @@ BOOST_AUTO_TEST_CASE(literal_strings)
string public medium;
string public short;
string public empty;
- function f() returns (string) {
+ function f() public returns (string) {
long = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678900123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
medium = "01234567890123456789012345678901234567890123456789012345678901234567890123456789";
short = "123";
@@ -7149,7 +7149,7 @@ BOOST_AUTO_TEST_CASE(memory_structs_with_mappings)
contract Test {
struct S { uint8 a; mapping(uint => uint) b; uint8 c; }
S s;
- function f() returns (uint) {
+ function f() public returns (uint) {
S memory x;
if (x.a != 0 || x.c != 0) return 1;
x.a = 4; x.c = 5;
@@ -7172,12 +7172,12 @@ BOOST_AUTO_TEST_CASE(string_bytes_conversion)
contract Test {
string s;
bytes b;
- function f(string _s, uint n) returns (byte) {
+ function f(string _s, uint n) public returns (byte) {
b = bytes(_s);
s = string(b);
return bytes(s)[n];
}
- function l() returns (uint) { return bytes(s).length; }
+ function l() public returns (uint) { return bytes(s).length; }
}
)";
compileAndRun(sourceCode, 0, "Test");
@@ -7197,7 +7197,7 @@ BOOST_AUTO_TEST_CASE(string_as_mapping_key)
contract Test {
mapping(string => uint) data;
function set(string _s, uint _v) { data[_s] = _v; }
- function get(string _s) returns (uint) { return data[_s]; }
+ function get(string _s) public returns (uint) { return data[_s]; }
}
)";
compileAndRun(sourceCode, 0, "Test");
@@ -7254,7 +7254,7 @@ BOOST_AUTO_TEST_CASE(state_variable_under_contract_name)
contract Scope {
uint stateVar = 42;
- function getStateVar() view returns (uint stateVar) {
+ function getStateVar() public view returns (uint stateVar) {
stateVar = Scope.stateVar;
}
}
@@ -7269,7 +7269,7 @@ BOOST_AUTO_TEST_CASE(state_variable_local_variable_mixture)
contract A {
uint x = 1;
uint y = 2;
- function a() returns (uint x) {
+ function a() public returns (uint x) {
x = A.y;
}
}
@@ -7284,7 +7284,7 @@ BOOST_AUTO_TEST_CASE(inherited_function) {
contract A { function f() internal returns (uint) { return 1; } }
contract B is A {
function f() internal returns (uint) { return 2; }
- function g() returns (uint) {
+ function g() public returns (uint) {
return A.f();
}
}
@@ -7299,7 +7299,7 @@ BOOST_AUTO_TEST_CASE(inherited_function_from_a_library) {
library A { function f() internal returns (uint) { return 1; } }
contract B {
function f() internal returns (uint) { return 2; }
- function g() returns (uint) {
+ function g() public returns (uint) {
return A.f();
}
}
@@ -7316,7 +7316,7 @@ BOOST_AUTO_TEST_CASE(inherited_constant_state_var)
uint constant x = 7;
}
contract B is A {
- function f() returns (uint) {
+ function f() public returns (uint) {
return A.x;
}
}
@@ -7336,17 +7336,17 @@ BOOST_AUTO_TEST_CASE(multiple_inherited_state_vars)
uint x = 9;
}
contract C is A, B {
- function a() returns (uint) {
+ function a() public returns (uint) {
return A.x;
}
- function b() returns (uint) {
+ function b() public returns (uint) {
return B.x;
}
- function a_set(uint _x) returns (uint) {
+ function a_set(uint _x) public returns (uint) {
A.x = _x;
return 1;
}
- function b_set(uint _x) returns (uint) {
+ function b_set(uint _x) public returns (uint) {
B.x = _x;
return 1;
}
@@ -7369,14 +7369,14 @@ BOOST_AUTO_TEST_CASE(constant_string_literal)
bytes32 constant public b = "abcdefghijklmnopq";
string constant public x = "abefghijklmnopqabcdefghijklmnopqabcdefghijklmnopqabca";
- constructor() {
+ constructor() public {
string memory xx = x;
bytes32 bb = b;
}
- function getB() returns (bytes32) { return b; }
- function getX() returns (string) { return x; }
- function getX2() returns (string r) { r = x; }
- function unused() returns (uint) {
+ function getB() public returns (bytes32) { return b; }
+ function getX() public returns (string) { return x; }
+ function getX2() public returns (string r) { r = x; }
+ function unused() public returns (uint) {
"unusedunusedunusedunusedunusedunusedunusedunusedunusedunusedunusedunused";
return 2;
}
@@ -7399,7 +7399,7 @@ BOOST_AUTO_TEST_CASE(storage_string_as_mapping_key_without_variable)
char const* sourceCode = R"(
contract Test {
mapping(string => uint) data;
- function f() returns (uint) {
+ function f() public returns (uint) {
data["abc"] = 2;
return data["abc"];
}
@@ -7412,9 +7412,9 @@ BOOST_AUTO_TEST_CASE(storage_string_as_mapping_key_without_variable)
BOOST_AUTO_TEST_CASE(library_call)
{
char const* sourceCode = R"(
- library Lib { function m(uint x, uint y) returns (uint) { return x * y; } }
+ library Lib { function m(uint x, uint y) public returns (uint) { return x * y; } }
contract Test {
- function f(uint x) returns (uint) {
+ function f(uint x) public returns (uint) {
return Lib.m(x, 9);
}
}
@@ -7442,9 +7442,9 @@ BOOST_AUTO_TEST_CASE(library_function_external)
BOOST_AUTO_TEST_CASE(library_stray_values)
{
char const* sourceCode = R"(
- library Lib { function m(uint x, uint y) returns (uint) { return x * y; } }
+ library Lib { function m(uint x, uint y) public returns (uint) { return x * y; } }
contract Test {
- function f(uint x) returns (uint) {
+ function f(uint x) public returns (uint) {
Lib;
Lib.m;
return x + 9;
@@ -7461,7 +7461,7 @@ BOOST_AUTO_TEST_CASE(cross_contract_types)
char const* sourceCode = R"(
contract Lib { struct S {uint a; uint b; } }
contract Test {
- function f() returns (uint r) {
+ function f() public returns (uint r) {
Lib.S memory x = Lib.S({a: 2, b: 3});
r = x.b;
}
@@ -7475,7 +7475,7 @@ BOOST_AUTO_TEST_CASE(simple_throw)
{
char const* sourceCode = R"(
contract Test {
- function f(uint x) returns (uint) {
+ function f(uint x) public returns (uint) {
if (x > 10)
return x + 10;
else
@@ -7505,19 +7505,19 @@ BOOST_AUTO_TEST_CASE(strings_in_struct)
constructor(){
bug = Buggy(10, 20, 30, "asdfghjkl");
}
- function getFirst() returns (uint)
+ function getFirst() public returns (uint)
{
return bug.first;
}
- function getSecond() returns (uint)
+ function getSecond() public returns (uint)
{
return bug.second;
}
- function getThird() returns (uint)
+ function getThird() public returns (uint)
{
return bug.third;
}
- function getLast() returns (string)
+ function getLast() public returns (string)
{
return bug.last;
}
@@ -7535,7 +7535,7 @@ BOOST_AUTO_TEST_CASE(fixed_arrays_as_return_type)
{
char const* sourceCode = R"(
contract A {
- function f(uint16 input) pure returns (uint16[5] arr)
+ function f(uint16 input) public pure returns (uint16[5] arr)
{
arr[0] = input;
arr[1] = ++input;
@@ -7545,7 +7545,7 @@ BOOST_AUTO_TEST_CASE(fixed_arrays_as_return_type)
}
}
contract B {
- function f() returns (uint16[5] res, uint16[5] res2)
+ function f() public returns (uint16[5] res, uint16[5] res2)
{
A a = new A();
res = a.f(2);
@@ -7564,7 +7564,7 @@ BOOST_AUTO_TEST_CASE(internal_types_in_library)
{
char const* sourceCode = R"(
library Lib {
- function find(uint16[] storage _haystack, uint16 _needle) view returns (uint)
+ function find(uint16[] storage _haystack, uint16 _needle) public view returns (uint)
{
for (uint i = 0; i < _haystack.length; ++i)
if (_haystack[i] == _needle)
@@ -7574,7 +7574,7 @@ BOOST_AUTO_TEST_CASE(internal_types_in_library)
}
contract Test {
mapping(string => uint16[]) data;
- function f() returns (uint a, uint b)
+ function f() public returns (uint a, uint b)
{
data["abc"].length = 20;
data["abc"][4] = 9;
@@ -7603,7 +7603,7 @@ BOOST_AUTO_TEST_CASE(using_library_structs)
}
contract Test {
mapping(string => Lib.Data) data;
- function f() returns (uint a, uint b)
+ function f() public returns (uint a, uint b)
{
Lib.set(data["abc"]);
a = data["abc"].a;
@@ -7627,7 +7627,7 @@ BOOST_AUTO_TEST_CASE(library_struct_as_an_expression)
}
contract Tsra {
- function f() returns(uint) {
+ function f() public returns(uint) {
Arst.Foo;
return 1;
}
@@ -7648,7 +7648,7 @@ BOOST_AUTO_TEST_CASE(library_enum_as_an_expression)
}
contract Tsra {
- function f() returns(uint) {
+ function f() public returns(uint) {
Arst.Foo;
return 1;
}
@@ -7666,7 +7666,7 @@ BOOST_AUTO_TEST_CASE(short_strings)
contract A {
bytes public data1 = "123";
bytes data2;
- function lengthChange() returns (uint)
+ function lengthChange() public returns (uint)
{
// store constant in short and long string
data1 = "123";
@@ -7708,7 +7708,7 @@ BOOST_AUTO_TEST_CASE(short_strings)
data1.length = 0;
data2.length = 0;
}
- function copy() returns (uint) {
+ function copy() public returns (uint) {
bytes memory x = "123";
bytes memory y = "012345678901234567890123456789012345678901234567890123456789";
bytes memory z = "1234567";
@@ -7741,7 +7741,7 @@ BOOST_AUTO_TEST_CASE(short_strings)
data1 = "";
data2 = "";
}
- function deleteElements() returns (uint) {
+ function deleteElements() public returns (uint) {
data1 = "01234";
delete data1[2];
if (data1[2] != 0) return 1;
@@ -7790,9 +7790,9 @@ BOOST_AUTO_TEST_CASE(calldata_offset)
BOOST_AUTO_TEST_CASE(contract_binary_dependencies)
{
char const* sourceCode = R"(
- contract A { function f() { new B(); } }
- contract B { function f() { } }
- contract C { function f() { new B(); } }
+ contract A { function f() public { new B(); } }
+ contract B { function f() public { } }
+ contract C { function f() public { new B(); } }
)";
compileAndRun(sourceCode);
}
@@ -7802,8 +7802,8 @@ BOOST_AUTO_TEST_CASE(reject_ether_sent_to_library)
char const* sourceCode = R"(
library lib {}
contract c {
- constructor() payable {}
- function f(address x) returns (bool) {
+ constructor() public payable {}
+ function f(address x) public returns (bool) {
return x.send(1);
}
function () external payable {}
@@ -7826,10 +7826,10 @@ BOOST_AUTO_TEST_CASE(multi_variable_declaration)
{
char const* sourceCode = R"(
contract C {
- function g() returns (uint a, uint b, uint c) {
+ function g() public returns (uint a, uint b, uint c) {
a = 1; b = 2; c = 3;
}
- function f() returns (bool) {
+ function f() public returns (bool) {
(uint x, uint y, uint z) = g();
if (x != 1 || y != 2 || z != 3) return false;
(, uint a,) = g();
@@ -7856,7 +7856,7 @@ BOOST_AUTO_TEST_CASE(typed_multi_variable_declaration)
s.x = 7;
return (1, s, 2);
}
- function f() returns (bool) {
+ function f() public returns (bool) {
(uint x1, S storage y1, uint z1) = g();
if (x1 != 1 || y1.x != 7 || z1 != 2) return false;
(, S storage y2,) = g();
@@ -7878,24 +7878,25 @@ BOOST_AUTO_TEST_CASE(tuples)
char const* sourceCode = R"(
contract C {
uint[] data;
+ uint[] m_c;
function g() internal returns (uint a, uint b, uint[] storage c) {
return (1, 2, data);
}
function h() external returns (uint a, uint b) {
return (5, 6);
}
- function f() returns (uint) {
+ function f() public returns (uint) {
data.length = 1;
data[0] = 3;
uint a; uint b;
(a, b) = this.h();
if (a != 5 || b != 6) return 1;
- uint[] storage c;
+ uint[] storage c = m_c;
(a, b, c) = g();
if (a != 1 || b != 2 || c[0] != 3) return 2;
(a, b) = (b, a);
if (a != 2 || b != 1) return 3;
- (a, , b, ) = (8, 9, 10, 11, 12);
+ (a, , b, , ) = (8, 9, 10, 11, 12);
if (a != 8 || b != 10) return 4;
}
}
@@ -7908,14 +7909,14 @@ BOOST_AUTO_TEST_CASE(string_tuples)
{
char const* sourceCode = R"(
contract C {
- function f() returns (string, uint) {
+ function f() public returns (string, uint) {
return ("abc", 8);
}
- function g() returns (string, string) {
+ function g() public returns (string, string) {
return (h(), "def");
}
- function h() returns (string) {
- return ("abc",);
+ function h() public returns (string) {
+ return ("abc");
}
}
)";
@@ -7928,7 +7929,7 @@ BOOST_AUTO_TEST_CASE(decayed_tuple)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
uint x = 1;
(x) = 2;
return x;
@@ -7943,7 +7944,7 @@ BOOST_AUTO_TEST_CASE(inline_tuple_with_rational_numbers)
{
char const* sourceCode = R"(
contract c {
- function f() returns (int8) {
+ function f() public returns (int8) {
int8[5] memory foo3 = [int8(1), -1, 0, 0, 0];
return foo3[0];
}
@@ -7961,13 +7962,13 @@ BOOST_AUTO_TEST_CASE(destructuring_assignment)
bytes data;
uint[] y;
uint[] arrayData;
- function returnsArray() returns (uint[]) {
+ function returnsArray() public returns (uint[]) {
arrayData.length = 9;
arrayData[2] = 5;
arrayData[7] = 4;
return arrayData;
}
- function f(bytes s) returns (uint) {
+ function f(bytes s) public returns (uint) {
uint loc;
uint[] memory memArray;
(loc, x, y, data, arrayData[3]) = (8, 4, returnsArray(), s, 2);
@@ -7983,7 +7984,7 @@ BOOST_AUTO_TEST_CASE(destructuring_assignment)
if (loc != 3) return 9;
if (memArray.length != arrayData.length) return 10;
bytes memory memBytes;
- (x, memBytes, y[2], ) = (456, s, 789, 101112, 131415);
+ (x, memBytes, y[2], , ) = (456, s, 789, 101112, 131415);
if (x != 456 || memBytes.length != s.length || y[2] != 789) return 11;
}
}
@@ -7992,37 +7993,12 @@ BOOST_AUTO_TEST_CASE(destructuring_assignment)
ABI_CHECK(callContractFunction("f(bytes)", u256(0x20), u256(5), string("abcde")), encodeArgs(u256(0)));
}
-BOOST_AUTO_TEST_CASE(destructuring_assignment_wildcard)
-{
- char const* sourceCode = R"(
- contract C {
- function f() returns (uint) {
- uint a;
- uint b;
- uint c;
- (a,) = (1,);
- if (a != 1) return 1;
- (,b) = (2,3,4);
- if (b != 4) return 2;
- (, c,) = (5,6,7);
- if (c != 6) return 3;
- (a, b,) = (11, 12, 13);
- if (a != 11 || b != 12) return 4;
- (, a, b) = (11, 12, 13);
- if (a != 12 || b != 13) return 5;
- }
- }
- )";
- compileAndRun(sourceCode);
- ABI_CHECK(callContractFunction("f()"), encodeArgs(u256(0)));
-}
-
BOOST_AUTO_TEST_CASE(lone_struct_array_type)
{
char const* sourceCode = R"(
contract C {
struct s { uint a; uint b;}
- function f() returns (uint) {
+ function f() public returns (uint) {
s[7][]; // This is only the type, should not have any effect
return 3;
}
@@ -8037,7 +8013,7 @@ BOOST_AUTO_TEST_CASE(create_memory_array)
char const* sourceCode = R"(
contract C {
struct S { uint[2] a; bytes b; }
- function f() returns (byte, uint, uint, byte) {
+ function f() public returns (byte, uint, uint, byte) {
bytes memory x = new bytes(200);
x[199] = 'A';
uint[2][] memory y = new uint[2][](300);
@@ -8060,7 +8036,7 @@ BOOST_AUTO_TEST_CASE(create_memory_array_allocation_size)
// multiple of 32
char const* sourceCode = R"(
contract C {
- function f() pure returns (uint d1, uint d2, uint d3) {
+ function f() public pure returns (uint d1, uint d2, uint d3, uint memsize) {
bytes memory b1 = new bytes(31);
bytes memory b2 = new bytes(32);
bytes memory b3 = new bytes(256);
@@ -8069,12 +8045,13 @@ BOOST_AUTO_TEST_CASE(create_memory_array_allocation_size)
d1 := sub(b2, b1)
d2 := sub(b3, b2)
d3 := sub(b4, b3)
+ memsize := msize()
}
}
}
)";
compileAndRun(sourceCode);
- ABI_CHECK(callContractFunction("f()"), encodeArgs(0x40, 0x40, 0x20 + 256));
+ ABI_CHECK(callContractFunction("f()"), encodeArgs(0x40, 0x40, 0x20 + 256, 0x260));
}
BOOST_AUTO_TEST_CASE(memory_arrays_of_various_sizes)
@@ -8082,7 +8059,7 @@ BOOST_AUTO_TEST_CASE(memory_arrays_of_various_sizes)
// Computes binomial coefficients the chinese way
char const* sourceCode = R"(
contract C {
- function f(uint n, uint k) returns (uint) {
+ function f(uint n, uint k) public returns (uint) {
uint[][] memory rows = new uint[][](n + 1);
for (uint i = 1; i <= n; i++) {
rows[i] = new uint[](i);
@@ -8103,7 +8080,7 @@ BOOST_AUTO_TEST_CASE(create_multiple_dynamic_arrays)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
uint[][] memory x = new uint[][](42);
assert(x[0].length == 0);
x[0] = new uint[](1);
@@ -8138,7 +8115,7 @@ BOOST_AUTO_TEST_CASE(memory_overwrite)
{
char const* sourceCode = R"(
contract C {
- function f() returns (bytes x) {
+ function f() public returns (bytes x) {
x = "12345";
x[3] = 0x61;
x[0] = 0x62;
@@ -8153,7 +8130,7 @@ BOOST_AUTO_TEST_CASE(addmod_mulmod)
{
char const* sourceCode = R"(
contract C {
- function test() returns (uint) {
+ function test() public returns (uint) {
// Note that this only works because computation on literals is done using
// unbounded integers.
if ((2**255 + 2**255) % 7 != addmod(2**255, 2**255, 7))
@@ -8172,15 +8149,15 @@ BOOST_AUTO_TEST_CASE(addmod_mulmod_zero)
{
char const* sourceCode = R"(
contract C {
- function f(uint d) pure returns (uint) {
+ function f(uint d) public pure returns (uint) {
addmod(1, 2, d);
return 2;
}
- function g(uint d) pure returns (uint) {
+ function g(uint d) public pure returns (uint) {
mulmod(1, 2, d);
return 2;
}
- function h() pure returns (uint) {
+ function h() public pure returns (uint) {
mulmod(0, 1, 2);
mulmod(1, 0, 2);
addmod(0, 1, 2);
@@ -8199,10 +8176,10 @@ BOOST_AUTO_TEST_CASE(divisiod_by_zero)
{
char const* sourceCode = R"(
contract C {
- function div(uint a, uint b) returns (uint) {
+ function div(uint a, uint b) public returns (uint) {
return a / b;
}
- function mod(uint a, uint b) returns (uint) {
+ function mod(uint a, uint b) public returns (uint) {
return a % b;
}
}
@@ -8223,7 +8200,7 @@ BOOST_AUTO_TEST_CASE(string_allocation_bug)
{
struct s { uint16 x; uint16 y; string a; string b;}
s[2] public p;
- constructor() {
+ constructor() public {
s memory m;
m.x = 0xbbbb;
m.y = 0xcccc;
@@ -8249,10 +8226,10 @@ BOOST_AUTO_TEST_CASE(string_allocation_bug)
BOOST_AUTO_TEST_CASE(using_for_function_on_int)
{
char const* sourceCode = R"(
- library D { function double(uint self) returns (uint) { return 2*self; } }
+ library D { function double(uint self) public returns (uint) { return 2*self; } }
contract C {
using D for uint;
- function f(uint a) returns (uint) {
+ function f(uint a) public returns (uint) {
return a.double();
}
}
@@ -8265,11 +8242,11 @@ BOOST_AUTO_TEST_CASE(using_for_function_on_int)
BOOST_AUTO_TEST_CASE(using_for_function_on_struct)
{
char const* sourceCode = R"(
- library D { struct s { uint a; } function mul(s storage self, uint x) returns (uint) { return self.a *= x; } }
+ library D { struct s { uint a; } function mul(s storage self, uint x) public returns (uint) { return self.a *= x; } }
contract C {
using D for D.s;
D.s public x;
- function f(uint a) returns (uint) {
+ function f(uint a) public returns (uint) {
x.a = 3;
return x.mul(a);
}
@@ -8286,13 +8263,13 @@ BOOST_AUTO_TEST_CASE(using_for_overload)
char const* sourceCode = R"(
library D {
struct s { uint a; }
- function mul(s storage self, uint x) returns (uint) { return self.a *= x; }
- function mul(s storage self, bytes32 x) returns (bytes32) { }
+ function mul(s storage self, uint x) public returns (uint) { return self.a *= x; }
+ function mul(s storage self, bytes32 x) public returns (bytes32) { }
}
contract C {
using D for D.s;
D.s public x;
- function f(uint a) returns (uint) {
+ function f(uint a) public returns (uint) {
x.a = 6;
return x.mul(a);
}
@@ -8307,11 +8284,11 @@ BOOST_AUTO_TEST_CASE(using_for_overload)
BOOST_AUTO_TEST_CASE(using_for_by_name)
{
char const* sourceCode = R"(
- library D { struct s { uint a; } function mul(s storage self, uint x) returns (uint) { return self.a *= x; } }
+ library D { struct s { uint a; } function mul(s storage self, uint x) public returns (uint) { return self.a *= x; } }
contract C {
using D for D.s;
D.s public x;
- function f(uint a) returns (uint) {
+ function f(uint a) public returns (uint) {
x.a = 6;
return x.mul({x: a});
}
@@ -8326,11 +8303,11 @@ BOOST_AUTO_TEST_CASE(using_for_by_name)
BOOST_AUTO_TEST_CASE(bound_function_in_var)
{
char const* sourceCode = R"(
- library D { struct s { uint a; } function mul(s storage self, uint x) returns (uint) { return self.a *= x; } }
+ library D { struct s { uint a; } function mul(s storage self, uint x) public returns (uint) { return self.a *= x; } }
contract C {
using D for D.s;
D.s public x;
- function f(uint a) returns (uint) {
+ function f(uint a) public returns (uint) {
x.a = 6;
return (x.mul)({x: a});
}
@@ -8345,15 +8322,15 @@ BOOST_AUTO_TEST_CASE(bound_function_in_var)
BOOST_AUTO_TEST_CASE(bound_function_to_string)
{
char const* sourceCode = R"(
- library D { function length(string memory self) returns (uint) { return bytes(self).length; } }
+ library D { function length(string memory self) public returns (uint) { return bytes(self).length; } }
contract C {
using D for string;
string x;
- function f() returns (uint) {
+ function f() public returns (uint) {
x = "abc";
return x.length();
}
- function g() returns (uint) {
+ function g() public returns (uint) {
string memory s = "abc";
return s.length();
}
@@ -8370,7 +8347,7 @@ BOOST_AUTO_TEST_CASE(inline_array_storage_to_memory_conversion_strings)
char const* sourceCode = R"(
contract C {
string s = "doh";
- function f() returns (string, string) {
+ function f() public returns (string, string) {
string memory t = "ray";
string[3] memory x = [s, t, "mi"];
return (x[1], x[2]);
@@ -8385,7 +8362,7 @@ BOOST_AUTO_TEST_CASE(inline_array_strings_from_document)
{
char const* sourceCode = R"(
contract C {
- function f(uint i) returns (string) {
+ function f(uint i) public returns (string) {
string[4] memory x = ["This", "is", "an", "array"];
return (x[i]);
}
@@ -8402,7 +8379,7 @@ BOOST_AUTO_TEST_CASE(inline_array_storage_to_memory_conversion_ints)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint x, uint y) {
+ function f() public returns (uint x, uint y) {
x = 3;
y = 6;
uint[2] memory z = [x, y];
@@ -8418,7 +8395,7 @@ BOOST_AUTO_TEST_CASE(inline_array_index_access_ints)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
return ([1, 2, 3, 4][2]);
}
}
@@ -8432,10 +8409,10 @@ BOOST_AUTO_TEST_CASE(inline_array_index_access_strings)
char const* sourceCode = R"(
contract C {
string public tester;
- function f() returns (string) {
+ function f() public returns (string) {
return (["abc", "def", "g"][0]);
}
- function test() {
+ function test() public {
tester = f();
}
}
@@ -8450,10 +8427,10 @@ BOOST_AUTO_TEST_CASE(inline_array_return)
char const* sourceCode = R"(
contract C {
uint8[] tester;
- function f() returns (uint8[5]) {
+ function f() public returns (uint8[5]) {
return ([1,2,3,4,5]);
}
- function test() returns (uint8, uint8, uint8, uint8, uint8) {
+ function test() public returns (uint8, uint8, uint8, uint8, uint8) {
tester = f();
return (tester[0], tester[1], tester[2], tester[3], tester[4]);
}
@@ -8469,7 +8446,7 @@ BOOST_AUTO_TEST_CASE(inline_array_singleton)
// This caused a failure since the type was not converted to its mobile type.
char const* sourceCode = R"(
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
return [4][0];
}
}
@@ -8482,7 +8459,7 @@ BOOST_AUTO_TEST_CASE(inline_long_string_return)
{
char const* sourceCode = R"(
contract C {
- function f() returns (string) {
+ function f() public returns (string) {
return (["somethingShort", "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678900123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789001234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"][1]);
}
}
@@ -8498,10 +8475,10 @@ BOOST_AUTO_TEST_CASE(fixed_bytes_index_access)
char const* sourceCode = R"(
contract C {
bytes16[] public data;
- function f(bytes32 x) returns (byte) {
+ function f(bytes32 x) public returns (byte) {
return x[2];
}
- function g(bytes32 x) returns (uint) {
+ function g(bytes32 x) public returns (uint) {
data = [x[0], x[1], x[2]];
data[0] = "12345";
return uint(uint8(data[0][4]));
@@ -8519,7 +8496,7 @@ BOOST_AUTO_TEST_CASE(fixed_bytes_length_access)
char const* sourceCode = R"(
contract C {
byte a;
- function f(bytes32 x) returns (uint, uint, uint) {
+ function f(bytes32 x) public returns (uint, uint, uint) {
return (x.length, bytes16(2).length, a.length + 7);
}
}
@@ -8532,7 +8509,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_write_to_stack)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint r, bytes32 r2) {
+ function f() public returns (uint r, bytes32 r2) {
assembly { r := 7 r2 := "abcdef" }
}
}
@@ -8545,7 +8522,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_read_and_write_stack)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint r) {
+ function f() public returns (uint r) {
for (uint x = 0; x < 10; ++x)
assembly { r := add(r, x) }
}
@@ -8559,7 +8536,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_memory_access)
{
char const* sourceCode = R"(
contract C {
- function test() returns (bytes) {
+ function test() public returns (bytes) {
bytes memory x = new bytes(5);
for (uint i = 0; i < x.length; ++i)
x[i] = byte(uint8(i + 1));
@@ -8579,7 +8556,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_storage_access)
uint16 x;
uint16 public y;
uint public z;
- function f() returns (bool) {
+ function f() public returns (bool) {
uint off1;
uint off2;
assembly {
@@ -8605,7 +8582,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_storage_access_inside_function)
uint16 x;
uint16 public y;
uint public z;
- function f() returns (bool) {
+ function f() public returns (bool) {
uint off1;
uint off2;
assembly {
@@ -8633,7 +8610,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_storage_access_via_pointer)
uint public separator;
Data public a;
uint public separator2;
- function f() returns (bool) {
+ function f() public returns (bool) {
Data x = a;
uint off;
assembly {
@@ -8656,7 +8633,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_jumps)
{
char const* sourceCode = R"(
contract C {
- function f() {
+ function f() public {
assembly {
let n := calldataload(4)
let a := 1
@@ -8702,7 +8679,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_function_call)
{
char const* sourceCode = R"(
contract C {
- function f() {
+ function f() public {
assembly {
function asmfun(a, b, c) -> x, y, z {
x := a
@@ -8726,7 +8703,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_function_call_assignment)
{
char const* sourceCode = R"(
contract C {
- function f() {
+ function f() public {
assembly {
let a1, b1, c1
function asmfun(a, b, c) -> x, y, z {
@@ -8751,7 +8728,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_function_call2)
{
char const* sourceCode = R"(
contract C {
- function f() {
+ function f() public {
assembly {
let d := 0x10
function asmfun(a, b, c) -> x, y, z {
@@ -8777,7 +8754,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_embedded_function_call)
{
char const* sourceCode = R"(
contract C {
- function f() {
+ function f() public {
assembly {
let d := 0x10
function asmfun(a, b, c) -> x, y, z {
@@ -8804,7 +8781,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_if)
{
char const* sourceCode = R"(
contract C {
- function f(uint a) returns (uint b) {
+ function f(uint a) public returns (uint b) {
assembly {
if gt(a, 1) { b := 2 }
}
@@ -8822,7 +8799,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_switch)
{
char const* sourceCode = R"(
contract C {
- function f(uint a) returns (uint b) {
+ function f(uint a) public returns (uint b) {
assembly {
switch a
case 1 { b := 8 }
@@ -8843,7 +8820,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_recursion)
{
char const* sourceCode = R"(
contract C {
- function f(uint a) returns (uint b) {
+ function f(uint a) public returns (uint b) {
assembly {
function fac(n) -> nf {
switch n
@@ -8868,7 +8845,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_for)
{
char const* sourceCode = R"(
contract C {
- function f(uint a) returns (uint b) {
+ function f(uint a) public returns (uint b) {
assembly {
function fac(n) -> nf {
nf := 1
@@ -8894,7 +8871,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_for2)
char const* sourceCode = R"(
contract C {
uint st;
- function f(uint a) returns (uint b, uint c, uint d) {
+ function f(uint a) public returns (uint b, uint c, uint d) {
st = 0;
assembly {
function sideeffect(r) -> x { sstore(0, add(sload(0), r)) x := 1}
@@ -8918,7 +8895,7 @@ BOOST_AUTO_TEST_CASE(index_access_with_type_conversion)
// Test for a bug where higher order bits cleanup was not done for array index access.
char const* sourceCode = R"(
contract C {
- function f(uint x) returns (uint[256] r){
+ function f(uint x) public returns (uint[256] r){
r[uint8(x)] = 2;
}
}
@@ -8936,7 +8913,7 @@ BOOST_AUTO_TEST_CASE(delete_on_array_of_structs)
contract C {
struct S { uint x; uint[] y; }
S[] data;
- function f() returns (bool) {
+ function f() public returns (bool) {
data.length = 2;
data[0].x = 2**200;
data[1].x = 2**200;
@@ -8963,7 +8940,7 @@ BOOST_AUTO_TEST_CASE(internal_library_function)
}
}
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
uint[] memory x = new uint[](7);
x[3] = 8;
L.f(x);
@@ -8991,7 +8968,7 @@ BOOST_AUTO_TEST_CASE(internal_library_function_calling_private)
}
}
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
uint[] memory x = new uint[](7);
x[3] = 8;
L.f(x);
@@ -9015,7 +8992,7 @@ BOOST_AUTO_TEST_CASE(internal_library_function_bound)
}
contract C {
using L for L.S;
- function f() returns (uint) {
+ function f() public returns (uint) {
L.S memory x;
x.data = new uint[](7);
x.data[3] = 8;
@@ -9041,7 +9018,7 @@ BOOST_AUTO_TEST_CASE(internal_library_function_return_var_size)
}
contract C {
using L for L.S;
- function f() returns (uint) {
+ function f() public returns (uint) {
L.S memory x;
x.data = new uint[](7);
x.data[3] = 8;
@@ -9060,7 +9037,7 @@ BOOST_AUTO_TEST_CASE(iszero_bnot_correct)
// "iszero" and "not".
char const* sourceCode = R"(
contract C {
- function f() returns (bool) {
+ function f() public returns (bool) {
bytes32 x = 1;
assembly { x := not(x) }
if (x != ~bytes32(1)) return false;
@@ -9079,7 +9056,7 @@ BOOST_AUTO_TEST_CASE(cleanup_bytes_types)
// Checks that bytesXX types are properly cleaned before they are compared.
char const* sourceCode = R"(
contract C {
- function f(bytes2 a, uint16 x) returns (uint) {
+ function f(bytes2 a, uint16 x) public returns (uint) {
if (a != "ab") return 1;
if (x != 0x0102) return 2;
if (bytes3(uint24(x)) != 0x0102) return 3;
@@ -9096,7 +9073,7 @@ BOOST_AUTO_TEST_CASE(cleanup_bytes_types_shortening)
{
char const* sourceCode = R"(
contract C {
- function f() pure returns (bytes32 r) {
+ function f() public pure returns (bytes32 r) {
bytes4 x = 0xffffffff;
bytes2 y = bytes2(x);
assembly { r := y }
@@ -9115,10 +9092,10 @@ BOOST_AUTO_TEST_CASE(skip_dynamic_types)
// The EVM cannot provide access to dynamically-sized return values, so we have to skip them.
char const* sourceCode = R"(
contract C {
- function f() returns (uint, uint[], uint) {
+ function f() public returns (uint, uint[], uint) {
return (7, new uint[](2), 8);
}
- function g() returns (uint, uint) {
+ function g() public returns (uint, uint) {
// Previous implementation "moved" b to the second place and did not skip.
(uint a,, uint b) = this.f();
return (a, b);
@@ -9141,7 +9118,7 @@ BOOST_AUTO_TEST_CASE(skip_dynamic_types_for_structs)
uint y;
}
S public s;
- function g() returns (uint, uint) {
+ function g() public returns (uint, uint) {
s.x = 2;
s.a = "abc";
s.b = [7, 8, 9];
@@ -9161,12 +9138,12 @@ BOOST_AUTO_TEST_CASE(failed_create)
contract D { constructor() payable {} }
contract C {
uint public x;
- constructor() payable {}
- function f(uint amount) returns (address) {
+ constructor() public payable {}
+ function f(uint amount) public returns (address) {
x++;
return (new D).value(amount)();
}
- function stack(uint depth) returns (address) {
+ function stack(uint depth) public returns (address) {
if (depth < 1024)
return this.stack(depth - 1);
else
@@ -9187,7 +9164,7 @@ BOOST_AUTO_TEST_CASE(create_dynamic_array_with_zero_length)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
uint[][] memory a = new uint[][](0);
return 7;
}
@@ -9232,7 +9209,7 @@ BOOST_AUTO_TEST_CASE(return_does_not_skip_modifier)
_;
x = 9;
}
- function f() setsx returns (uint) {
+ function f() setsx public returns (uint) {
return 2;
}
}
@@ -9310,7 +9287,7 @@ BOOST_AUTO_TEST_CASE(mutex)
shares -= amount;
return shares;
}
- function withdrawUnprotected(uint amount) returns (uint) {
+ function withdrawUnprotected(uint amount) public returns (uint) {
// NOTE: It is very bad practice to write this function this way.
// Please refer to the documentation of how to do this properly.
if (amount > shares) throw;
@@ -9324,8 +9301,8 @@ BOOST_AUTO_TEST_CASE(mutex)
uint callDepth;
bool protected;
function setProtected(bool _protected) { protected = _protected; }
- constructor(Fund _fund) { fund = _fund; }
- function attack() returns (uint) {
+ constructor(Fund _fund) public { fund = _fund; }
+ function attack() public returns (uint) {
callDepth = 0;
return attackInternal();
}
@@ -9361,7 +9338,7 @@ BOOST_AUTO_TEST_CASE(failing_ecrecover_invalid_input)
// Note that the precompile does not return zero but returns nothing.
char const* sourceCode = R"(
contract C {
- function f() returns (address) {
+ function f() public returns (address) {
return ecrecover(bytes32(uint(-1)), 1, 2, 3);
}
}
@@ -9374,7 +9351,7 @@ BOOST_AUTO_TEST_CASE(failing_ecrecover_invalid_input_proper)
{
char const* sourceCode = R"(
contract C {
- function f() returns (address) {
+ function f() public returns (address) {
return recover(
0x77e5189111eb6557e8a637b27ef8fbb15bc61d61c2f00cc48878f3a296e5e0ca,
0, // invalid v value
@@ -9385,7 +9362,7 @@ BOOST_AUTO_TEST_CASE(failing_ecrecover_invalid_input_proper)
);
}
function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s, uint blockExpired, bytes32 salt)
- returns (address)
+ public returns (address)
{
require(hash == keccak256(abi.encodePacked(blockExpired, salt)));
return ecrecover(hash, v, r, s);
@@ -9400,7 +9377,7 @@ BOOST_AUTO_TEST_CASE(failing_ecrecover_invalid_input_asm)
{
char const* sourceCode = R"(
contract C {
- function f() returns (address) {
+ function f() public returns (address) {
assembly {
mstore(mload(0x40), 0xca35b7d915458ef540ade6068dfe2f44e8fa733c)
}
@@ -9423,15 +9400,15 @@ BOOST_AUTO_TEST_CASE(calling_nonexisting_contract_throws)
contract D { function g(); }
contract C {
D d = D(0x1212);
- function f() returns (uint) {
+ function f() public returns (uint) {
d.g();
return 7;
}
- function g() returns (uint) {
+ function g() public returns (uint) {
d.g.gas(200)();
return 7;
}
- function h() returns (uint) {
+ function h() public returns (uint) {
d.call(""); // this does not throw (low-level)
return 7;
}
@@ -9458,7 +9435,7 @@ BOOST_AUTO_TEST_CASE(payable_function)
char const* sourceCode = R"(
contract C {
uint public a;
- function f() payable returns (uint) {
+ function f() payable public returns (uint) {
return msg.value;
}
function() external payable {
@@ -9479,10 +9456,10 @@ BOOST_AUTO_TEST_CASE(payable_function_calls_library)
{
char const* sourceCode = R"(
library L {
- function f() returns (uint) { return 7; }
+ function f() public returns (uint) { return 7; }
}
contract C {
- function f() payable returns (uint) {
+ function f() payable public returns (uint) {
return L.f();
}
}
@@ -9497,7 +9474,7 @@ BOOST_AUTO_TEST_CASE(non_payable_throw)
char const* sourceCode = R"(
contract C {
uint public a;
- function f() returns (uint) {
+ function f() public returns (uint) {
return msg.value;
}
function() external {
@@ -9524,7 +9501,7 @@ BOOST_AUTO_TEST_CASE(no_nonpayable_circumvention_by_modifier)
modifier tryCircumvent {
if (false) _; // avoid the function, we should still not accept ether
}
- function f() tryCircumvent returns (uint) {
+ function f() tryCircumvent public returns (uint) {
return msg.value;
}
}
@@ -9542,10 +9519,10 @@ BOOST_AUTO_TEST_CASE(mem_resize_is_not_paid_at_call)
// Tests that this also survives the optimizer.
char const* sourceCode = R"(
contract C {
- function f() returns (uint[200]) {}
+ function f() public returns (uint[200]) {}
}
contract D {
- function f(C c) returns (uint) { c.f(); return 7; }
+ function f(C c) public returns (uint) { c.f(); return 7; }
}
)";
@@ -9559,12 +9536,12 @@ BOOST_AUTO_TEST_CASE(calling_uninitialized_function)
{
char const* sourceCode = R"(
contract C {
- function intern() returns (uint) {
+ function intern() public returns (uint) {
function (uint) internal returns (uint) x;
x(2);
return 7;
}
- function extern() returns (uint) {
+ function extern() public returns (uint) {
function (uint) external returns (uint) x;
x(2);
return 7;
@@ -9584,7 +9561,7 @@ BOOST_AUTO_TEST_CASE(calling_uninitialized_function_in_detail)
contract C {
function() internal returns (uint) x;
int mutex;
- function t() returns (uint) {
+ function t() public returns (uint) {
if (mutex > 0)
{ assembly { mstore(0, 7) return(0, 0x20) } }
mutex = 1;
@@ -9604,12 +9581,12 @@ BOOST_AUTO_TEST_CASE(calling_uninitialized_function_through_array)
char const* sourceCode = R"(
contract C {
int mutex;
- function t() returns (uint) {
+ function t() public returns (uint) {
if (mutex > 0)
{ assembly { mstore(0, 7) return(0, 0x20) } }
mutex = 1;
// Avoid re-executing this function if we jump somewhere.
- function() internal returns (uint)[200] x;
+ function() internal returns (uint)[200] memory x;
x[0]();
return 2;
}
@@ -9624,13 +9601,13 @@ BOOST_AUTO_TEST_CASE(pass_function_types_internally)
{
char const* sourceCode = R"(
contract C {
- function f(uint x) returns (uint) {
+ function f(uint x) public returns (uint) {
return eval(g, x);
}
- function eval(function(uint) returns (uint) x, uint a) internal returns (uint) {
+ function eval(function(uint) internal returns (uint) x, uint a) internal returns (uint) {
return x(a);
}
- function g(uint x) returns (uint) { return x + 1; }
+ function g(uint x) public returns (uint) { return x + 1; }
}
)";
@@ -9642,16 +9619,16 @@ BOOST_AUTO_TEST_CASE(pass_function_types_externally)
{
char const* sourceCode = R"(
contract C {
- function f(uint x) returns (uint) {
+ function f(uint x) public returns (uint) {
return this.eval(this.g, x);
}
- function f2(uint x) returns (uint) {
+ function f2(uint x) public returns (uint) {
return eval(this.g, x);
}
- function eval(function(uint) external returns (uint) x, uint a) returns (uint) {
+ function eval(function(uint) external returns (uint) x, uint a) public returns (uint) {
return x(a);
}
- function g(uint x) returns (uint) { return x + 1; }
+ function g(uint x) public returns (uint) { return x + 1; }
}
)";
@@ -9664,8 +9641,8 @@ BOOST_AUTO_TEST_CASE(receive_external_function_type)
{
char const* sourceCode = R"(
contract C {
- function g() returns (uint) { return 7; }
- function f(function() external returns (uint) g) returns (uint) {
+ function g() public returns (uint) { return 7; }
+ function f(function() external returns (uint) g) public returns (uint) {
return g();
}
}
@@ -9682,8 +9659,8 @@ BOOST_AUTO_TEST_CASE(return_external_function_type)
{
char const* sourceCode = R"(
contract C {
- function g() {}
- function f() returns (function() external) {
+ function g() public {}
+ function f() public returns (function() external) {
return this.g;
}
}
@@ -9700,18 +9677,18 @@ BOOST_AUTO_TEST_CASE(store_function)
{
char const* sourceCode = R"(
contract Other {
- function addTwo(uint x) returns (uint) { return x + 2; }
+ function addTwo(uint x) public returns (uint) { return x + 2; }
}
contract C {
- function (function (uint) external returns (uint)) returns (uint) ev;
+ function (function (uint) external returns (uint)) internal returns (uint) ev;
function (uint) external returns (uint) x;
function store(function(uint) external returns (uint) y) {
x = y;
}
- function eval(function(uint) external returns (uint) y) returns (uint) {
+ function eval(function(uint) external returns (uint) y) public returns (uint) {
return y(7);
}
- function t() returns (uint) {
+ function t() public returns (uint) {
ev = eval;
this.store((new Other()).addTwo);
return ev(x);
@@ -9729,14 +9706,14 @@ BOOST_AUTO_TEST_CASE(store_function_in_constructor)
contract C {
uint public result_in_constructor;
function (uint) internal returns (uint) x;
- constructor() {
+ constructor() public {
x = double;
result_in_constructor = use(2);
}
- function double(uint _arg) returns (uint _ret) {
+ function double(uint _arg) public returns (uint _ret) {
_ret = _arg * 2;
}
- function use(uint _arg) returns (uint) {
+ function use(uint _arg) public returns (uint) {
return x(_arg);
}
}
@@ -9754,13 +9731,13 @@ BOOST_AUTO_TEST_CASE(store_internal_unused_function_in_constructor)
char const* sourceCode = R"(
contract C {
function () internal returns (uint) x;
- constructor() {
+ constructor() public {
x = unused;
}
function unused() internal returns (uint) {
return 7;
}
- function t() returns (uint) {
+ function t() public returns (uint) {
return x();
}
}
@@ -9776,10 +9753,10 @@ BOOST_AUTO_TEST_CASE(store_internal_unused_library_function_in_constructor)
library L { function x() internal returns (uint) { return 7; } }
contract C {
function () internal returns (uint) x;
- constructor() {
+ constructor() public {
x = L.x;
}
- function t() returns (uint) {
+ function t() public returns (uint) {
return x();
}
}
@@ -9794,13 +9771,13 @@ BOOST_AUTO_TEST_CASE(same_function_in_construction_and_runtime)
char const* sourceCode = R"(
contract C {
uint public initial;
- constructor() {
+ constructor() public {
initial = double(2);
}
- function double(uint _arg) returns (uint _ret) {
+ function double(uint _arg) public returns (uint _ret) {
_ret = _arg * 2;
}
- function runtime(uint _arg) returns (uint) {
+ function runtime(uint _arg) public returns (uint) {
return double(_arg);
}
}
@@ -9816,13 +9793,13 @@ BOOST_AUTO_TEST_CASE(same_function_in_construction_and_runtime_equality_check)
char const* sourceCode = R"(
contract C {
function (uint) internal returns (uint) x;
- constructor() {
+ constructor() public {
x = double;
}
- function test() returns (bool) {
+ function test() public returns (bool) {
return x == double;
}
- function double(uint _arg) returns (uint _ret) {
+ function double(uint _arg) public returns (uint _ret) {
_ret = _arg * 2;
}
}
@@ -9836,7 +9813,7 @@ BOOST_AUTO_TEST_CASE(function_type_library_internal)
{
char const* sourceCode = R"(
library Utils {
- function reduce(uint[] memory array, function(uint, uint) returns (uint) f, uint init) internal returns (uint) {
+ function reduce(uint[] memory array, function(uint, uint) internal returns (uint) f, uint init) internal returns (uint) {
for (uint i = 0; i < array.length; i++) {
init = f(array[i], init);
}
@@ -9847,7 +9824,7 @@ BOOST_AUTO_TEST_CASE(function_type_library_internal)
}
}
contract C {
- function f(uint[] x) returns (uint) {
+ function f(uint[] x) public returns (uint) {
return Utils.reduce(x, Utils.sum, 0);
}
}
@@ -9862,21 +9839,21 @@ BOOST_AUTO_TEST_CASE(call_function_returning_function)
{
char const* sourceCode = R"(
contract test {
- function f0() returns (uint) {
+ function f0() public returns (uint) {
return 2;
}
- function f1() internal returns (function() returns (uint)) {
+ function f1() internal returns (function() internal returns (uint)) {
return f0;
}
- function f2() internal returns (function() returns (function () returns (uint))) {
+ function f2() internal returns (function() internal returns (function () internal returns (uint))) {
return f1;
}
- function f3() internal returns (function() returns (function () returns (function () returns (uint))))
+ function f3() internal returns (function() internal returns (function () internal returns (function () internal returns (uint))))
{
return f2;
}
- function f() returns (uint) {
- function() returns(function() returns(function() returns(function() returns(uint)))) x;
+ function f() public returns (uint) {
+ function() internal returns(function() internal returns(function() internal returns(function() internal returns(uint)))) x;
x = f3;
return x()()()();
}
@@ -9907,11 +9884,11 @@ BOOST_AUTO_TEST_CASE(mapping_of_functions)
success = true;
}
- constructor() {
+ constructor() public {
stages[msg.sender] = stage0;
}
- function f() returns (uint) {
+ function f() public returns (uint) {
stages[msg.sender]();
return 7;
}
@@ -9932,35 +9909,35 @@ BOOST_AUTO_TEST_CASE(packed_functions)
char const* sourceCode = R"(
contract C {
// these should take the same slot
- function() returns (uint) a;
+ function() internal returns (uint) a;
function() external returns (uint) b;
function() external returns (uint) c;
- function() returns (uint) d;
+ function() internal returns (uint) d;
uint8 public x;
- function set() {
+ function set() public {
x = 2;
d = g;
c = this.h;
b = this.h;
a = g;
}
- function t1() returns (uint) {
+ function t1() public returns (uint) {
return a();
}
- function t2() returns (uint) {
+ function t2() public returns (uint) {
return b();
}
- function t3() returns (uint) {
+ function t3() public returns (uint) {
return a();
}
- function t4() returns (uint) {
+ function t4() public returns (uint) {
return b();
}
- function g() returns (uint) {
+ function g() public returns (uint) {
return 7;
}
- function h() returns (uint) {
+ function h() public returns (uint) {
return 8;
}
}
@@ -9979,12 +9956,12 @@ BOOST_AUTO_TEST_CASE(function_memory_array)
{
char const* sourceCode = R"(
contract C {
- function a(uint x) returns (uint) { return x + 1; }
- function b(uint x) returns (uint) { return x + 2; }
- function c(uint x) returns (uint) { return x + 3; }
- function d(uint x) returns (uint) { return x + 5; }
- function e(uint x) returns (uint) { return x + 8; }
- function test(uint x, uint i) returns (uint) {
+ function a(uint x) public returns (uint) { return x + 1; }
+ function b(uint x) public returns (uint) { return x + 2; }
+ function c(uint x) public returns (uint) { return x + 3; }
+ function d(uint x) public returns (uint) { return x + 5; }
+ function e(uint x) public returns (uint) { return x + 8; }
+ function test(uint x, uint i) public returns (uint) {
function(uint) internal returns (uint)[] memory arr =
new function(uint) internal returns (uint)[](10);
arr[0] = a;
@@ -10010,17 +9987,17 @@ BOOST_AUTO_TEST_CASE(function_delete_storage)
{
char const* sourceCode = R"(
contract C {
- function a() returns (uint) { return 7; }
+ function a() public returns (uint) { return 7; }
function() internal returns (uint) y;
- function set() returns (uint) {
+ function set() public returns (uint) {
y = a;
return y();
}
- function d() returns (uint) {
+ function d() public returns (uint) {
delete y;
return 1;
}
- function ca() returns (uint) {
+ function ca() public returns (uint) {
return y();
}
}
@@ -10037,8 +10014,8 @@ BOOST_AUTO_TEST_CASE(function_delete_stack)
{
char const* sourceCode = R"(
contract C {
- function a() returns (uint) { return 7; }
- function test() returns (uint) {
+ function a() public returns (uint) { return 7; }
+ function test() public returns (uint) {
function () returns (uint) y = a;
delete y;
y();
@@ -10056,13 +10033,13 @@ BOOST_AUTO_TEST_CASE(copy_function_storage_array)
contract C {
function() internal returns (uint)[] x;
function() internal returns (uint)[] y;
- function test() returns (uint) {
+ function test() public returns (uint) {
x.length = 10;
x[9] = a;
y = x;
return y[9]();
}
- function a() returns (uint) {
+ function a() public returns (uint) {
return 7;
}
}
@@ -10115,10 +10092,10 @@ BOOST_AUTO_TEST_CASE(external_function_to_address)
{
char const* sourceCode = R"(
contract C {
- function f() returns (bool) {
+ function f() public returns (bool) {
return address(this.f) == address(this);
}
- function g(function() external cb) returns (address) {
+ function g(function() external cb) public returns (address) {
return address(cb);
}
}
@@ -10136,12 +10113,12 @@ BOOST_AUTO_TEST_CASE(copy_internal_function_array_to_storage)
contract C {
function() internal returns (uint)[20] x;
int mutex;
- function one() returns (uint) {
- function() internal returns (uint)[20] xmem;
+ function one() public returns (uint) {
+ function() internal returns (uint)[20] memory xmem;
x = xmem;
return 3;
}
- function two() returns (uint) {
+ function two() public returns (uint) {
if (mutex > 0)
return 7;
mutex = 1;
@@ -10205,7 +10182,7 @@ BOOST_AUTO_TEST_CASE(shift_left)
{
char const* sourceCode = R"(
contract C {
- function f(uint a, uint b) returns (uint) {
+ function f(uint a, uint b) public returns (uint) {
return a << b;
}
}
@@ -10223,7 +10200,7 @@ BOOST_AUTO_TEST_CASE(shift_left_uint32)
{
char const* sourceCode = R"(
contract C {
- function f(uint32 a, uint32 b) returns (uint) {
+ function f(uint32 a, uint32 b) public returns (uint) {
return a << b;
}
}
@@ -10240,7 +10217,7 @@ BOOST_AUTO_TEST_CASE(shift_left_uint8)
{
char const* sourceCode = R"(
contract C {
- function f(uint8 a, uint8 b) returns (uint) {
+ function f(uint8 a, uint8 b) public returns (uint) {
return a << b;
}
}
@@ -10255,7 +10232,7 @@ BOOST_AUTO_TEST_CASE(shift_left_larger_type)
// This basically tests proper cleanup and conversion. It should not convert x to int8.
char const* sourceCode = R"(
contract C {
- function f() returns (int8) {
+ function f() public returns (int8) {
uint8 x = 254;
int8 y = 1;
return y << x;
@@ -10270,7 +10247,7 @@ BOOST_AUTO_TEST_CASE(shift_left_assignment)
{
char const* sourceCode = R"(
contract C {
- function f(uint a, uint b) returns (uint) {
+ function f(uint a, uint b) public returns (uint) {
a <<= b;
return a;
}
@@ -10289,7 +10266,7 @@ BOOST_AUTO_TEST_CASE(shift_left_assignment_different_type)
{
char const* sourceCode = R"(
contract C {
- function f(uint a, uint8 b) returns (uint) {
+ function f(uint a, uint8 b) public returns (uint) {
a <<= b;
return a;
}
@@ -10307,7 +10284,7 @@ BOOST_AUTO_TEST_CASE(shift_right)
{
char const* sourceCode = R"(
contract C {
- function f(uint a, uint b) returns (uint) {
+ function f(uint a, uint b) public returns (uint) {
return a >> b;
}
}
@@ -10324,7 +10301,7 @@ BOOST_AUTO_TEST_CASE(shift_right_garbled)
{
char const* sourceCode = R"(
contract C {
- function f(uint8 a, uint8 b) returns (uint) {
+ function f(uint8 a, uint8 b) public returns (uint) {
assembly {
a := 0xffffffff
}
@@ -10342,14 +10319,14 @@ BOOST_AUTO_TEST_CASE(shift_right_garbled_signed)
{
char const* sourceCode = R"(
contract C {
- function f(int8 a, uint8 b) returns (int) {
+ function f(int8 a, uint8 b) public returns (int) {
assembly {
a := 0xfffffff0
}
// Higher bits should be signextended before the shift
return a >> b;
}
- function g(int8 a, uint8 b) returns (int) {
+ function g(int8 a, uint8 b) public returns (int) {
assembly {
a := 0xf0
}
@@ -10375,7 +10352,7 @@ BOOST_AUTO_TEST_CASE(shift_right_uint32)
{
char const* sourceCode = R"(
contract C {
- function f(uint32 a, uint32 b) returns (uint) {
+ function f(uint32 a, uint32 b) public returns (uint) {
return a >> b;
}
}
@@ -10391,7 +10368,7 @@ BOOST_AUTO_TEST_CASE(shift_right_uint8)
{
char const* sourceCode = R"(
contract C {
- function f(uint8 a, uint8 b) returns (uint) {
+ function f(uint8 a, uint8 b) public returns (uint) {
return a >> b;
}
}
@@ -10405,7 +10382,7 @@ BOOST_AUTO_TEST_CASE(shift_right_assignment)
{
char const* sourceCode = R"(
contract C {
- function f(uint a, uint b) returns (uint) {
+ function f(uint a, uint b) public returns (uint) {
a >>= b;
return a;
}
@@ -10422,7 +10399,7 @@ BOOST_AUTO_TEST_CASE(shift_right_assignment_signed)
{
char const* sourceCode = R"(
contract C {
- function f(int a, int b) returns (int) {
+ function f(int a, int b) public returns (int) {
a >>= b;
return a;
}
@@ -10439,7 +10416,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue)
{
char const* sourceCode = R"(
contract C {
- function f(int a, int b) returns (int) {
+ function f(int a, int b) public returns (int) {
return a >> b;
}
}
@@ -10463,40 +10440,40 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_literal)
{
char const* sourceCode = R"(
contract C {
- function f1() pure returns (bool) {
+ function f1() public pure returns (bool) {
return (-4266 >> 0) == -4266;
}
- function f2() pure returns (bool) {
+ function f2() public pure returns (bool) {
return (-4266 >> 1) == -2133;
}
- function f3() pure returns (bool) {
+ function f3() public pure returns (bool) {
return (-4266 >> 4) == -267;
}
- function f4() pure returns (bool) {
+ function f4() public pure returns (bool) {
return (-4266 >> 8) == -17;
}
- function f5() pure returns (bool) {
+ function f5() public pure returns (bool) {
return (-4266 >> 16) == -1;
}
- function f6() pure returns (bool) {
+ function f6() public pure returns (bool) {
return (-4266 >> 17) == -1;
}
- function g1() pure returns (bool) {
+ function g1() public pure returns (bool) {
return (-4267 >> 0) == -4267;
}
- function g2() pure returns (bool) {
+ function g2() public pure returns (bool) {
return (-4267 >> 1) == -2134;
}
- function g3() pure returns (bool) {
+ function g3() public pure returns (bool) {
return (-4267 >> 4) == -267;
}
- function g4() pure returns (bool) {
+ function g4() public pure returns (bool) {
return (-4267 >> 8) == -17;
}
- function g5() pure returns (bool) {
+ function g5() public pure returns (bool) {
return (-4267 >> 16) == -1;
}
- function g6() pure returns (bool) {
+ function g6() public pure returns (bool) {
return (-4267 >> 17) == -1;
}
}
@@ -10520,7 +10497,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue_int8)
{
char const* sourceCode = R"(
contract C {
- function f(int8 a, int8 b) returns (int) {
+ function f(int8 a, int8 b) public returns (int) {
return a >> b;
}
}
@@ -10544,7 +10521,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue_signextend_int8)
{
char const* sourceCode = R"(
contract C {
- function f(int8 a, int8 b) returns (int8) {
+ function f(int8 a, int8 b) public returns (int8) {
return a >> b;
}
}
@@ -10561,7 +10538,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue_signextend_int16)
{
char const* sourceCode = R"(
contract C {
- function f(int16 a, int16 b) returns (int16) {
+ function f(int16 a, int16 b) public returns (int16) {
return a >> b;
}
}
@@ -10578,7 +10555,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue_signextend_int32)
{
char const* sourceCode = R"(
contract C {
- function f(int32 a, int32 b) returns (int32) {
+ function f(int32 a, int32 b) public returns (int32) {
return a >> b;
}
}
@@ -10596,7 +10573,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue_int16)
{
char const* sourceCode = R"(
contract C {
- function f(int16 a, int16 b) returns (int) {
+ function f(int16 a, int16 b) public returns (int) {
return a >> b;
}
}
@@ -10620,7 +10597,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue_int32)
{
char const* sourceCode = R"(
contract C {
- function f(int32 a, int32 b) returns (int) {
+ function f(int32 a, int32 b) public returns (int) {
return a >> b;
}
}
@@ -10644,7 +10621,7 @@ BOOST_AUTO_TEST_CASE(shift_right_negative_lvalue_assignment)
{
char const* sourceCode = R"(
contract C {
- function f(int a, int b) returns (int) {
+ function f(int a, int b) public returns (int) {
a >>= b;
return a;
}
@@ -10669,10 +10646,10 @@ BOOST_AUTO_TEST_CASE(shift_negative_rvalue)
{
char const* sourceCode = R"(
contract C {
- function f(int a, int b) returns (int) {
+ function f(int a, int b) public returns (int) {
return a << b;
}
- function g(int a, int b) returns (int) {
+ function g(int a, int b) public returns (int) {
return a >> b;
}
}
@@ -10686,11 +10663,11 @@ BOOST_AUTO_TEST_CASE(shift_negative_rvalue_assignment)
{
char const* sourceCode = R"(
contract C {
- function f(int a, int b) returns (int) {
+ function f(int a, int b) public returns (int) {
a <<= b;
return a;
}
- function g(int a, int b) returns (int) {
+ function g(int a, int b) public returns (int) {
a >>= b;
return a;
}
@@ -10705,7 +10682,7 @@ BOOST_AUTO_TEST_CASE(shift_constant_left_assignment)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint a) {
+ function f() public returns (uint a) {
a = 0x42;
a <<= 8;
}
@@ -10719,7 +10696,7 @@ BOOST_AUTO_TEST_CASE(shift_constant_right_assignment)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint a) {
+ function f() public returns (uint a) {
a = 0x4200;
a >>= 8;
}
@@ -10733,7 +10710,7 @@ BOOST_AUTO_TEST_CASE(shift_cleanup)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint16 x) {
+ function f() public returns (uint16 x) {
x = 0xffff;
x += 32;
x <<= 8;
@@ -10749,7 +10726,7 @@ BOOST_AUTO_TEST_CASE(shift_cleanup_garbled)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint8 x) {
+ function f() public returns (uint8 x) {
assembly {
x := 0xffff
}
@@ -10765,10 +10742,10 @@ BOOST_AUTO_TEST_CASE(shift_overflow)
{
char const* sourceCode = R"(
contract C {
- function leftU(uint8 x, uint8 y) returns (uint8) {
+ function leftU(uint8 x, uint8 y) public returns (uint8) {
return x << y;
}
- function leftS(int8 x, int8 y) returns (int8) {
+ function leftS(int8 x, int8 y) public returns (int8) {
return x << y;
}
}
@@ -10787,10 +10764,10 @@ BOOST_AUTO_TEST_CASE(shift_bytes)
{
char const* sourceCode = R"(
contract C {
- function left(bytes20 x, uint8 y) returns (bytes20) {
+ function left(bytes20 x, uint8 y) public returns (bytes20) {
return x << y;
}
- function right(bytes20 x, uint8 y) returns (bytes20) {
+ function right(bytes20 x, uint8 y) public returns (bytes20) {
return x >> y;
}
}
@@ -10804,12 +10781,12 @@ BOOST_AUTO_TEST_CASE(shift_bytes_cleanup)
{
char const* sourceCode = R"(
contract C {
- function left(uint8 y) returns (bytes20) {
+ function left(uint8 y) public returns (bytes20) {
bytes20 x;
assembly { x := "12345678901234567890abcde" }
return x << y;
}
- function right(uint8 y) returns (bytes20) {
+ function right(uint8 y) public returns (bytes20) {
bytes20 x;
assembly { x := "12345678901234567890abcde" }
return x >> y;
@@ -10825,7 +10802,7 @@ BOOST_AUTO_TEST_CASE(cleanup_in_compound_assign)
{
char const* sourceCode = R"(
contract C {
- function test() returns (uint, uint) {
+ function test() public returns (uint, uint) {
uint32 a = 0xffffffff;
uint16 x = uint16(a);
uint16 y = x;
@@ -10852,7 +10829,7 @@ BOOST_AUTO_TEST_CASE(inline_assembly_in_modifiers)
throw;
_;
}
- function f() m returns (bool) {
+ function f() m public returns (bool) {
return true;
}
}
@@ -10868,7 +10845,7 @@ BOOST_AUTO_TEST_CASE(packed_storage_overflow)
uint16 x = 0x1234;
uint16 a = 0xffff;
uint16 b;
- function f() returns (uint, uint, uint, uint) {
+ function f() public returns (uint, uint, uint, uint) {
a++;
uint c = b;
delete b;
@@ -10900,18 +10877,18 @@ BOOST_AUTO_TEST_CASE(include_creation_bytecode_only_once)
contract D {
bytes a = hex"1237651237125387136581271652831736512837126583171583712358126123765123712538713658127165283173651283712658317158371235812612376512371253871365812716528317365128371265831715837123581261237651237125387136581271652831736512837126583171583712358126";
bytes b = hex"1237651237125327136581271252831736512837126583171383712358126123765125712538713658127165253173651283712658357158371235812612376512371a5387136581271652a317365128371265a317158371235812612a765123712538a13658127165a83173651283712a58317158371235a126";
- constructor(uint) {}
+ constructor(uint) public {}
}
contract Double {
- function f() {
+ function f() public {
new D(2);
}
- function g() {
+ function g() public {
new D(3);
}
}
contract Single {
- function f() {
+ function f() public {
new D(2);
}
}
@@ -10931,7 +10908,7 @@ BOOST_AUTO_TEST_CASE(recursive_structs)
S[] x;
}
S sstorage;
- function f() returns (uint) {
+ function f() public returns (uint) {
S memory s;
s.x = new S[](10);
delete s;
@@ -10949,7 +10926,7 @@ BOOST_AUTO_TEST_CASE(invalid_instruction)
{
char const* sourceCode = R"(
contract C {
- function f() {
+ function f() public {
assembly {
invalid
}
@@ -10964,14 +10941,14 @@ BOOST_AUTO_TEST_CASE(assert_require)
{
char const* sourceCode = R"(
contract C {
- function f() {
+ function f() public {
assert(false);
}
- function g(bool val) returns (bool) {
+ function g(bool val) public returns (bool) {
assert(val == true);
return true;
}
- function h(bool val) returns (bool) {
+ function h(bool val) public returns (bool) {
require(val);
return true;
}
@@ -10990,11 +10967,11 @@ BOOST_AUTO_TEST_CASE(revert)
char const* sourceCode = R"(
contract C {
uint public a = 42;
- function f() {
+ function f() public {
a = 1;
revert();
}
- function g() {
+ function g() public {
a = 1;
assembly {
revert(0, 0)
@@ -11089,7 +11066,7 @@ BOOST_AUTO_TEST_CASE(require_with_message)
bool flagCopy = flag;
require(flagCopy == false, internalFun());
}
- function internalFun() returns (string) {
+ function internalFun() public returns (string) {
flag = true;
return "only on second run";
}
@@ -11224,7 +11201,7 @@ BOOST_AUTO_TEST_CASE(bubble_up_error_messages_through_create)
{
char const* sourceCode = R"(
contract E {
- constructor() {
+ constructor() public {
revert("message");
}
}
@@ -11288,7 +11265,7 @@ BOOST_AUTO_TEST_CASE(literal_empty_string)
x = _x;
a = _a;
}
- function g() {
+ function g() public {
this.f("", 2);
}
}
@@ -11305,22 +11282,22 @@ BOOST_AUTO_TEST_CASE(scientific_notation)
{
char const* sourceCode = R"(
contract C {
- function f() returns (uint) {
+ function f() public returns (uint) {
return 2e10 wei;
}
- function g() returns (uint) {
+ function g() public returns (uint) {
return 200e-2 wei;
}
- function h() returns (uint) {
+ function h() public returns (uint) {
return 2.5e1;
}
- function i() returns (int) {
+ function i() public returns (int) {
return -2e10;
}
- function j() returns (int) {
+ function j() public returns (int) {
return -200e-2;
}
- function k() returns (int) {
+ function k() public returns (int) {
return -2.5e1;
}
}
@@ -11339,16 +11316,16 @@ BOOST_AUTO_TEST_CASE(interface_contract)
char const* sourceCode = R"(
interface I {
event A();
- function f() returns (bool);
+ function f() public returns (bool);
function() external payable;
}
contract A is I {
- function f() returns (bool) {
+ function f() public returns (bool) {
return g();
}
- function g() returns (bool) {
+ function g() public returns (bool) {
return true;
}
@@ -11357,7 +11334,7 @@ BOOST_AUTO_TEST_CASE(interface_contract)
}
contract C {
- function f(address _interfaceAddress) returns (bool) {
+ function f(address _interfaceAddress) public returns (bool) {
I i = I(_interfaceAddress);
return i.f();
}
@@ -11373,12 +11350,12 @@ BOOST_AUTO_TEST_CASE(keccak256_assembly)
{
char const* sourceCode = R"(
contract C {
- function f() pure returns (bytes32 ret) {
+ function f() public pure returns (bytes32 ret) {
assembly {
ret := keccak256(0, 0)
}
}
- function g() pure returns (bytes32 ret) {
+ function g() public pure returns (bytes32 ret) {
assembly {
0
0
@@ -11405,10 +11382,10 @@ BOOST_AUTO_TEST_CASE(multi_modifiers)
x++;
_;
}
- function f1() m1() {
+ function f1() m1() public {
x += 7;
}
- function f2() m1() {
+ function f2() m1() public {
x += 3;
}
}
@@ -11424,7 +11401,7 @@ BOOST_AUTO_TEST_CASE(inlineasm_empty_let)
{
char const* sourceCode = R"(
contract C {
- function f() pure returns (uint a, uint b) {
+ function f() public pure returns (uint a, uint b) {
assembly {
let x
let y, z
@@ -11497,18 +11474,18 @@ BOOST_AUTO_TEST_CASE(function_types_sig)
char const* sourceCode = R"(
contract C {
uint public x;
- function f() pure returns (bytes4) {
+ function f() public pure returns (bytes4) {
return this.f.selector;
}
- function g() returns (bytes4) {
+ function g() public returns (bytes4) {
function () pure external returns (bytes4) fun = this.f;
return fun.selector;
}
- function h() returns (bytes4) {
+ function h() public returns (bytes4) {
function () pure external returns (bytes4) fun = this.f;
return fun.selector;
}
- function i() pure returns (bytes4) {
+ function i() public pure returns (bytes4) {
return this.x.selector;
}
}
@@ -11527,13 +11504,13 @@ BOOST_AUTO_TEST_CASE(constant_string)
bytes constant a = "\x03\x01\x02";
bytes constant b = hex"030102";
string constant c = "hello";
- function f() returns (bytes) {
+ function f() public returns (bytes) {
return a;
}
- function g() returns (bytes) {
+ function g() public returns (bytes) {
return b;
}
- function h() returns (bytes) {
+ function h() public returns (bytes) {
return bytes(c);
}
}
@@ -11548,18 +11525,18 @@ BOOST_AUTO_TEST_CASE(address_overload_resolution)
{
char const* sourceCode = R"(
contract C {
- function balance() returns (uint) {
+ function balance() public returns (uint) {
return 1;
}
- function transfer(uint amount) returns (uint) {
+ function transfer(uint amount) public returns (uint) {
return amount;
}
}
contract D {
- function f() returns (uint) {
+ function f() public returns (uint) {
return (new C()).balance();
}
- function g() returns (uint) {
+ function g() public returns (uint) {
return (new C()).transfer(5);
}
}
@@ -11733,7 +11710,7 @@ BOOST_AUTO_TEST_CASE(snark)
Pairing.G1Point K;
Pairing.G1Point H;
}
- function f() returns (bool) {
+ function f() public returns (bool) {
Pairing.G1Point memory p1;
Pairing.G1Point memory p2;
p1.X = 1; p1.Y = 2;
@@ -11743,12 +11720,12 @@ BOOST_AUTO_TEST_CASE(snark)
return (explict_sum.X == scalar_prod.X &&
explict_sum.Y == scalar_prod.Y);
}
- function g() returns (bool) {
+ function g() public returns (bool) {
Pairing.G1Point memory x = Pairing.add(Pairing.P1(), Pairing.negate(Pairing.P1()));
// should be zero
return (x.X == 0 && x.Y == 0);
}
- function testMul() returns (bool) {
+ function testMul() public returns (bool) {
Pairing.G1Point memory p;
// @TODO The points here are reported to be not well-formed
p.X = 14125296762497065001182820090155008161146766663259912659363835465243039841726;
@@ -11758,7 +11735,7 @@ BOOST_AUTO_TEST_CASE(snark)
p.X == 18256332256630856740336504687838346961237861778318632856900758565550522381207 &&
p.Y == 6976682127058094634733239494758371323697222088503263230319702770853579280803;
}
- function pair() returns (bool) {
+ function pair() public returns (bool) {
Pairing.G2Point memory fiveTimesP2 = Pairing.G2Point(
[4540444681147253467785307942530223364530218361853237193970751657229138047649, 20954117799226682825035885491234530437475518021362091509513177301640194298072],
[11631839690097995216017572651900167465857396346217730511548857041925508482915, 21508930868448350162258892668132814424284302804699005394342512102884055673846]
@@ -11828,7 +11805,7 @@ BOOST_AUTO_TEST_CASE(snark)
return 0;
}
event Verified(string);
- function verifyTx() returns (bool) {
+ function verifyTx() public returns (bool) {
uint[] memory input = new uint[](9);
Proof memory proof;
proof.A = Pairing.G1Point(12873740738727497448187997291915224677121726020054032516825496230827252793177, 21804419174137094775122804775419507726154084057848719988004616848382402162497);
@@ -11874,17 +11851,17 @@ BOOST_AUTO_TEST_CASE(abi_encode)
{
char const* sourceCode = R"(
contract C {
- function f0() returns (bytes) {
+ function f0() public returns (bytes) {
return abi.encode();
}
- function f1() returns (bytes) {
+ function f1() public returns (bytes) {
return abi.encode(1, 2);
}
- function f2() returns (bytes) {
+ function f2() public returns (bytes) {
string memory x = "abc";
return abi.encode(1, x, 2);
}
- function f3() returns (bytes r) {
+ function f3() public returns (bytes r) {
// test that memory is properly allocated
string memory x = "abc";
r = abi.encode(1, x, 2);
@@ -11893,7 +11870,7 @@ BOOST_AUTO_TEST_CASE(abi_encode)
y[0] = "e";
require(y[0] == "e");
}
- function f4() returns (bytes) {
+ function f4() public returns (bytes) {
bytes4 x = "abcd";
return abi.encode(bytes2(x));
}
@@ -12242,7 +12219,7 @@ BOOST_AUTO_TEST_CASE(swap_peephole_optimisation)
{
char const* sourceCode = R"(
contract C {
- function lt(uint a, uint b) returns (bool c) {
+ function lt(uint a, uint b) public returns (bool c) {
assembly {
a
b
@@ -12251,7 +12228,7 @@ BOOST_AUTO_TEST_CASE(swap_peephole_optimisation)
=: c
}
}
- function add(uint a, uint b) returns (uint c) {
+ function add(uint a, uint b) public returns (uint c) {
assembly {
a
b
@@ -12260,7 +12237,7 @@ BOOST_AUTO_TEST_CASE(swap_peephole_optimisation)
=: c
}
}
- function div(uint a, uint b) returns (uint c) {
+ function div(uint a, uint b) public returns (uint c) {
assembly {
a
b
@@ -12288,7 +12265,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constantinople)
return;
char const* sourceCode = R"(
contract C {
- function shl(uint a, uint b) returns (uint c) {
+ function shl(uint a, uint b) public returns (uint c) {
assembly {
a
b
@@ -12296,7 +12273,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constantinople)
=: c
}
}
- function shr(uint a, uint b) returns (uint c) {
+ function shr(uint a, uint b) public returns (uint c) {
assembly {
a
b
@@ -12304,7 +12281,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constantinople)
=: c
}
}
- function sar(uint a, uint b) returns (uint c) {
+ function sar(uint a, uint b) public returns (uint c) {
assembly {
a
b
@@ -12334,7 +12311,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constants_constantinople)
return;
char const* sourceCode = R"(
contract C {
- function shl_1() returns (bool) {
+ function shl_1() public returns (bool) {
uint c;
assembly {
1
@@ -12345,7 +12322,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constants_constantinople)
assert(c == 4);
return true;
}
- function shl_2() returns (bool) {
+ function shl_2() public returns (bool) {
uint c;
assembly {
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
@@ -12356,7 +12333,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constants_constantinople)
assert(c == 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe);
return true;
}
- function shl_3() returns (bool) {
+ function shl_3() public returns (bool) {
uint c;
assembly {
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
@@ -12367,7 +12344,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constants_constantinople)
assert(c == 0);
return true;
}
- function shr_1() returns (bool) {
+ function shr_1() public returns (bool) {
uint c;
assembly {
3
@@ -12378,7 +12355,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constants_constantinople)
assert(c == 1);
return true;
}
- function shr_2() returns (bool) {
+ function shr_2() public returns (bool) {
uint c;
assembly {
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
@@ -12389,7 +12366,7 @@ BOOST_AUTO_TEST_CASE(bitwise_shifting_constants_constantinople)
assert(c == 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
return true;
}
- function shr_3() returns (bool) {
+ function shr_3() public returns (bool) {
uint c;
assembly {
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
diff --git a/test/libsolidity/SolidityExpressionCompiler.cpp b/test/libsolidity/SolidityExpressionCompiler.cpp
index 2668dfdf..949045ea 100644
--- a/test/libsolidity/SolidityExpressionCompiler.cpp
+++ b/test/libsolidity/SolidityExpressionCompiler.cpp
@@ -175,7 +175,7 @@ BOOST_AUTO_TEST_CASE(literal_true)
{
char const* sourceCode = R"(
contract test {
- function f() { bool x = true; }
+ function f() public { bool x = true; }
}
)";
bytes code = compileFirstExpression(sourceCode);
@@ -384,7 +384,7 @@ BOOST_AUTO_TEST_CASE(unary_inc_dec)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns (uint x) { x = --a ^ (a-- ^ (++a ^ a++)); }
+ function f(uint a) public returns (uint x) { x = --a ^ (a-- ^ (++a ^ a++)); }
}
)";
bytes code = compileFirstExpression(sourceCode, {}, {{"test", "f", "a"}, {"test", "f", "x"}});
@@ -509,9 +509,9 @@ BOOST_AUTO_TEST_CASE(blockhash)
}
)";
- auto blockhashFun = make_shared<FunctionType>(strings{"uint256"}, strings{"bytes32"},
+ auto blockhashFun = make_shared<FunctionType>(strings{"uint256"}, strings{"bytes32"},
FunctionType::Kind::BlockHash, false, StateMutability::View);
-
+
bytes code = compileFirstExpression(sourceCode, {}, {}, {make_shared<MagicVariableDeclaration>("blockhash", blockhashFun)});
bytes expectation({byte(Instruction::PUSH1), 0x03,
@@ -523,32 +523,17 @@ BOOST_AUTO_TEST_CASE(gas_left)
{
char const* sourceCode = R"(
contract test {
- function f() returns (uint256 val) {
- return msg.gas;
- }
- }
- )";
- bytes code = compileFirstExpression(
- sourceCode, {}, {},
- {make_shared<MagicVariableDeclaration>("msg", make_shared<MagicType>(MagicType::Kind::Message))}
- );
-
- bytes expectation({byte(Instruction::GAS)});
- BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
-
- sourceCode = R"(
- contract test {
- function f() returns (uint256 val) {
+ function f() public returns (uint256 val) {
return gasleft();
}
}
)";
- code = compileFirstExpression(
+ bytes code = compileFirstExpression(
sourceCode, {}, {},
{make_shared<MagicVariableDeclaration>("gasleft", make_shared<FunctionType>(strings(), strings{"uint256"}, FunctionType::Kind::GasLeft))}
);
- expectation = bytes({byte(Instruction::GAS)});
+ bytes expectation = bytes({byte(Instruction::GAS)});
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
}
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index ff0a45f0..e6d93b36 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(abstract_contract)
{
SourceUnit const* sourceUnit = nullptr;
char const* text = R"(
- contract base { function foo(); }
+ contract base { function foo() public; }
contract derived is base { function foo() public {} }
)";
sourceUnit = parseAndAnalyse(text);
@@ -82,7 +82,7 @@ BOOST_AUTO_TEST_CASE(abstract_contract_with_overload)
{
SourceUnit const* sourceUnit = nullptr;
char const* text = R"(
- contract base { function foo(bool); }
+ contract base { function foo(bool) public; }
contract derived is base { function foo(uint) public {} }
)";
sourceUnit = parseAndAnalyse(text);
@@ -99,7 +99,7 @@ BOOST_AUTO_TEST_CASE(implement_abstract_via_constructor)
{
SourceUnit const* sourceUnit = nullptr;
char const* text = R"(
- contract base { function foo(); }
+ contract base { function foo() public; }
contract foo is base { constructor() public {} }
)";
sourceUnit = parseAndAnalyse(text);
diff --git a/test/libsolidity/SolidityNatspecJSON.cpp b/test/libsolidity/SolidityNatspecJSON.cpp
index eeebeb74..98a3bba9 100644
--- a/test/libsolidity/SolidityNatspecJSON.cpp
+++ b/test/libsolidity/SolidityNatspecJSON.cpp
@@ -84,7 +84,7 @@ BOOST_AUTO_TEST_CASE(user_basic_test)
char const* sourceCode = R"(
contract test {
/// @notice Multiplies `a` by 7
- function mul(uint a) returns(uint d) { return a * 7; }
+ function mul(uint a) public returns(uint d) { return a * 7; }
}
)";
@@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE(dev_and_user_basic_test)
contract test {
/// @notice Multiplies `a` by 7
/// @dev Multiplies a number by 7
- function mul(uint a) returns(uint d) { return a * 7; }
+ function mul(uint a) public returns (uint d) { return a * 7; }
}
)";
@@ -129,7 +129,7 @@ BOOST_AUTO_TEST_CASE(user_multiline_comment)
contract test {
/// @notice Multiplies `a` by 7
/// and then adds `b`
- function mul_and_add(uint a, uint256 b) returns(uint256 d) {
+ function mul_and_add(uint a, uint256 b) public returns (uint256 d) {
return (a * 7) + b;
}
}
@@ -148,17 +148,17 @@ BOOST_AUTO_TEST_CASE(user_multiple_functions)
char const* sourceCode = R"(
contract test {
/// @notice Multiplies `a` by 7 and then adds `b`
- function mul_and_add(uint a, uint256 b) returns(uint256 d) {
+ function mul_and_add(uint a, uint256 b) public returns (uint256 d) {
return (a * 7) + b;
}
/// @notice Divides `input` by `div`
- function divide(uint input, uint div) returns(uint d) {
+ function divide(uint input, uint div) public returns (uint d) {
return input / div;
}
/// @notice Subtracts 3 from `input`
- function sub(int input) returns(int d) {
+ function sub(int input) public returns (int d) {
return input - 3;
}
}
@@ -189,10 +189,10 @@ BOOST_AUTO_TEST_CASE(dev_and_user_no_doc)
{
char const* sourceCode = R"(
contract test {
- function mul(uint a) returns(uint d) {
+ function mul(uint a) public returns (uint d) {
return a * 7;
}
- function sub(int input) returns(int d) {
+ function sub(int input) public returns (int d) {
return input - 3;
}
}
@@ -213,7 +213,7 @@ BOOST_AUTO_TEST_CASE(dev_desc_after_nl)
/// Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
/// @param second Documentation for the second parameter
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -238,7 +238,7 @@ BOOST_AUTO_TEST_CASE(dev_multiple_params)
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
/// @param second Documentation for the second parameter
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -262,7 +262,7 @@ BOOST_AUTO_TEST_CASE(dev_multiple_params_mixed_whitespace)
" /// @dev Multiplies a number by 7 and adds second parameter\n"
" /// @param a Documentation for the first parameter\n"
" /// @param second Documentation for the second parameter\n"
- " function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }\n"
+ " function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }\n"
"}\n";
char const* natspec = "{"
@@ -287,7 +287,7 @@ BOOST_AUTO_TEST_CASE(dev_mutiline_param_description)
/// @param a Documentation for the first parameter starts here.
/// Since it's a really complicated parameter we need 2 lines
/// @param second Documentation for the second parameter
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -312,18 +312,18 @@ BOOST_AUTO_TEST_CASE(dev_multiple_functions)
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
/// @param second Documentation for the second parameter
- function mul(uint a, uint second) returns(uint d) {
+ function mul(uint a, uint second) public returns (uint d) {
return a * 7 + second;
}
/// @dev Divides 2 numbers
/// @param input Documentation for the input parameter
/// @param div Documentation for the div parameter
- function divide(uint input, uint div) returns(uint d) {
+ function divide(uint input, uint div) public returns (uint d) {
return input / div;
}
/// @dev Subtracts 3 from `input`
/// @param input Documentation for the input parameter
- function sub(int input) returns(int d) {
+ function sub(int input) public returns (int d) {
return input - 3;
}
}
@@ -365,7 +365,7 @@ BOOST_AUTO_TEST_CASE(dev_return)
/// Since it's a really complicated parameter we need 2 lines
/// @param second Documentation for the second parameter
/// @return The result of the multiplication
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -393,7 +393,7 @@ BOOST_AUTO_TEST_CASE(dev_return_desc_after_nl)
/// @param second Documentation for the second parameter
/// @return
/// The result of the multiplication
- function mul(uint a, uint second) returns(uint d) {
+ function mul(uint a, uint second) public returns (uint d) {
return a * 7 + second;
}
}
@@ -425,7 +425,7 @@ BOOST_AUTO_TEST_CASE(dev_multiline_return)
/// @param second Documentation for the second parameter
/// @return The result of the multiplication
/// and cookies with nutella
- function mul(uint a, uint second) returns(uint d) {
+ function mul(uint a, uint second) public returns (uint d) {
return a * 7 + second;
}
}
@@ -458,7 +458,7 @@ BOOST_AUTO_TEST_CASE(dev_multiline_comment)
* @return The result of the multiplication
* and cookies with nutella
*/
- function mul(uint a, uint second) returns(uint d) {
+ function mul(uint a, uint second) public returns (uint d) {
return a * 7 + second;
}
}
@@ -484,7 +484,7 @@ BOOST_AUTO_TEST_CASE(dev_contract_no_doc)
char const* sourceCode = R"(
contract test {
/// @dev Mul function
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -506,7 +506,7 @@ BOOST_AUTO_TEST_CASE(dev_contract_doc)
/// @title Just a test contract
contract test {
/// @dev Mul function
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -531,7 +531,7 @@ BOOST_AUTO_TEST_CASE(dev_author_at_function)
contract test {
/// @dev Mul function
/// @author John Doe
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -554,7 +554,7 @@ BOOST_AUTO_TEST_CASE(natspec_notice_without_tag)
char const* sourceCode = R"(
contract test {
/// I do something awesome
- function mul(uint a) returns(uint d) { return a * 7; }
+ function mul(uint a) public returns (uint d) { return a * 7; }
}
)";
@@ -578,7 +578,7 @@ BOOST_AUTO_TEST_CASE(natspec_multiline_notice_without_tag)
contract test {
/// I do something awesome
/// which requires two lines to explain
- function mul(uint a) returns(uint d) { return a * 7; }
+ function mul(uint a) public returns (uint d) { return a * 7; }
}
)";
@@ -619,7 +619,7 @@ BOOST_AUTO_TEST_CASE(dev_title_at_function_error)
contract test {
/// @dev Mul function
/// @title I really should not be here
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -633,7 +633,7 @@ BOOST_AUTO_TEST_CASE(dev_documenting_nonexistent_param)
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
/// @param not_existing Documentation for the second parameter
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -647,7 +647,7 @@ BOOST_AUTO_TEST_CASE(dev_documenting_no_paramname)
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
/// @param
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -661,7 +661,7 @@ BOOST_AUTO_TEST_CASE(dev_documenting_no_paramname_end)
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
/// @param se
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -675,7 +675,7 @@ BOOST_AUTO_TEST_CASE(dev_documenting_no_param_description)
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
/// @param second
- function mul(uint a, uint second) returns(uint d) { return a * 7 + second; }
+ function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
diff --git a/test/libsolidity/SolidityOptimizer.cpp b/test/libsolidity/SolidityOptimizer.cpp
index 04d9ee16..d375beff 100644
--- a/test/libsolidity/SolidityOptimizer.cpp
+++ b/test/libsolidity/SolidityOptimizer.cpp
@@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(smoke_test)
{
char const* sourceCode = R"(
contract test {
- function f(uint a) returns (uint b) {
+ function f(uint a) public returns (uint b) {
return a;
}
}
@@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE(identities)
{
char const* sourceCode = R"(
contract test {
- function f(int a) returns (int b) {
+ function f(int a) public returns (int b) {
return int(0) | (int(1) * (int(0) ^ (0 + a)));
}
}
@@ -163,7 +163,7 @@ BOOST_AUTO_TEST_CASE(unused_expressions)
char const* sourceCode = R"(
contract test {
uint data;
- function f() returns (uint a, uint b) {
+ function f() public returns (uint a, uint b) {
10 + 20;
data;
}
@@ -180,7 +180,7 @@ BOOST_AUTO_TEST_CASE(constant_folding_both_sides)
// literals as late as possible
char const* sourceCode = R"(
contract test {
- function f(uint x) returns (uint y) {
+ function f(uint x) public returns (uint y) {
return 98 ^ (7 * ((1 | (x | 1000)) * 40) ^ 102);
}
}
@@ -194,7 +194,7 @@ BOOST_AUTO_TEST_CASE(storage_access)
char const* sourceCode = R"(
contract test {
uint8[40] data;
- function f(uint x) returns (uint y) {
+ function f(uint x) public returns (uint y) {
data[2] = data[7] = uint8(x);
data[4] = data[2] * 10 + data[3];
}
@@ -210,7 +210,7 @@ BOOST_AUTO_TEST_CASE(array_copy)
contract test {
bytes2[] data1;
bytes5[] data2;
- function f(uint x) returns (uint l, uint y) {
+ function f(uint x) public returns (uint l, uint y) {
data1.length = msg.data.length;
for (uint i = 0; i < msg.data.length; ++i)
data1[i] = msg.data[i];
@@ -230,8 +230,8 @@ BOOST_AUTO_TEST_CASE(function_calls)
{
char const* sourceCode = R"(
contract test {
- function f1(uint x) returns (uint) { return x*x; }
- function f(uint x) returns (uint) { return f1(7+x) - this.f1(x**9); }
+ function f1(uint x) public returns (uint) { return x*x; }
+ function f(uint x) public returns (uint) { return f1(7+x) - this.f1(x**9); }
}
)";
compileBothVersions(sourceCode);
@@ -245,7 +245,7 @@ BOOST_AUTO_TEST_CASE(storage_write_in_loops)
char const* sourceCode = R"(
contract test {
uint d;
- function f(uint a) returns (uint r) {
+ function f(uint a) public returns (uint r) {
uint x = d;
for (uint i = 1; i < a * a; i++) {
r = d;
@@ -270,7 +270,7 @@ BOOST_AUTO_TEST_CASE(retain_information_in_branches)
contract c {
bytes32 d;
uint a;
- function f(uint x, bytes32 y) returns (uint r_a, bytes32 r_d) {
+ function f(uint x, bytes32 y) public returns (uint r_a, bytes32 r_d) {
bytes32 z = keccak256(abi.encodePacked(y));
if (x > 8) {
z = keccak256(abi.encodePacked(y));
@@ -351,7 +351,7 @@ BOOST_AUTO_TEST_CASE(incorrect_storage_access_bug)
contract C
{
mapping(uint => uint) data;
- function f() returns (uint)
+ function f() public returns (uint)
{
if(data[now] == 0)
data[uint(-7)] = 5;
@@ -370,7 +370,7 @@ BOOST_AUTO_TEST_CASE(sequence_number_for_calls)
// to storage), so the sequence number should be incremented.
char const* sourceCode = R"(
contract test {
- function f(string a, string b) returns (bool) { return sha256(bytes(a)) == sha256(bytes(b)); }
+ function f(string a, string b) public returns (bool) { return sha256(bytes(a)) == sha256(bytes(b)); }
}
)";
compileBothVersions(sourceCode);
@@ -385,10 +385,10 @@ BOOST_AUTO_TEST_CASE(computing_constants)
uint m_b;
uint m_c;
uint m_d;
- constructor() {
+ constructor() public {
set();
}
- function set() returns (uint) {
+ function set() public returns (uint) {
m_a = 0x77abc0000000000000000000000000000000000000000000000000000000001;
m_b = 0x817416927846239487123469187231298734162934871263941234127518276;
g();
@@ -402,7 +402,7 @@ BOOST_AUTO_TEST_CASE(computing_constants)
function h() {
m_d = 0xff05694900000000000000000000000000000000000000000000000000000000;
}
- function get() returns (uint ra, uint rb, uint rc, uint rd) {
+ function get() public returns (uint ra, uint rb, uint rc, uint rd) {
ra = m_a;
rb = m_b;
rc = m_c;
@@ -444,7 +444,7 @@ BOOST_AUTO_TEST_CASE(constant_optimization_early_exit)
pragma solidity ^0.4.0;
contract HexEncoding {
- function hexEncodeTest(address addr) returns (bytes32 ret) {
+ function hexEncodeTest(address addr) public returns (bytes32 ret) {
uint x = uint(addr) / 2**32;
// Nibble interleave
@@ -561,11 +561,11 @@ BOOST_AUTO_TEST_CASE(dead_code_elimination_across_assemblies)
char const* sourceCode = R"(
contract DCE {
function () internal returns (uint) stored;
- constructor() {
+ constructor() public {
stored = f;
}
function f() internal returns (uint) { return 7; }
- function test() returns (uint) { return stored(); }
+ function test() public returns (uint) { return stored(); }
}
)";
compileBothVersions(sourceCode);
@@ -577,12 +577,12 @@ BOOST_AUTO_TEST_CASE(invalid_state_at_control_flow_join)
char const* sourceCode = R"(
contract Test {
uint256 public totalSupply = 100;
- function f() returns (uint r) {
+ function f() public returns (uint r) {
if (false)
r = totalSupply;
totalSupply -= 10;
}
- function test() returns (uint) {
+ function test() public returns (uint) {
f();
return this.totalSupply();
}
diff --git a/test/libsolidity/SolidityParser.cpp b/test/libsolidity/SolidityParser.cpp
index 1ffbd771..5432e9b5 100644
--- a/test/libsolidity/SolidityParser.cpp
+++ b/test/libsolidity/SolidityParser.cpp
@@ -118,7 +118,7 @@ BOOST_AUTO_TEST_CASE(function_natspec_documentation)
contract test {
uint256 stateVar;
/// This is a test function
- function functionName(bytes32 input) returns (bytes32 out) {}
+ function functionName(bytes32 input) public returns (bytes32 out) {}
}
)";
BOOST_CHECK(successParse(text));
@@ -138,7 +138,7 @@ BOOST_AUTO_TEST_CASE(function_normal_comments)
contract test {
uint256 stateVar;
// We won't see this comment
- function functionName(bytes32 input) returns (bytes32 out) {}
+ function functionName(bytes32 input) public returns (bytes32 out) {}
}
)";
BOOST_CHECK(successParse(text));
@@ -157,13 +157,13 @@ BOOST_AUTO_TEST_CASE(multiple_functions_natspec_documentation)
contract test {
uint256 stateVar;
/// This is test function 1
- function functionName1(bytes32 input) returns (bytes32 out) {}
+ function functionName1(bytes32 input) public returns (bytes32 out) {}
/// This is test function 2
- function functionName2(bytes32 input) returns (bytes32 out) {}
+ function functionName2(bytes32 input) public returns (bytes32 out) {}
// nothing to see here
- function functionName3(bytes32 input) returns (bytes32 out) {}
+ function functionName3(bytes32 input) public returns (bytes32 out) {}
/// This is test function 4
- function functionName4(bytes32 input) returns (bytes32 out) {}
+ function functionName4(bytes32 input) public returns (bytes32 out) {}
}
)";
BOOST_CHECK(successParse(text));
@@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE(multiline_function_documentation)
uint256 stateVar;
/// This is a test function
/// and it has 2 lines
- function functionName1(bytes32 input) returns (bytes32 out) {}
+ function functionName1(bytes32 input) public returns (bytes32 out) {}
}
)";
BOOST_CHECK(successParse(text));
@@ -220,7 +220,7 @@ BOOST_AUTO_TEST_CASE(natspec_comment_in_function_body)
}
/// This is a test function
/// and it has 2 lines
- function fun(bytes32 input) returns (bytes32 out) {}
+ function fun(bytes32 input) public returns (bytes32 out) {}
}
)";
BOOST_CHECK(successParse(text));
diff --git a/test/libsolidity/StandardCompiler.cpp b/test/libsolidity/StandardCompiler.cpp
index 63c03881..bfb0d739 100644
--- a/test/libsolidity/StandardCompiler.cpp
+++ b/test/libsolidity/StandardCompiler.cpp
@@ -556,10 +556,10 @@ BOOST_AUTO_TEST_CASE(library_filename_with_colon)
},
"sources": {
"fileA": {
- "content": "import \"git:library.sol\"; contract A { function f() returns (uint) { return L.g(); } }"
+ "content": "import \"git:library.sol\"; contract A { function f() public returns (uint) { return L.g(); } }"
},
"git:library.sol": {
- "content": "library L { function g() returns (uint) { return 1; } }"
+ "content": "library L { function g() public returns (uint) { return 1; } }"
}
}
}
@@ -706,10 +706,10 @@ BOOST_AUTO_TEST_CASE(library_linking)
},
"sources": {
"fileA": {
- "content": "import \"library.sol\"; import \"library2.sol\"; contract A { function f() returns (uint) { L2.g(); return L.g(); } }"
+ "content": "import \"library.sol\"; import \"library2.sol\"; contract A { function f() public returns (uint) { L2.g(); return L.g(); } }"
},
"library.sol": {
- "content": "library L { function g() returns (uint) { return 1; } }"
+ "content": "library L { function g() public returns (uint) { return 1; } }"
},
"library2.sol": {
"content": "library L2 { function g() { } }"
diff --git a/test/libsolidity/ViewPureChecker.cpp b/test/libsolidity/ViewPureChecker.cpp
index 53761ff2..bb5480b2 100644
--- a/test/libsolidity/ViewPureChecker.cpp
+++ b/test/libsolidity/ViewPureChecker.cpp
@@ -43,13 +43,11 @@ BOOST_AUTO_TEST_CASE(environment_access)
vector<string> view{
"block.coinbase",
"block.timestamp",
- "block.blockhash(7)",
"block.difficulty",
"block.number",
"block.gaslimit",
"blockhash(7)",
"gasleft()",
- "msg.gas",
"msg.value",
"msg.sender",
"tx.origin",
@@ -90,12 +88,11 @@ BOOST_AUTO_TEST_CASE(environment_access)
"Statement has no effect."
}));
- CHECK_WARNING_ALLOW_MULTI(
+ CHECK_ERROR(
"contract C { function f() view public { block.blockhash; } }",
- (std::vector<std::string>{
- "Function state mutability can be restricted to pure",
- "\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
- }));
+ TypeError,
+ "\"block.blockhash()\" has been deprecated in favor of \"blockhash()\""
+ );
}
BOOST_AUTO_TEST_CASE(assembly_staticcall)
diff --git a/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol b/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol
index 11d40f26..5add9106 100644
--- a/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol
+++ b/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol
@@ -1,7 +1,7 @@
contract C {
- function f(uint constant LEN) {
+ function f(uint constant LEN) public {
uint[LEN] a;
}
}
// ----
-// TypeError: (62-65): Invalid array length, expected integer literal or constant expression.
+// TypeError: (69-72): Invalid array length, expected integer literal or constant expression.
diff --git a/test/libsolidity/syntaxTests/array/length/cannot_be_function.sol b/test/libsolidity/syntaxTests/array/length/cannot_be_function.sol
index ac3abc4c..2ad97d27 100644
--- a/test/libsolidity/syntaxTests/array/length/cannot_be_function.sol
+++ b/test/libsolidity/syntaxTests/array/length/cannot_be_function.sol
@@ -1,6 +1,6 @@
contract C {
- function f() {}
+ function f() public {}
uint[f] ids;
}
// ----
-// TypeError: (42-43): Invalid array length, expected integer literal or constant expression.
+// TypeError: (49-50): Invalid array length, expected integer literal or constant expression.
diff --git a/test/libsolidity/syntaxTests/array/length/cannot_be_function_call.sol b/test/libsolidity/syntaxTests/array/length/cannot_be_function_call.sol
index a6863955..bb8cc599 100644
--- a/test/libsolidity/syntaxTests/array/length/cannot_be_function_call.sol
+++ b/test/libsolidity/syntaxTests/array/length/cannot_be_function_call.sol
@@ -1,7 +1,7 @@
contract C {
- function f(uint x) {}
+ function f(uint x) public {}
uint constant LEN = f();
uint[LEN] ids;
}
// ----
-// TypeError: (77-80): Invalid array length, expected integer literal or constant expression.
+// TypeError: (84-87): Invalid array length, expected integer literal or constant expression.
diff --git a/test/libsolidity/syntaxTests/array/length/complex_cyclic_constant.sol b/test/libsolidity/syntaxTests/array/length/complex_cyclic_constant.sol
index 254f9f02..ee107078 100644
--- a/test/libsolidity/syntaxTests/array/length/complex_cyclic_constant.sol
+++ b/test/libsolidity/syntaxTests/array/length/complex_cyclic_constant.sol
@@ -2,7 +2,7 @@ contract C {
uint constant L2 = LEN - 10;
uint constant L1 = L2 / 10;
uint constant LEN = 10 + L1 * 5;
- function f() {
+ function f() public {
uint[LEN] a;
}
}
diff --git a/test/libsolidity/syntaxTests/array/length/cyclic_constant.sol b/test/libsolidity/syntaxTests/array/length/cyclic_constant.sol
index 91ba9045..3adc0e9b 100644
--- a/test/libsolidity/syntaxTests/array/length/cyclic_constant.sol
+++ b/test/libsolidity/syntaxTests/array/length/cyclic_constant.sol
@@ -1,6 +1,6 @@
contract C {
uint constant LEN = LEN;
- function f() {
+ function f() public {
uint[LEN] a;
}
}
diff --git a/test/libsolidity/syntaxTests/array/uninitialized_storage_var.sol b/test/libsolidity/syntaxTests/array/uninitialized_storage_var.sol
new file mode 100644
index 00000000..363d8147
--- /dev/null
+++ b/test/libsolidity/syntaxTests/array/uninitialized_storage_var.sol
@@ -0,0 +1,9 @@
+contract C {
+ function f() {
+ uint[] storage x;
+ uint[10] storage y;
+ }
+}
+// ----
+// DeclarationError: (31-47): Uninitialized storage pointer.
+// DeclarationError: (51-69): Uninitialized storage pointer.
diff --git a/test/libsolidity/syntaxTests/constants/assign_constant_function_value.sol b/test/libsolidity/syntaxTests/constants/assign_constant_function_value.sol
index 88e94e29..0e242b30 100644
--- a/test/libsolidity/syntaxTests/constants/assign_constant_function_value.sol
+++ b/test/libsolidity/syntaxTests/constants/assign_constant_function_value.sol
@@ -3,4 +3,4 @@ contract C {
uint constant y = x();
}
// ----
-// Warning: (74-77): Initial value for constant variable has to be compile-time constant. This will fail to compile with the next breaking version change.
+// TypeError: (74-77): Initial value for constant variable has to be compile-time constant.
diff --git a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol
index 78272c98..39bf6384 100644
--- a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol
+++ b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol
@@ -1,9 +1,9 @@
contract test1 {
- constructor() view {}
+ constructor() public view {}
}
contract test2 {
- constructor() pure {}
+ constructor() public pure {}
}
// ----
-// TypeError: (19-40): Constructor must be payable or non-payable, but is "view".
-// TypeError: (62-83): Constructor must be payable or non-payable, but is "pure".
+// TypeError: (19-47): Constructor must be payable or non-payable, but is "view".
+// TypeError: (69-97): Constructor must be payable or non-payable, but is "pure".
diff --git a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol
index 1ceaffee..b9f2a4bb 100644
--- a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol
+++ b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol
@@ -1,11 +1,11 @@
contract test1 {
- function test1() view {}
+ function test1() public view {}
}
contract test2 {
- function test2() pure {}
+ function test2() public pure {}
}
// ----
-// Warning: (21-45): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
-// Warning: (69-93): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
-// TypeError: (21-45): Constructor must be payable or non-payable, but is "view".
-// TypeError: (69-93): Constructor must be payable or non-payable, but is "pure".
+// Warning: (21-52): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
+// Warning: (76-107): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
+// TypeError: (21-52): Constructor must be payable or non-payable, but is "view".
+// TypeError: (76-107): Constructor must be payable or non-payable, but is "pure".
diff --git a/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_new.sol b/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_new.sol
index 5e619143..6bbb83ce 100644
--- a/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_new.sol
+++ b/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_new.sol
@@ -1,5 +1,5 @@
contract C {
- constructor();
+ constructor() public;
}
// ----
-// TypeError: (14-28): Constructor must be implemented if declared.
+// TypeError: (14-35): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_old.sol b/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_old.sol
index 72458703..12bf6315 100644
--- a/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_old.sol
+++ b/test/libsolidity/syntaxTests/constructor/constructor_without_implementation_old.sol
@@ -1,6 +1,6 @@
contract C {
- function C();
+ function C() public;
}
// ----
-// Warning: (14-27): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
-// TypeError: (14-27): Constructor must be implemented if declared.
+// Warning: (14-34): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
+// TypeError: (14-34): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol b/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol
index fa5d54c4..2cab1851 100644
--- a/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol
+++ b/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol
@@ -1,7 +1,7 @@
interface I {
- constructor();
+ constructor() public;
}
// ----
-// Warning: (15-29): Functions in interfaces should be declared external.
-// TypeError: (15-29): Constructor cannot be defined in interfaces.
-// TypeError: (15-29): Constructor must be implemented if declared.
+// Warning: (15-36): Functions in interfaces should be declared external.
+// TypeError: (15-36): Constructor cannot be defined in interfaces.
+// TypeError: (15-36): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol b/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol
index ddf54977..313d4345 100644
--- a/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol
+++ b/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol
@@ -1,8 +1,8 @@
interface I {
- function I();
+ function I() public;
}
// ----
-// Warning: (15-28): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
-// Warning: (15-28): Functions in interfaces should be declared external.
-// TypeError: (15-28): Constructor cannot be defined in interfaces.
-// TypeError: (15-28): Constructor must be implemented if declared.
+// Warning: (15-35): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
+// Warning: (15-35): Functions in interfaces should be declared external.
+// TypeError: (15-35): Constructor cannot be defined in interfaces.
+// TypeError: (15-35): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/constructor/library_constructor_new.sol b/test/libsolidity/syntaxTests/constructor/library_constructor_new.sol
index 8db7e62a..38934f8d 100644
--- a/test/libsolidity/syntaxTests/constructor/library_constructor_new.sol
+++ b/test/libsolidity/syntaxTests/constructor/library_constructor_new.sol
@@ -1,6 +1,6 @@
library Lib {
- constructor();
+ constructor() public;
}
// ----
-// TypeError: (15-29): Constructor cannot be defined in libraries.
-// TypeError: (15-29): Constructor must be implemented if declared.
+// TypeError: (15-36): Constructor cannot be defined in libraries.
+// TypeError: (15-36): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/constructor/library_constructor_old.sol b/test/libsolidity/syntaxTests/constructor/library_constructor_old.sol
index d4499049..271cc790 100644
--- a/test/libsolidity/syntaxTests/constructor/library_constructor_old.sol
+++ b/test/libsolidity/syntaxTests/constructor/library_constructor_old.sol
@@ -1,7 +1,7 @@
library Lib {
- function Lib();
+ function Lib() public;
}
// ----
-// Warning: (15-30): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
-// TypeError: (15-30): Constructor cannot be defined in libraries.
-// TypeError: (15-30): Constructor must be implemented if declared.
+// Warning: (15-37): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
+// TypeError: (15-37): Constructor cannot be defined in libraries.
+// TypeError: (15-37): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol b/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol
index 876d6fd6..ac312685 100644
--- a/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol
@@ -1,5 +1,5 @@
contract test {
- function f() {
+ function f() public {
uint storage a1;
bytes16 storage b1;
uint memory a2;
@@ -7,7 +7,7 @@ contract test {
}
}
// ----
-// TypeError: (41-56): Data location can only be given for array or struct types.
-// TypeError: (64-82): Data location can only be given for array or struct types.
-// TypeError: (90-104): Data location can only be given for array or struct types.
-// TypeError: (112-129): Data location can only be given for array or struct types.
+// TypeError: (48-63): Data location can only be given for array or struct types.
+// TypeError: (71-89): Data location can only be given for array or struct types.
+// TypeError: (97-111): Data location can only be given for array or struct types.
+// TypeError: (119-136): Data location can only be given for array or struct types.
diff --git a/test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination.sol b/test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination.sol
index 3571e8a9..f115ac60 100644
--- a/test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination.sol
+++ b/test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination.sol
@@ -2,4 +2,4 @@ contract C {
uint constant x = 0x01 wei;
}
// ----
-// Warning: (32-40): Hexadecimal numbers with unit denominations are deprecated. You can use an expression of the form "0x1234 * 1 day" instead.
+// TypeError: (32-40): Hexadecimal numbers cannot be used with unit denominations. You can use an expression of the form "0x1234 * 1 day" instead.
diff --git a/test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination_050.sol b/test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination_050.sol
deleted file mode 100644
index 98865999..00000000
--- a/test/libsolidity/syntaxTests/denominations/combining_hex_and_denomination_050.sol
+++ /dev/null
@@ -1,6 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- uint constant x = 0x01 wei;
-}
-// ----
-// TypeError: (62-70): Hexadecimal numbers cannot be used with unit denominations. You can use an expression of the form "0x1234 * 1 day" instead.
diff --git a/test/libsolidity/syntaxTests/emit_non_event.sol b/test/libsolidity/syntaxTests/emit_non_event.sol
index 1df6990d..d5045ddf 100644
--- a/test/libsolidity/syntaxTests/emit_non_event.sol
+++ b/test/libsolidity/syntaxTests/emit_non_event.sol
@@ -1,10 +1,10 @@
contract C {
uint256 Test;
- function f() {
+ function f() public {
emit Test();
}
}
// ----
-// TypeError: (56-62): Type is not callable
-// TypeError: (56-60): Expression has to be an event invocation.
+// TypeError: (63-69): Type is not callable
+// TypeError: (63-67): Expression has to be an event invocation.
diff --git a/test/libsolidity/syntaxTests/functionCalls/named_arguments_for_functions_that_take_arbitrary_parameters.sol b/test/libsolidity/syntaxTests/functionCalls/named_arguments_for_functions_that_take_arbitrary_parameters.sol
new file mode 100644
index 00000000..089e1dbf
--- /dev/null
+++ b/test/libsolidity/syntaxTests/functionCalls/named_arguments_for_functions_that_take_arbitrary_parameters.sol
@@ -0,0 +1,7 @@
+contract C {
+ function f() pure public {
+ abi.encodeWithSelector({selector:"abc"});
+ }
+}
+// ----
+// TypeError: (52-92): Named arguments cannot be used for functions that take arbitrary parameters.
diff --git a/test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol b/test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol
index 95ebc179..6549eb48 100644
--- a/test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol
+++ b/test/libsolidity/syntaxTests/functionTypes/function_type_constructor.sol
@@ -1,7 +1,7 @@
contract C {
// Fool parser into parsing a constructor as a function type.
- constructor() x;
+ constructor() public x;
}
// ----
-// Warning: (83-99): Modifiers of functions without implementation are ignored.
-// DeclarationError: (97-98): Undeclared identifier.
+// Warning: (83-106): Modifiers of functions without implementation are ignored.
+// DeclarationError: (104-105): Undeclared identifier.
diff --git a/test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol b/test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol
index 10c6767c..e7d2c9a9 100644
--- a/test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol
+++ b/test/libsolidity/syntaxTests/functionTypes/valid_function_type_variables.sol
@@ -1,5 +1,5 @@
contract test {
- function fa(uint) {}
+ function fa(uint) public {}
function fb(uint) internal {}
function fc(uint) internal {}
function fd(uint) external {}
@@ -13,11 +13,14 @@ contract test {
function(uint) internal internal c = fc;
function(uint) external d = this.fd;
function(uint) external internal e = this.fe;
- function(uint) internal public f = ff;
- function(uint) internal pure public g = fg;
- function(uint) pure internal public h = fh;
+ function(uint) internal f = ff;
+ function(uint) internal pure g = fg;
+ function(uint) pure internal h = fh;
}
// ----
-// TypeError: (545-582): Internal or recursive type is not allowed for public state variables.
-// TypeError: (588-630): Internal or recursive type is not allowed for public state variables.
-// TypeError: (636-678): Internal or recursive type is not allowed for public state variables.
+// Warning: (20-47): Function state mutability can be restricted to pure
+// Warning: (52-81): Function state mutability can be restricted to pure
+// Warning: (86-115): Function state mutability can be restricted to pure
+// Warning: (120-149): Function state mutability can be restricted to pure
+// Warning: (154-183): Function state mutability can be restricted to pure
+// Warning: (188-217): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/inheritance/override/add_view.sol b/test/libsolidity/syntaxTests/inheritance/override/add_view.sol
index 9973b23e..21e43792 100644
--- a/test/libsolidity/syntaxTests/inheritance/override/add_view.sol
+++ b/test/libsolidity/syntaxTests/inheritance/override/add_view.sol
@@ -1,4 +1,4 @@
contract B { function f() public {} }
-contract C is B { function f() view {} }
+contract C is B { function f() public view {} }
// ----
-// TypeError: (56-76): Overriding function changes state mutability from "nonpayable" to "view".
+// TypeError: (56-83): Overriding function changes state mutability from "nonpayable" to "view".
diff --git a/test/libsolidity/syntaxTests/inheritance/override/remove_view.sol b/test/libsolidity/syntaxTests/inheritance/override/remove_view.sol
index e58f6b20..cc785858 100644
--- a/test/libsolidity/syntaxTests/inheritance/override/remove_view.sol
+++ b/test/libsolidity/syntaxTests/inheritance/override/remove_view.sol
@@ -1,4 +1,4 @@
-contract B { function f() view {} }
+contract B { function f() public view {} }
contract C is B { function f() public {} }
// ----
-// TypeError: (54-76): Overriding function changes state mutability from "view" to "nonpayable".
+// TypeError: (61-83): Overriding function changes state mutability from "view" to "nonpayable".
diff --git a/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup.sol b/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup.sol
index c23992e9..119df5d3 100644
--- a/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup.sol
+++ b/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup.sol
@@ -1,7 +1,7 @@
contract C {
- function f(uint, uint) {}
- function f(uint) {}
- function g() { f(1, 2, 3); }
+ function f(uint, uint) public {}
+ function f(uint) public {}
+ function g() public { f(1, 2, 3); }
}
// ----
-// TypeError: (80-81): No matching declaration found after argument-dependent lookup.
+// TypeError: (101-102): No matching declaration found after argument-dependent lookup.
diff --git a/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup_in_library.sol b/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup_in_library.sol
index 310c4a10..df0cba3f 100644
--- a/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup_in_library.sol
+++ b/test/libsolidity/syntaxTests/memberLookup/failed_function_lookup_in_library.sol
@@ -1,9 +1,9 @@
library L {
- function f(uint, uint) {}
- function f(uint) {}
+ function f(uint, uint) public {}
+ function f(uint) public {}
}
contract C {
- function g() { L.f(1, 2, 3); }
+ function g() public { L.f(1, 2, 3); }
}
// ----
-// TypeError: (94-97): Member "f" not found or not visible after argument-dependent lookup in type(library L)
+// TypeError: (115-118): Member "f" not found or not visible after argument-dependent lookup in type(library L)
diff --git a/test/libsolidity/syntaxTests/more_than_256_declarationerrors.sol b/test/libsolidity/syntaxTests/more_than_256_declarationerrors.sol
index 2d75f29b..307b728d 100644
--- a/test/libsolidity/syntaxTests/more_than_256_declarationerrors.sol
+++ b/test/libsolidity/syntaxTests/more_than_256_declarationerrors.sol
@@ -1,5 +1,5 @@
contract C {
- function f() {
+ function f() public {
b = 5;
b = 5;
b = 5;
@@ -265,260 +265,260 @@ contract C {
}
}
// ----
-// DeclarationError: (34-35): Undeclared identifier.
-// DeclarationError: (45-46): Undeclared identifier.
-// DeclarationError: (56-57): Undeclared identifier.
-// DeclarationError: (67-68): Undeclared identifier.
-// DeclarationError: (78-79): Undeclared identifier.
-// DeclarationError: (89-90): Undeclared identifier.
-// DeclarationError: (100-101): Undeclared identifier.
-// DeclarationError: (111-112): Undeclared identifier.
-// DeclarationError: (122-123): Undeclared identifier.
-// DeclarationError: (133-134): Undeclared identifier.
-// DeclarationError: (144-145): Undeclared identifier.
-// DeclarationError: (155-156): Undeclared identifier.
-// DeclarationError: (166-167): Undeclared identifier.
-// DeclarationError: (177-178): Undeclared identifier.
-// DeclarationError: (188-189): Undeclared identifier.
-// DeclarationError: (199-200): Undeclared identifier.
-// DeclarationError: (210-211): Undeclared identifier.
-// DeclarationError: (221-222): Undeclared identifier.
-// DeclarationError: (232-233): Undeclared identifier.
-// DeclarationError: (243-244): Undeclared identifier.
-// DeclarationError: (254-255): Undeclared identifier.
-// DeclarationError: (265-266): Undeclared identifier.
-// DeclarationError: (276-277): Undeclared identifier.
-// DeclarationError: (287-288): Undeclared identifier.
-// DeclarationError: (298-299): Undeclared identifier.
-// DeclarationError: (309-310): Undeclared identifier.
-// DeclarationError: (320-321): Undeclared identifier.
-// DeclarationError: (331-332): Undeclared identifier.
-// DeclarationError: (342-343): Undeclared identifier.
-// DeclarationError: (353-354): Undeclared identifier.
-// DeclarationError: (364-365): Undeclared identifier.
-// DeclarationError: (375-376): Undeclared identifier.
-// DeclarationError: (386-387): Undeclared identifier.
-// DeclarationError: (397-398): Undeclared identifier.
-// DeclarationError: (408-409): Undeclared identifier.
-// DeclarationError: (419-420): Undeclared identifier.
-// DeclarationError: (430-431): Undeclared identifier.
-// DeclarationError: (441-442): Undeclared identifier.
-// DeclarationError: (452-453): Undeclared identifier.
-// DeclarationError: (463-464): Undeclared identifier.
-// DeclarationError: (474-475): Undeclared identifier.
-// DeclarationError: (485-486): Undeclared identifier.
-// DeclarationError: (496-497): Undeclared identifier.
-// DeclarationError: (507-508): Undeclared identifier.
-// DeclarationError: (518-519): Undeclared identifier.
-// DeclarationError: (529-530): Undeclared identifier.
-// DeclarationError: (540-541): Undeclared identifier.
-// DeclarationError: (551-552): Undeclared identifier.
-// DeclarationError: (562-563): Undeclared identifier.
-// DeclarationError: (573-574): Undeclared identifier.
-// DeclarationError: (584-585): Undeclared identifier.
-// DeclarationError: (595-596): Undeclared identifier.
-// DeclarationError: (606-607): Undeclared identifier.
-// DeclarationError: (617-618): Undeclared identifier.
-// DeclarationError: (628-629): Undeclared identifier.
-// DeclarationError: (639-640): Undeclared identifier.
-// DeclarationError: (650-651): Undeclared identifier.
-// DeclarationError: (661-662): Undeclared identifier.
-// DeclarationError: (672-673): Undeclared identifier.
-// DeclarationError: (683-684): Undeclared identifier.
-// DeclarationError: (694-695): Undeclared identifier.
-// DeclarationError: (705-706): Undeclared identifier.
-// DeclarationError: (716-717): Undeclared identifier.
-// DeclarationError: (727-728): Undeclared identifier.
-// DeclarationError: (738-739): Undeclared identifier.
-// DeclarationError: (749-750): Undeclared identifier.
-// DeclarationError: (760-761): Undeclared identifier.
-// DeclarationError: (771-772): Undeclared identifier.
-// DeclarationError: (782-783): Undeclared identifier.
-// DeclarationError: (793-794): Undeclared identifier.
-// DeclarationError: (804-805): Undeclared identifier.
-// DeclarationError: (815-816): Undeclared identifier.
-// DeclarationError: (826-827): Undeclared identifier.
-// DeclarationError: (837-838): Undeclared identifier.
-// DeclarationError: (848-849): Undeclared identifier.
-// DeclarationError: (859-860): Undeclared identifier.
-// DeclarationError: (870-871): Undeclared identifier.
-// DeclarationError: (881-882): Undeclared identifier.
-// DeclarationError: (892-893): Undeclared identifier.
-// DeclarationError: (903-904): Undeclared identifier.
-// DeclarationError: (914-915): Undeclared identifier.
-// DeclarationError: (925-926): Undeclared identifier.
-// DeclarationError: (936-937): Undeclared identifier.
-// DeclarationError: (947-948): Undeclared identifier.
-// DeclarationError: (958-959): Undeclared identifier.
-// DeclarationError: (969-970): Undeclared identifier.
-// DeclarationError: (980-981): Undeclared identifier.
-// DeclarationError: (991-992): Undeclared identifier.
-// DeclarationError: (1002-1003): Undeclared identifier.
-// DeclarationError: (1013-1014): Undeclared identifier.
-// DeclarationError: (1024-1025): Undeclared identifier.
-// DeclarationError: (1035-1036): Undeclared identifier.
-// DeclarationError: (1046-1047): Undeclared identifier.
-// DeclarationError: (1057-1058): Undeclared identifier.
-// DeclarationError: (1068-1069): Undeclared identifier.
-// DeclarationError: (1079-1080): Undeclared identifier.
-// DeclarationError: (1090-1091): Undeclared identifier.
-// DeclarationError: (1101-1102): Undeclared identifier.
-// DeclarationError: (1112-1113): Undeclared identifier.
-// DeclarationError: (1123-1124): Undeclared identifier.
-// DeclarationError: (1134-1135): Undeclared identifier.
-// DeclarationError: (1145-1146): Undeclared identifier.
-// DeclarationError: (1156-1157): Undeclared identifier.
-// DeclarationError: (1167-1168): Undeclared identifier.
-// DeclarationError: (1178-1179): Undeclared identifier.
-// DeclarationError: (1189-1190): Undeclared identifier.
-// DeclarationError: (1200-1201): Undeclared identifier.
-// DeclarationError: (1211-1212): Undeclared identifier.
-// DeclarationError: (1222-1223): Undeclared identifier.
-// DeclarationError: (1233-1234): Undeclared identifier.
-// DeclarationError: (1244-1245): Undeclared identifier.
-// DeclarationError: (1255-1256): Undeclared identifier.
-// DeclarationError: (1266-1267): Undeclared identifier.
-// DeclarationError: (1277-1278): Undeclared identifier.
-// DeclarationError: (1288-1289): Undeclared identifier.
-// DeclarationError: (1299-1300): Undeclared identifier.
-// DeclarationError: (1310-1311): Undeclared identifier.
-// DeclarationError: (1321-1322): Undeclared identifier.
-// DeclarationError: (1332-1333): Undeclared identifier.
-// DeclarationError: (1343-1344): Undeclared identifier.
-// DeclarationError: (1354-1355): Undeclared identifier.
-// DeclarationError: (1365-1366): Undeclared identifier.
-// DeclarationError: (1376-1377): Undeclared identifier.
-// DeclarationError: (1387-1388): Undeclared identifier.
-// DeclarationError: (1398-1399): Undeclared identifier.
-// DeclarationError: (1409-1410): Undeclared identifier.
-// DeclarationError: (1420-1421): Undeclared identifier.
-// DeclarationError: (1431-1432): Undeclared identifier.
-// DeclarationError: (1442-1443): Undeclared identifier.
-// DeclarationError: (1453-1454): Undeclared identifier.
-// DeclarationError: (1464-1465): Undeclared identifier.
-// DeclarationError: (1475-1476): Undeclared identifier.
-// DeclarationError: (1486-1487): Undeclared identifier.
-// DeclarationError: (1497-1498): Undeclared identifier.
-// DeclarationError: (1508-1509): Undeclared identifier.
-// DeclarationError: (1519-1520): Undeclared identifier.
-// DeclarationError: (1530-1531): Undeclared identifier.
-// DeclarationError: (1541-1542): Undeclared identifier.
-// DeclarationError: (1552-1553): Undeclared identifier.
-// DeclarationError: (1563-1564): Undeclared identifier.
-// DeclarationError: (1574-1575): Undeclared identifier.
-// DeclarationError: (1585-1586): Undeclared identifier.
-// DeclarationError: (1596-1597): Undeclared identifier.
-// DeclarationError: (1607-1608): Undeclared identifier.
-// DeclarationError: (1618-1619): Undeclared identifier.
-// DeclarationError: (1629-1630): Undeclared identifier.
-// DeclarationError: (1640-1641): Undeclared identifier.
-// DeclarationError: (1651-1652): Undeclared identifier.
-// DeclarationError: (1662-1663): Undeclared identifier.
-// DeclarationError: (1673-1674): Undeclared identifier.
-// DeclarationError: (1684-1685): Undeclared identifier.
-// DeclarationError: (1695-1696): Undeclared identifier.
-// DeclarationError: (1706-1707): Undeclared identifier.
-// DeclarationError: (1717-1718): Undeclared identifier.
-// DeclarationError: (1728-1729): Undeclared identifier.
-// DeclarationError: (1739-1740): Undeclared identifier.
-// DeclarationError: (1750-1751): Undeclared identifier.
-// DeclarationError: (1761-1762): Undeclared identifier.
-// DeclarationError: (1772-1773): Undeclared identifier.
-// DeclarationError: (1783-1784): Undeclared identifier.
-// DeclarationError: (1794-1795): Undeclared identifier.
-// DeclarationError: (1805-1806): Undeclared identifier.
-// DeclarationError: (1816-1817): Undeclared identifier.
-// DeclarationError: (1827-1828): Undeclared identifier.
-// DeclarationError: (1838-1839): Undeclared identifier.
-// DeclarationError: (1849-1850): Undeclared identifier.
-// DeclarationError: (1860-1861): Undeclared identifier.
-// DeclarationError: (1871-1872): Undeclared identifier.
-// DeclarationError: (1882-1883): Undeclared identifier.
-// DeclarationError: (1893-1894): Undeclared identifier.
-// DeclarationError: (1904-1905): Undeclared identifier.
-// DeclarationError: (1915-1916): Undeclared identifier.
-// DeclarationError: (1926-1927): Undeclared identifier.
-// DeclarationError: (1937-1938): Undeclared identifier.
-// DeclarationError: (1948-1949): Undeclared identifier.
-// DeclarationError: (1959-1960): Undeclared identifier.
-// DeclarationError: (1970-1971): Undeclared identifier.
-// DeclarationError: (1981-1982): Undeclared identifier.
-// DeclarationError: (1992-1993): Undeclared identifier.
-// DeclarationError: (2003-2004): Undeclared identifier.
-// DeclarationError: (2014-2015): Undeclared identifier.
-// DeclarationError: (2025-2026): Undeclared identifier.
-// DeclarationError: (2036-2037): Undeclared identifier.
-// DeclarationError: (2047-2048): Undeclared identifier.
-// DeclarationError: (2058-2059): Undeclared identifier.
-// DeclarationError: (2069-2070): Undeclared identifier.
-// DeclarationError: (2080-2081): Undeclared identifier.
-// DeclarationError: (2091-2092): Undeclared identifier.
-// DeclarationError: (2102-2103): Undeclared identifier.
-// DeclarationError: (2113-2114): Undeclared identifier.
-// DeclarationError: (2124-2125): Undeclared identifier.
-// DeclarationError: (2135-2136): Undeclared identifier.
-// DeclarationError: (2146-2147): Undeclared identifier.
-// DeclarationError: (2157-2158): Undeclared identifier.
-// DeclarationError: (2168-2169): Undeclared identifier.
-// DeclarationError: (2179-2180): Undeclared identifier.
-// DeclarationError: (2190-2191): Undeclared identifier.
-// DeclarationError: (2201-2202): Undeclared identifier.
-// DeclarationError: (2212-2213): Undeclared identifier.
-// DeclarationError: (2223-2224): Undeclared identifier.
-// DeclarationError: (2234-2235): Undeclared identifier.
-// DeclarationError: (2245-2246): Undeclared identifier.
-// DeclarationError: (2256-2257): Undeclared identifier.
-// DeclarationError: (2267-2268): Undeclared identifier.
-// DeclarationError: (2278-2279): Undeclared identifier.
-// DeclarationError: (2289-2290): Undeclared identifier.
-// DeclarationError: (2300-2301): Undeclared identifier.
-// DeclarationError: (2311-2312): Undeclared identifier.
-// DeclarationError: (2322-2323): Undeclared identifier.
-// DeclarationError: (2333-2334): Undeclared identifier.
-// DeclarationError: (2344-2345): Undeclared identifier.
-// DeclarationError: (2355-2356): Undeclared identifier.
-// DeclarationError: (2366-2367): Undeclared identifier.
-// DeclarationError: (2377-2378): Undeclared identifier.
-// DeclarationError: (2388-2389): Undeclared identifier.
-// DeclarationError: (2399-2400): Undeclared identifier.
-// DeclarationError: (2410-2411): Undeclared identifier.
-// DeclarationError: (2421-2422): Undeclared identifier.
-// DeclarationError: (2432-2433): Undeclared identifier.
-// DeclarationError: (2443-2444): Undeclared identifier.
-// DeclarationError: (2454-2455): Undeclared identifier.
-// DeclarationError: (2465-2466): Undeclared identifier.
-// DeclarationError: (2476-2477): Undeclared identifier.
-// DeclarationError: (2487-2488): Undeclared identifier.
-// DeclarationError: (2498-2499): Undeclared identifier.
-// DeclarationError: (2509-2510): Undeclared identifier.
-// DeclarationError: (2520-2521): Undeclared identifier.
-// DeclarationError: (2531-2532): Undeclared identifier.
-// DeclarationError: (2542-2543): Undeclared identifier.
-// DeclarationError: (2553-2554): Undeclared identifier.
-// DeclarationError: (2564-2565): Undeclared identifier.
-// DeclarationError: (2575-2576): Undeclared identifier.
-// DeclarationError: (2586-2587): Undeclared identifier.
-// DeclarationError: (2597-2598): Undeclared identifier.
-// DeclarationError: (2608-2609): Undeclared identifier.
-// DeclarationError: (2619-2620): Undeclared identifier.
-// DeclarationError: (2630-2631): Undeclared identifier.
-// DeclarationError: (2641-2642): Undeclared identifier.
-// DeclarationError: (2652-2653): Undeclared identifier.
-// DeclarationError: (2663-2664): Undeclared identifier.
-// DeclarationError: (2674-2675): Undeclared identifier.
-// DeclarationError: (2685-2686): Undeclared identifier.
-// DeclarationError: (2696-2697): Undeclared identifier.
-// DeclarationError: (2707-2708): Undeclared identifier.
-// DeclarationError: (2718-2719): Undeclared identifier.
-// DeclarationError: (2729-2730): Undeclared identifier.
-// DeclarationError: (2740-2741): Undeclared identifier.
-// DeclarationError: (2751-2752): Undeclared identifier.
-// DeclarationError: (2762-2763): Undeclared identifier.
-// DeclarationError: (2773-2774): Undeclared identifier.
-// DeclarationError: (2784-2785): Undeclared identifier.
-// DeclarationError: (2795-2796): Undeclared identifier.
-// DeclarationError: (2806-2807): Undeclared identifier.
-// DeclarationError: (2817-2818): Undeclared identifier.
-// DeclarationError: (2828-2829): Undeclared identifier.
-// DeclarationError: (2839-2840): Undeclared identifier.
+// DeclarationError: (41-42): Undeclared identifier.
+// DeclarationError: (52-53): Undeclared identifier.
+// DeclarationError: (63-64): Undeclared identifier.
+// DeclarationError: (74-75): Undeclared identifier.
+// DeclarationError: (85-86): Undeclared identifier.
+// DeclarationError: (96-97): Undeclared identifier.
+// DeclarationError: (107-108): Undeclared identifier.
+// DeclarationError: (118-119): Undeclared identifier.
+// DeclarationError: (129-130): Undeclared identifier.
+// DeclarationError: (140-141): Undeclared identifier.
+// DeclarationError: (151-152): Undeclared identifier.
+// DeclarationError: (162-163): Undeclared identifier.
+// DeclarationError: (173-174): Undeclared identifier.
+// DeclarationError: (184-185): Undeclared identifier.
+// DeclarationError: (195-196): Undeclared identifier.
+// DeclarationError: (206-207): Undeclared identifier.
+// DeclarationError: (217-218): Undeclared identifier.
+// DeclarationError: (228-229): Undeclared identifier.
+// DeclarationError: (239-240): Undeclared identifier.
+// DeclarationError: (250-251): Undeclared identifier.
+// DeclarationError: (261-262): Undeclared identifier.
+// DeclarationError: (272-273): Undeclared identifier.
+// DeclarationError: (283-284): Undeclared identifier.
+// DeclarationError: (294-295): Undeclared identifier.
+// DeclarationError: (305-306): Undeclared identifier.
+// DeclarationError: (316-317): Undeclared identifier.
+// DeclarationError: (327-328): Undeclared identifier.
+// DeclarationError: (338-339): Undeclared identifier.
+// DeclarationError: (349-350): Undeclared identifier.
+// DeclarationError: (360-361): Undeclared identifier.
+// DeclarationError: (371-372): Undeclared identifier.
+// DeclarationError: (382-383): Undeclared identifier.
+// DeclarationError: (393-394): Undeclared identifier.
+// DeclarationError: (404-405): Undeclared identifier.
+// DeclarationError: (415-416): Undeclared identifier.
+// DeclarationError: (426-427): Undeclared identifier.
+// DeclarationError: (437-438): Undeclared identifier.
+// DeclarationError: (448-449): Undeclared identifier.
+// DeclarationError: (459-460): Undeclared identifier.
+// DeclarationError: (470-471): Undeclared identifier.
+// DeclarationError: (481-482): Undeclared identifier.
+// DeclarationError: (492-493): Undeclared identifier.
+// DeclarationError: (503-504): Undeclared identifier.
+// DeclarationError: (514-515): Undeclared identifier.
+// DeclarationError: (525-526): Undeclared identifier.
+// DeclarationError: (536-537): Undeclared identifier.
+// DeclarationError: (547-548): Undeclared identifier.
+// DeclarationError: (558-559): Undeclared identifier.
+// DeclarationError: (569-570): Undeclared identifier.
+// DeclarationError: (580-581): Undeclared identifier.
+// DeclarationError: (591-592): Undeclared identifier.
+// DeclarationError: (602-603): Undeclared identifier.
+// DeclarationError: (613-614): Undeclared identifier.
+// DeclarationError: (624-625): Undeclared identifier.
+// DeclarationError: (635-636): Undeclared identifier.
+// DeclarationError: (646-647): Undeclared identifier.
+// DeclarationError: (657-658): Undeclared identifier.
+// DeclarationError: (668-669): Undeclared identifier.
+// DeclarationError: (679-680): Undeclared identifier.
+// DeclarationError: (690-691): Undeclared identifier.
+// DeclarationError: (701-702): Undeclared identifier.
+// DeclarationError: (712-713): Undeclared identifier.
+// DeclarationError: (723-724): Undeclared identifier.
+// DeclarationError: (734-735): Undeclared identifier.
+// DeclarationError: (745-746): Undeclared identifier.
+// DeclarationError: (756-757): Undeclared identifier.
+// DeclarationError: (767-768): Undeclared identifier.
+// DeclarationError: (778-779): Undeclared identifier.
+// DeclarationError: (789-790): Undeclared identifier.
+// DeclarationError: (800-801): Undeclared identifier.
+// DeclarationError: (811-812): Undeclared identifier.
+// DeclarationError: (822-823): Undeclared identifier.
+// DeclarationError: (833-834): Undeclared identifier.
+// DeclarationError: (844-845): Undeclared identifier.
+// DeclarationError: (855-856): Undeclared identifier.
+// DeclarationError: (866-867): Undeclared identifier.
+// DeclarationError: (877-878): Undeclared identifier.
+// DeclarationError: (888-889): Undeclared identifier.
+// DeclarationError: (899-900): Undeclared identifier.
+// DeclarationError: (910-911): Undeclared identifier.
+// DeclarationError: (921-922): Undeclared identifier.
+// DeclarationError: (932-933): Undeclared identifier.
+// DeclarationError: (943-944): Undeclared identifier.
+// DeclarationError: (954-955): Undeclared identifier.
+// DeclarationError: (965-966): Undeclared identifier.
+// DeclarationError: (976-977): Undeclared identifier.
+// DeclarationError: (987-988): Undeclared identifier.
+// DeclarationError: (998-999): Undeclared identifier.
+// DeclarationError: (1009-1010): Undeclared identifier.
+// DeclarationError: (1020-1021): Undeclared identifier.
+// DeclarationError: (1031-1032): Undeclared identifier.
+// DeclarationError: (1042-1043): Undeclared identifier.
+// DeclarationError: (1053-1054): Undeclared identifier.
+// DeclarationError: (1064-1065): Undeclared identifier.
+// DeclarationError: (1075-1076): Undeclared identifier.
+// DeclarationError: (1086-1087): Undeclared identifier.
+// DeclarationError: (1097-1098): Undeclared identifier.
+// DeclarationError: (1108-1109): Undeclared identifier.
+// DeclarationError: (1119-1120): Undeclared identifier.
+// DeclarationError: (1130-1131): Undeclared identifier.
+// DeclarationError: (1141-1142): Undeclared identifier.
+// DeclarationError: (1152-1153): Undeclared identifier.
+// DeclarationError: (1163-1164): Undeclared identifier.
+// DeclarationError: (1174-1175): Undeclared identifier.
+// DeclarationError: (1185-1186): Undeclared identifier.
+// DeclarationError: (1196-1197): Undeclared identifier.
+// DeclarationError: (1207-1208): Undeclared identifier.
+// DeclarationError: (1218-1219): Undeclared identifier.
+// DeclarationError: (1229-1230): Undeclared identifier.
+// DeclarationError: (1240-1241): Undeclared identifier.
+// DeclarationError: (1251-1252): Undeclared identifier.
+// DeclarationError: (1262-1263): Undeclared identifier.
+// DeclarationError: (1273-1274): Undeclared identifier.
+// DeclarationError: (1284-1285): Undeclared identifier.
+// DeclarationError: (1295-1296): Undeclared identifier.
+// DeclarationError: (1306-1307): Undeclared identifier.
+// DeclarationError: (1317-1318): Undeclared identifier.
+// DeclarationError: (1328-1329): Undeclared identifier.
+// DeclarationError: (1339-1340): Undeclared identifier.
+// DeclarationError: (1350-1351): Undeclared identifier.
+// DeclarationError: (1361-1362): Undeclared identifier.
+// DeclarationError: (1372-1373): Undeclared identifier.
+// DeclarationError: (1383-1384): Undeclared identifier.
+// DeclarationError: (1394-1395): Undeclared identifier.
+// DeclarationError: (1405-1406): Undeclared identifier.
+// DeclarationError: (1416-1417): Undeclared identifier.
+// DeclarationError: (1427-1428): Undeclared identifier.
+// DeclarationError: (1438-1439): Undeclared identifier.
+// DeclarationError: (1449-1450): Undeclared identifier.
+// DeclarationError: (1460-1461): Undeclared identifier.
+// DeclarationError: (1471-1472): Undeclared identifier.
+// DeclarationError: (1482-1483): Undeclared identifier.
+// DeclarationError: (1493-1494): Undeclared identifier.
+// DeclarationError: (1504-1505): Undeclared identifier.
+// DeclarationError: (1515-1516): Undeclared identifier.
+// DeclarationError: (1526-1527): Undeclared identifier.
+// DeclarationError: (1537-1538): Undeclared identifier.
+// DeclarationError: (1548-1549): Undeclared identifier.
+// DeclarationError: (1559-1560): Undeclared identifier.
+// DeclarationError: (1570-1571): Undeclared identifier.
+// DeclarationError: (1581-1582): Undeclared identifier.
+// DeclarationError: (1592-1593): Undeclared identifier.
+// DeclarationError: (1603-1604): Undeclared identifier.
+// DeclarationError: (1614-1615): Undeclared identifier.
+// DeclarationError: (1625-1626): Undeclared identifier.
+// DeclarationError: (1636-1637): Undeclared identifier.
+// DeclarationError: (1647-1648): Undeclared identifier.
+// DeclarationError: (1658-1659): Undeclared identifier.
+// DeclarationError: (1669-1670): Undeclared identifier.
+// DeclarationError: (1680-1681): Undeclared identifier.
+// DeclarationError: (1691-1692): Undeclared identifier.
+// DeclarationError: (1702-1703): Undeclared identifier.
+// DeclarationError: (1713-1714): Undeclared identifier.
+// DeclarationError: (1724-1725): Undeclared identifier.
+// DeclarationError: (1735-1736): Undeclared identifier.
+// DeclarationError: (1746-1747): Undeclared identifier.
+// DeclarationError: (1757-1758): Undeclared identifier.
+// DeclarationError: (1768-1769): Undeclared identifier.
+// DeclarationError: (1779-1780): Undeclared identifier.
+// DeclarationError: (1790-1791): Undeclared identifier.
+// DeclarationError: (1801-1802): Undeclared identifier.
+// DeclarationError: (1812-1813): Undeclared identifier.
+// DeclarationError: (1823-1824): Undeclared identifier.
+// DeclarationError: (1834-1835): Undeclared identifier.
+// DeclarationError: (1845-1846): Undeclared identifier.
+// DeclarationError: (1856-1857): Undeclared identifier.
+// DeclarationError: (1867-1868): Undeclared identifier.
+// DeclarationError: (1878-1879): Undeclared identifier.
+// DeclarationError: (1889-1890): Undeclared identifier.
+// DeclarationError: (1900-1901): Undeclared identifier.
+// DeclarationError: (1911-1912): Undeclared identifier.
+// DeclarationError: (1922-1923): Undeclared identifier.
+// DeclarationError: (1933-1934): Undeclared identifier.
+// DeclarationError: (1944-1945): Undeclared identifier.
+// DeclarationError: (1955-1956): Undeclared identifier.
+// DeclarationError: (1966-1967): Undeclared identifier.
+// DeclarationError: (1977-1978): Undeclared identifier.
+// DeclarationError: (1988-1989): Undeclared identifier.
+// DeclarationError: (1999-2000): Undeclared identifier.
+// DeclarationError: (2010-2011): Undeclared identifier.
+// DeclarationError: (2021-2022): Undeclared identifier.
+// DeclarationError: (2032-2033): Undeclared identifier.
+// DeclarationError: (2043-2044): Undeclared identifier.
+// DeclarationError: (2054-2055): Undeclared identifier.
+// DeclarationError: (2065-2066): Undeclared identifier.
+// DeclarationError: (2076-2077): Undeclared identifier.
+// DeclarationError: (2087-2088): Undeclared identifier.
+// DeclarationError: (2098-2099): Undeclared identifier.
+// DeclarationError: (2109-2110): Undeclared identifier.
+// DeclarationError: (2120-2121): Undeclared identifier.
+// DeclarationError: (2131-2132): Undeclared identifier.
+// DeclarationError: (2142-2143): Undeclared identifier.
+// DeclarationError: (2153-2154): Undeclared identifier.
+// DeclarationError: (2164-2165): Undeclared identifier.
+// DeclarationError: (2175-2176): Undeclared identifier.
+// DeclarationError: (2186-2187): Undeclared identifier.
+// DeclarationError: (2197-2198): Undeclared identifier.
+// DeclarationError: (2208-2209): Undeclared identifier.
+// DeclarationError: (2219-2220): Undeclared identifier.
+// DeclarationError: (2230-2231): Undeclared identifier.
+// DeclarationError: (2241-2242): Undeclared identifier.
+// DeclarationError: (2252-2253): Undeclared identifier.
+// DeclarationError: (2263-2264): Undeclared identifier.
+// DeclarationError: (2274-2275): Undeclared identifier.
+// DeclarationError: (2285-2286): Undeclared identifier.
+// DeclarationError: (2296-2297): Undeclared identifier.
+// DeclarationError: (2307-2308): Undeclared identifier.
+// DeclarationError: (2318-2319): Undeclared identifier.
+// DeclarationError: (2329-2330): Undeclared identifier.
+// DeclarationError: (2340-2341): Undeclared identifier.
+// DeclarationError: (2351-2352): Undeclared identifier.
+// DeclarationError: (2362-2363): Undeclared identifier.
+// DeclarationError: (2373-2374): Undeclared identifier.
+// DeclarationError: (2384-2385): Undeclared identifier.
+// DeclarationError: (2395-2396): Undeclared identifier.
+// DeclarationError: (2406-2407): Undeclared identifier.
+// DeclarationError: (2417-2418): Undeclared identifier.
+// DeclarationError: (2428-2429): Undeclared identifier.
+// DeclarationError: (2439-2440): Undeclared identifier.
+// DeclarationError: (2450-2451): Undeclared identifier.
+// DeclarationError: (2461-2462): Undeclared identifier.
+// DeclarationError: (2472-2473): Undeclared identifier.
+// DeclarationError: (2483-2484): Undeclared identifier.
+// DeclarationError: (2494-2495): Undeclared identifier.
+// DeclarationError: (2505-2506): Undeclared identifier.
+// DeclarationError: (2516-2517): Undeclared identifier.
+// DeclarationError: (2527-2528): Undeclared identifier.
+// DeclarationError: (2538-2539): Undeclared identifier.
+// DeclarationError: (2549-2550): Undeclared identifier.
+// DeclarationError: (2560-2561): Undeclared identifier.
+// DeclarationError: (2571-2572): Undeclared identifier.
+// DeclarationError: (2582-2583): Undeclared identifier.
+// DeclarationError: (2593-2594): Undeclared identifier.
+// DeclarationError: (2604-2605): Undeclared identifier.
+// DeclarationError: (2615-2616): Undeclared identifier.
+// DeclarationError: (2626-2627): Undeclared identifier.
+// DeclarationError: (2637-2638): Undeclared identifier.
+// DeclarationError: (2648-2649): Undeclared identifier.
+// DeclarationError: (2659-2660): Undeclared identifier.
+// DeclarationError: (2670-2671): Undeclared identifier.
+// DeclarationError: (2681-2682): Undeclared identifier.
+// DeclarationError: (2692-2693): Undeclared identifier.
+// DeclarationError: (2703-2704): Undeclared identifier.
+// DeclarationError: (2714-2715): Undeclared identifier.
+// DeclarationError: (2725-2726): Undeclared identifier.
+// DeclarationError: (2736-2737): Undeclared identifier.
+// DeclarationError: (2747-2748): Undeclared identifier.
+// DeclarationError: (2758-2759): Undeclared identifier.
+// DeclarationError: (2769-2770): Undeclared identifier.
+// DeclarationError: (2780-2781): Undeclared identifier.
+// DeclarationError: (2791-2792): Undeclared identifier.
+// DeclarationError: (2802-2803): Undeclared identifier.
+// DeclarationError: (2813-2814): Undeclared identifier.
+// DeclarationError: (2824-2825): Undeclared identifier.
+// DeclarationError: (2835-2836): Undeclared identifier.
+// DeclarationError: (2846-2847): Undeclared identifier.
// Warning: There are more than 256 errors. Aborting.
diff --git a/test/libsolidity/syntaxTests/more_than_256_syntaxerrors.sol b/test/libsolidity/syntaxTests/more_than_256_syntaxerrors.sol
index 2c9b8a42..fe877396 100644
--- a/test/libsolidity/syntaxTests/more_than_256_syntaxerrors.sol
+++ b/test/libsolidity/syntaxTests/more_than_256_syntaxerrors.sol
@@ -1,5 +1,5 @@
contract C {
- function f() {
+ function f() public {
continue;
continue;
continue;
@@ -265,260 +265,260 @@ contract C {
}
}
// ----
-// SyntaxError: (34-42): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (48-56): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (62-70): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (76-84): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (90-98): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (104-112): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (118-126): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (132-140): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (146-154): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (160-168): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (174-182): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (188-196): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (202-210): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (216-224): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (230-238): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (244-252): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (258-266): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (272-280): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (286-294): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (300-308): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (314-322): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (328-336): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (342-350): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (356-364): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (370-378): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (384-392): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (398-406): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (412-420): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (426-434): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (440-448): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (454-462): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (468-476): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (482-490): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (496-504): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (510-518): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (524-532): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (538-546): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (552-560): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (566-574): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (580-588): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (594-602): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (608-616): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (622-630): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (636-644): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (650-658): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (664-672): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (678-686): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (692-700): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (706-714): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (720-728): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (734-742): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (748-756): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (762-770): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (776-784): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (790-798): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (804-812): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (818-826): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (832-840): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (846-854): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (860-868): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (874-882): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (888-896): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (902-910): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (916-924): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (930-938): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (944-952): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (958-966): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (972-980): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (986-994): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1000-1008): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1014-1022): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1028-1036): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1042-1050): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1056-1064): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1070-1078): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1084-1092): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1098-1106): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1112-1120): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1126-1134): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1140-1148): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1154-1162): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1168-1176): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1182-1190): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1196-1204): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1210-1218): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1224-1232): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1238-1246): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1252-1260): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1266-1274): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1280-1288): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1294-1302): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1308-1316): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1322-1330): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1336-1344): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1350-1358): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1364-1372): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1378-1386): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1392-1400): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1406-1414): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1420-1428): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1434-1442): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1448-1456): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1462-1470): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1476-1484): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1490-1498): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1504-1512): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1518-1526): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1532-1540): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1546-1554): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1560-1568): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1574-1582): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1588-1596): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1602-1610): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1616-1624): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1630-1638): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1644-1652): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1658-1666): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1672-1680): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1686-1694): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1700-1708): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1714-1722): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1728-1736): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1742-1750): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1756-1764): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1770-1778): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1784-1792): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1798-1806): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1812-1820): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1826-1834): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1840-1848): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1854-1862): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1868-1876): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1882-1890): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1896-1904): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1910-1918): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1924-1932): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1938-1946): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1952-1960): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1966-1974): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1980-1988): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (1994-2002): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2008-2016): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2022-2030): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2036-2044): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2050-2058): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2064-2072): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2078-2086): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2092-2100): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2106-2114): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2120-2128): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2134-2142): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2148-2156): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2162-2170): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2176-2184): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2190-2198): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2204-2212): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2218-2226): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2232-2240): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2246-2254): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2260-2268): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2274-2282): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2288-2296): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2302-2310): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2316-2324): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2330-2338): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2344-2352): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2358-2366): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2372-2380): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2386-2394): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2400-2408): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2414-2422): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2428-2436): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2442-2450): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2456-2464): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2470-2478): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2484-2492): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2498-2506): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2512-2520): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2526-2534): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2540-2548): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2554-2562): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2568-2576): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2582-2590): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2596-2604): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2610-2618): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2624-2632): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2638-2646): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2652-2660): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2666-2674): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2680-2688): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2694-2702): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2708-2716): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2722-2730): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2736-2744): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2750-2758): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2764-2772): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2778-2786): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2792-2800): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2806-2814): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2820-2828): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2834-2842): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2848-2856): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2862-2870): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2876-2884): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2890-2898): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2904-2912): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2918-2926): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2932-2940): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2946-2954): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2960-2968): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2974-2982): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (2988-2996): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3002-3010): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3016-3024): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3030-3038): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3044-3052): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3058-3066): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3072-3080): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3086-3094): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3100-3108): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3114-3122): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3128-3136): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3142-3150): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3156-3164): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3170-3178): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3184-3192): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3198-3206): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3212-3220): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3226-3234): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3240-3248): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3254-3262): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3268-3276): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3282-3290): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3296-3304): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3310-3318): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3324-3332): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3338-3346): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3352-3360): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3366-3374): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3380-3388): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3394-3402): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3408-3416): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3422-3430): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3436-3444): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3450-3458): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3464-3472): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3478-3486): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3492-3500): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3506-3514): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3520-3528): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3534-3542): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3548-3556): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3562-3570): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3576-3584): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3590-3598): "continue" has to be in a "for" or "while" loop.
-// SyntaxError: (3604-3612): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (41-49): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (55-63): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (69-77): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (83-91): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (97-105): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (111-119): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (125-133): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (139-147): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (153-161): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (167-175): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (181-189): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (195-203): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (209-217): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (223-231): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (237-245): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (251-259): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (265-273): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (279-287): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (293-301): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (307-315): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (321-329): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (335-343): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (349-357): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (363-371): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (377-385): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (391-399): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (405-413): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (419-427): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (433-441): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (447-455): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (461-469): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (475-483): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (489-497): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (503-511): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (517-525): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (531-539): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (545-553): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (559-567): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (573-581): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (587-595): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (601-609): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (615-623): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (629-637): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (643-651): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (657-665): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (671-679): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (685-693): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (699-707): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (713-721): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (727-735): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (741-749): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (755-763): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (769-777): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (783-791): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (797-805): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (811-819): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (825-833): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (839-847): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (853-861): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (867-875): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (881-889): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (895-903): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (909-917): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (923-931): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (937-945): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (951-959): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (965-973): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (979-987): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (993-1001): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1007-1015): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1021-1029): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1035-1043): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1049-1057): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1063-1071): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1077-1085): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1091-1099): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1105-1113): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1119-1127): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1133-1141): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1147-1155): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1161-1169): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1175-1183): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1189-1197): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1203-1211): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1217-1225): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1231-1239): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1245-1253): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1259-1267): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1273-1281): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1287-1295): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1301-1309): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1315-1323): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1329-1337): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1343-1351): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1357-1365): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1371-1379): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1385-1393): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1399-1407): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1413-1421): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1427-1435): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1441-1449): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1455-1463): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1469-1477): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1483-1491): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1497-1505): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1511-1519): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1525-1533): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1539-1547): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1553-1561): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1567-1575): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1581-1589): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1595-1603): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1609-1617): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1623-1631): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1637-1645): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1651-1659): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1665-1673): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1679-1687): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1693-1701): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1707-1715): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1721-1729): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1735-1743): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1749-1757): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1763-1771): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1777-1785): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1791-1799): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1805-1813): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1819-1827): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1833-1841): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1847-1855): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1861-1869): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1875-1883): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1889-1897): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1903-1911): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1917-1925): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1931-1939): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1945-1953): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1959-1967): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1973-1981): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (1987-1995): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2001-2009): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2015-2023): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2029-2037): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2043-2051): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2057-2065): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2071-2079): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2085-2093): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2099-2107): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2113-2121): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2127-2135): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2141-2149): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2155-2163): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2169-2177): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2183-2191): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2197-2205): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2211-2219): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2225-2233): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2239-2247): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2253-2261): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2267-2275): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2281-2289): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2295-2303): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2309-2317): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2323-2331): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2337-2345): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2351-2359): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2365-2373): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2379-2387): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2393-2401): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2407-2415): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2421-2429): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2435-2443): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2449-2457): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2463-2471): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2477-2485): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2491-2499): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2505-2513): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2519-2527): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2533-2541): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2547-2555): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2561-2569): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2575-2583): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2589-2597): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2603-2611): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2617-2625): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2631-2639): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2645-2653): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2659-2667): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2673-2681): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2687-2695): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2701-2709): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2715-2723): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2729-2737): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2743-2751): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2757-2765): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2771-2779): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2785-2793): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2799-2807): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2813-2821): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2827-2835): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2841-2849): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2855-2863): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2869-2877): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2883-2891): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2897-2905): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2911-2919): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2925-2933): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2939-2947): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2953-2961): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2967-2975): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2981-2989): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (2995-3003): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3009-3017): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3023-3031): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3037-3045): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3051-3059): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3065-3073): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3079-3087): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3093-3101): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3107-3115): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3121-3129): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3135-3143): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3149-3157): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3163-3171): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3177-3185): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3191-3199): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3205-3213): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3219-3227): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3233-3241): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3247-3255): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3261-3269): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3275-3283): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3289-3297): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3303-3311): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3317-3325): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3331-3339): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3345-3353): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3359-3367): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3373-3381): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3387-3395): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3401-3409): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3415-3423): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3429-3437): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3443-3451): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3457-3465): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3471-3479): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3485-3493): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3499-3507): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3513-3521): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3527-3535): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3541-3549): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3555-3563): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3569-3577): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3583-3591): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3597-3605): "continue" has to be in a "for" or "while" loop.
+// SyntaxError: (3611-3619): "continue" has to be in a "for" or "while" loop.
// Warning: There are more than 256 errors. Aborting.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/029_create_abstract_contract.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/029_create_abstract_contract.sol
index 3a2bf56d..455f4189 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/029_create_abstract_contract.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/029_create_abstract_contract.sol
@@ -1,7 +1,7 @@
-contract base { function foo(); }
+contract base { function foo() public; }
contract derived {
base b;
function foo() public { b = new base(); }
}
// ----
-// TypeError: (97-105): Trying to create an instance of an abstract contract.
+// TypeError: (104-112): Trying to create an instance of an abstract contract.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/030_redeclare_implemented_abstract_function_as_abstract.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/030_redeclare_implemented_abstract_function_as_abstract.sol
index 05bc4bc7..55bdea89 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/030_redeclare_implemented_abstract_function_as_abstract.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/030_redeclare_implemented_abstract_function_as_abstract.sol
@@ -1,5 +1,5 @@
-contract base { function foo(); }
+contract base { function foo() public; }
contract derived is base { function foo() public {} }
-contract wrong is derived { function foo(); }
+contract wrong is derived { function foo() public; }
// ----
-// TypeError: (116-131): Redeclaring an already implemented function as abstract
+// TypeError: (123-145): Redeclaring an already implemented function as abstract
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/039_functions_with_identical_structs_in_interface.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/039_functions_with_identical_structs_in_interface.sol
index 0be0bb2b..851ccf89 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/039_functions_with_identical_structs_in_interface.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/039_functions_with_identical_structs_in_interface.sol
@@ -3,9 +3,9 @@ pragma experimental ABIEncoderV2;
contract C {
struct S1 { int i; }
struct S2 { int i; }
- function f(S1) pure {}
- function f(S2) pure {}
+ function f(S1) public pure {}
+ function f(S2) public pure {}
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
-// TypeError: (129-151): Function overload clash during conversion to external types for arguments.
+// TypeError: (136-165): Function overload clash during conversion to external types for arguments.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol
index f9937fb9..775258c2 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol
@@ -2,7 +2,7 @@ pragma experimental ABIEncoderV2;
contract C {
struct S { function() internal a; }
- function f(S) {}
+ function f(S) public {}
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol
index d9c3bfc4..4a95430f 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol
@@ -2,7 +2,7 @@ pragma experimental ABIEncoderV2;
contract C {
struct S { mapping(uint => uint) a; }
- function f(S) {}
+ function f(S) public {}
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol
index f223cf53..09cd38b5 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol
@@ -3,7 +3,7 @@ pragma experimental ABIEncoderV2;
contract C {
struct T { mapping(uint => uint) a; }
struct S { T[][2] b; }
- function f(S) {}
+ function f(S) public {}
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/138_similar_name_suggestions_expected.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/138_similar_name_suggestions_expected.sol
index 8f11f003..ef6e933a 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/138_similar_name_suggestions_expected.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/138_similar_name_suggestions_expected.sol
@@ -1,6 +1,6 @@
contract c {
- function func() {}
+ function func() public {}
function g() public { fun(); }
}
// ----
-// DeclarationError: (62-65): Undeclared identifier. Did you mean "func"?
+// DeclarationError: (69-72): Undeclared identifier. Did you mean "func"?
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/165_assigning_state_to_const_variable.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/165_assigning_state_to_const_variable.sol
index f3986580..0de15dfb 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/165_assigning_state_to_const_variable.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/165_assigning_state_to_const_variable.sol
@@ -2,4 +2,4 @@ contract C {
address constant x = msg.sender;
}
// ----
-// Warning: (38-48): Initial value for constant variable has to be compile-time constant. This will fail to compile with the next breaking version change.
+// TypeError: (38-48): Initial value for constant variable has to be compile-time constant.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/206_storage_location_local_variables.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/206_storage_location_local_variables.sol
index 5199e5d7..868d7bc8 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/206_storage_location_local_variables.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/206_storage_location_local_variables.sol
@@ -1,11 +1,9 @@
contract C {
- function f() public {
- uint[] storage x;
+ uint[] m_x;
+ function f() public view {
+ uint[] storage x = m_x;
uint[] memory y;
- uint[] memory z;
- x;y;z;
+ x;y;
}
}
// ----
-// Warning: (47-63): Uninitialized storage pointer.
-// Warning: (17-135): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol
index 80467491..edae7549 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/211_uninitialized_mapping_array_variable.sol
@@ -5,4 +5,4 @@ contract C {
}
}
// ----
-// Warning: (52-85): Uninitialized storage pointer.
+// DeclarationError: (52-85): Uninitialized storage pointer.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/212_uninitialized_mapping_array_variable_050.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/212_uninitialized_mapping_array_variable_050.sol
deleted file mode 100644
index f2028690..00000000
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/212_uninitialized_mapping_array_variable_050.sol
+++ /dev/null
@@ -1,9 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- function f() pure public {
- mapping(uint => uint)[] storage x;
- x;
- }
-}
-// ----
-// DeclarationError: (82-115): Uninitialized storage pointer.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/233_non_initialized_references.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/233_non_initialized_references.sol
index 9d8d4834..a0b6f71e 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/233_non_initialized_references.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/233_non_initialized_references.sol
@@ -8,4 +8,4 @@ contract C {
}
}
// ----
-// Warning: (84-95): Uninitialized storage pointer.
+// DeclarationError: (84-95): Uninitialized storage pointer.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/234_non_initialized_references_050.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/234_non_initialized_references_050.sol
deleted file mode 100644
index c221b73c..00000000
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/234_non_initialized_references_050.sol
+++ /dev/null
@@ -1,11 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- struct s {
- uint a;
- }
- function f() public {
- s storage x;
- }
-}
-// ----
-// DeclarationError: (114-125): Uninitialized storage pointer.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/244_tuples.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/244_tuples.sol
index 3112f67a..95e8cf37 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/244_tuples.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/244_tuples.sol
@@ -1,13 +1,13 @@
contract C {
function f() public {
uint a = (1);
- (uint b,) = (uint8(1),);
+ (uint b,) = uint8(1);
(uint c, uint d) = (uint32(1), 2 + a);
(uint e,) = (uint64(1), 2, b);
a;b;c;d;e;
}
}
// ----
-// Warning: (69-92): Different number of components on the left hand side (2) than on the right hand side (1).
-// Warning: (149-178): Different number of components on the left hand side (2) than on the right hand side (3).
-// Warning: (17-204): Function state mutability can be restricted to pure
+// Warning: (69-89): Different number of components on the left hand side (2) than on the right hand side (1).
+// Warning: (146-175): Different number of components on the left hand side (2) than on the right hand side (3).
+// Warning: (17-201): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/308_rational_unary_plus_operation.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/308_rational_unary_plus_operation.sol
index eb7c6ea9..f635a214 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/308_rational_unary_plus_operation.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/308_rational_unary_plus_operation.sol
@@ -6,4 +6,4 @@ contract test {
}
}
// ----
-// Warning: (70-75): Use of unary + is deprecated.
+// SyntaxError: (70-75): Use of unary + is disallowed.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/310_rational_unary_plus_operation_v050.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/310_rational_unary_plus_operation_v050.sol
deleted file mode 100644
index 140655af..00000000
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/310_rational_unary_plus_operation_v050.sol
+++ /dev/null
@@ -1,10 +0,0 @@
-pragma experimental "v0.5.0";
-contract test {
- function f() pure public {
- ufixed16x2 a = +3.25;
- fixed16x2 b = -3.25;
- a; b;
- }
-}
-// ----
-// SyntaxError: (100-105): Use of unary + is deprecated.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/311_rational_unary_plus_assignment_v050.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/311_rational_unary_plus_assignment_v050.sol
deleted file mode 100644
index 7e5c0feb..00000000
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/311_rational_unary_plus_assignment_v050.sol
+++ /dev/null
@@ -1,9 +0,0 @@
-pragma experimental "v0.5.0";
-contract test {
- function f(uint x) pure public {
- uint y = +x;
- y;
- }
-}
-// ----
-// SyntaxError: (100-102): Use of unary + is deprecated.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/363_non_payable_constructor.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/363_non_payable_constructor.sol
index 4cd1fcae..27381904 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/363_non_payable_constructor.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/363_non_payable_constructor.sol
@@ -1,5 +1,5 @@
contract C {
- constructor() { }
+ constructor() public { }
}
contract D {
function f() public returns (uint) {
@@ -8,4 +8,4 @@ contract D {
}
}
// ----
-// TypeError: (99-112): Member "value" not found or not visible after argument-dependent lookup in function () returns (contract C) - did you forget the "payable" modifier?
+// TypeError: (106-119): Member "value" not found or not visible after argument-dependent lookup in function () returns (contract C) - did you forget the "payable" modifier?
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/412_early_exit_on_fatal_errors.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/412_early_exit_on_fatal_errors.sol
index 979f0eb6..8e5d81e2 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/412_early_exit_on_fatal_errors.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/412_early_exit_on_fatal_errors.sol
@@ -4,7 +4,7 @@ contract C {
ftring a;
}
S public s;
- function s() s {
+ function s() public s {
}
}
// ----
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/484_function_types_selector_1.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/484_function_types_selector_1.sol
index 76c3fcd6..9ed2b70f 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/484_function_types_selector_1.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/484_function_types_selector_1.sol
@@ -1,7 +1,7 @@
contract C {
- function f() view returns (bytes4) {
+ function f() public view returns (bytes4) {
return f.selector;
}
}
// ----
-// TypeError: (69-79): Member "selector" not found or not visible after argument-dependent lookup in function () view returns (bytes4)
+// TypeError: (76-86): Member "selector" not found or not visible after argument-dependent lookup in function () view returns (bytes4)
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/485_function_types_selector_2.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/485_function_types_selector_2.sol
index b21a5d3d..0876a4f7 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/485_function_types_selector_2.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/485_function_types_selector_2.sol
@@ -1,9 +1,9 @@
contract C {
function g() pure internal {
}
- function f() view returns (bytes4) {
+ function f() public view returns (bytes4) {
return g.selector;
}
}
// ----
-// TypeError: (108-118): Member "selector" not found or not visible after argument-dependent lookup in function () pure
+// TypeError: (115-125): Member "selector" not found or not visible after argument-dependent lookup in function () pure
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/486_function_types_selector_3.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/486_function_types_selector_3.sol
index 3567c44f..d0ccc724 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/486_function_types_selector_3.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/486_function_types_selector_3.sol
@@ -1,8 +1,8 @@
contract C {
- function f() view returns (bytes4) {
+ function f() public view returns (bytes4) {
function () g;
return g.selector;
}
}
// ----
-// TypeError: (92-102): Member "selector" not found or not visible after argument-dependent lookup in function ()
+// TypeError: (99-109): Member "selector" not found or not visible after argument-dependent lookup in function ()
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/498_msg_gas_deprecated.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/498_msg_gas_deprecated.sol
index d917b840..5efecd22 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/498_msg_gas_deprecated.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/498_msg_gas_deprecated.sol
@@ -2,4 +2,4 @@ contract C {
function f() public view returns (uint256 val) { return msg.gas; }
}
// ----
-// Warning: (73-80): "msg.gas" has been deprecated in favor of "gasleft()"
+// TypeError: (73-80): "msg.gas" has been deprecated in favor of "gasleft()"
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/499_msg_gas_deprecated_v050.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/499_msg_gas_deprecated_v050.sol
deleted file mode 100644
index 31fd40da..00000000
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/499_msg_gas_deprecated_v050.sol
+++ /dev/null
@@ -1,6 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- function f() public returns (uint256 val) { return msg.gas; }
-}
-// ----
-// TypeError: (98-105): "msg.gas" has been deprecated in favor of "gasleft()"
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/569_block_blockhash_deprecated.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/569_block_blockhash_deprecated.sol
index f2e5a2c4..b8f5d6a8 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/569_block_blockhash_deprecated.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/569_block_blockhash_deprecated.sol
@@ -4,4 +4,4 @@ contract C {
}
}
// ----
-// Warning: (77-92): "block.blockhash()" has been deprecated in favor of "blockhash()"
+// TypeError: (77-92): "block.blockhash()" has been deprecated in favor of "blockhash()"
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/570_block_blockhash_deprecated_v050.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/570_block_blockhash_deprecated_v050.sol
deleted file mode 100644
index b954eab7..00000000
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/570_block_blockhash_deprecated_v050.sol
+++ /dev/null
@@ -1,6 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- function f() public returns (bytes32) { return block.blockhash(3); }
-}
-// ----
-// TypeError: (94-109): "block.blockhash()" has been deprecated in favor of "blockhash()"
diff --git a/test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol b/test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol
index 626e865e..2b35ffda 100644
--- a/test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol
+++ b/test/libsolidity/syntaxTests/parsing/arrays_in_expressions.sol
@@ -1,8 +1,8 @@
contract c {
- function f() { c[10] a = 7; uint8[10 * 2] x; }
+ function f() public { 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'?
+// Warning: (39-46): Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning.
+// Warning: (52-67): Variable is declared as a storage pointer. Use an explicit "storage" keyword to silence this warning.
+// TypeError: (39-50): Type int_const 7 is not implicitly convertible to expected type contract c[10] storage pointer.
+// DeclarationError: (52-67): Uninitialized storage pointer. Did you mean '<type> memory x'?
diff --git a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol
index e311dd96..38de7b1c 100644
--- a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol
+++ b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol
@@ -1,11 +1,9 @@
contract Foo {
- function f() public {
- uint[] storage x;
+ uint[] m_x;
+ function f() public view {
+ uint[] storage x = m_x;
uint[] memory y;
+ x; y;
}
}
// ----
-// Warning: (49-65): Uninitialized storage pointer.
-// Warning: (49-65): Unused local variable.
-// Warning: (75-90): Unused local variable.
-// Warning: (19-97): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/tuples.sol b/test/libsolidity/syntaxTests/parsing/tuples.sol
index 8266c94f..ca2f9d6b 100644
--- a/test/libsolidity/syntaxTests/parsing/tuples.sol
+++ b/test/libsolidity/syntaxTests/parsing/tuples.sol
@@ -1,16 +1,16 @@
contract C {
function f() public {
uint a = (1);
- (uint b,) = (1,);
+ (uint b,) = 1;
(uint c, uint d) = (1, 2 + a);
(uint e,) = (1, 2, b);
(a) = 3;
}
}
// ----
-// Warning: (54-70): Different number of components on the left hand side (2) than on the right hand side (1).
-// Warning: (107-128): Different number of components on the left hand side (2) than on the right hand side (3).
-// Warning: (75-81): Unused local variable.
-// Warning: (83-89): Unused local variable.
-// Warning: (108-114): Unused local variable.
-// Warning: (14-143): Function state mutability can be restricted to pure
+// Warning: (54-67): Different number of components on the left hand side (2) than on the right hand side (1).
+// Warning: (104-125): Different number of components on the left hand side (2) than on the right hand side (3).
+// Warning: (72-78): Unused local variable.
+// Warning: (80-86): Unused local variable.
+// Warning: (105-111): Unused local variable.
+// Warning: (14-140): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/parsing/two_exact_functions.sol b/test/libsolidity/syntaxTests/parsing/two_exact_functions.sol
index 0b3dda56..957740d0 100644
--- a/test/libsolidity/syntaxTests/parsing/two_exact_functions.sol
+++ b/test/libsolidity/syntaxTests/parsing/two_exact_functions.sol
@@ -2,8 +2,8 @@
// 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; }
+ function fun(uint a) public returns(uint r) { return a; }
+ function fun(uint a) public returns(uint r) { return a; }
}
// ----
-// DeclarationError: (189-239): Function with same name and arguments defined twice.
+// DeclarationError: (189-246): Function with same name and arguments defined twice.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/309_rational_unary_plus_assignment.sol b/test/libsolidity/syntaxTests/parsing/unary_plus_expression.sol
index a5bdd6c8..5646c43b 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/309_rational_unary_plus_assignment.sol
+++ b/test/libsolidity/syntaxTests/parsing/unary_plus_expression.sol
@@ -5,4 +5,4 @@ contract test {
}
}
// ----
-// Warning: (70-72): Use of unary + is deprecated.
+// SyntaxError: (70-72): Use of unary + is disallowed.
diff --git a/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_internal_functions.sol b/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_internal_functions.sol
index b94a4391..a30e428a 100644
--- a/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_internal_functions.sol
+++ b/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_internal_functions.sol
@@ -1,6 +1,6 @@
contract C {
function f() public pure {
- bytes32 h = keccak256(abi.encodePacked(keccak256, f, this.f.gas, block.blockhash));
+ bytes32 h = keccak256(abi.encodePacked(keccak256, f, this.f.gas, blockhash));
h;
}
}
@@ -8,4 +8,4 @@ contract C {
// TypeError: (91-100): This type cannot be encoded.
// TypeError: (102-103): This type cannot be encoded.
// TypeError: (105-115): This type cannot be encoded.
-// TypeError: (117-132): This type cannot be encoded.
+// TypeError: (117-126): This type cannot be encoded.
diff --git a/test/libsolidity/syntaxTests/tupleAssignments/err_fill_assignment.sol b/test/libsolidity/syntaxTests/tupleAssignments/err_fill_assignment.sol
new file mode 100644
index 00000000..32b381bb
--- /dev/null
+++ b/test/libsolidity/syntaxTests/tupleAssignments/err_fill_assignment.sol
@@ -0,0 +1,11 @@
+contract C {
+ function f() public pure returns (uint, uint, bytes32) {
+ uint a;
+ bytes32 b;
+ (a,) = f();
+ (,b) = f();
+ }
+}
+// ----
+// TypeError: (103-106): Type tuple(uint256,uint256,bytes32) is not implicitly convertible to expected type tuple(uint256,).
+// TypeError: (117-120): Type tuple(uint256,uint256,bytes32) is not implicitly convertible to expected type tuple(,bytes32).
diff --git a/test/libsolidity/syntaxTests/tupleAssignments/warn_multiple_storage_storage_copies_fill_left.sol b/test/libsolidity/syntaxTests/tupleAssignments/err_multiple_storage_storage_copies_fill_left.sol
index b2979804..902d8b98 100644
--- a/test/libsolidity/syntaxTests/tupleAssignments/warn_multiple_storage_storage_copies_fill_left.sol
+++ b/test/libsolidity/syntaxTests/tupleAssignments/err_multiple_storage_storage_copies_fill_left.sol
@@ -6,5 +6,5 @@ contract C {
}
}
// ----
+// TypeError: (89-101): Type tuple(int_const 1,int_const 2,struct C.S storage ref,struct C.S storage ref) is not implicitly convertible to expected type tuple(,struct C.S storage ref,struct C.S storage ref).
// Warning: (79-101): This assignment performs two copies to storage. Since storage copies do not first copy to a temporary location, one of them might be overwritten before the second is executed and thus may have unexpected effects. It is safer to perform the copies separately or assign to storage pointers first.
-// Warning: (79-101): Different number of components on the left hand side (3) than on the right hand side (4).
diff --git a/test/libsolidity/syntaxTests/tupleAssignments/warn_multiple_storage_storage_copies_fill_right.sol b/test/libsolidity/syntaxTests/tupleAssignments/err_multiple_storage_storage_copies_fill_right.sol
index aa35d7d4..51556aab 100644
--- a/test/libsolidity/syntaxTests/tupleAssignments/warn_multiple_storage_storage_copies_fill_right.sol
+++ b/test/libsolidity/syntaxTests/tupleAssignments/err_multiple_storage_storage_copies_fill_right.sol
@@ -6,5 +6,5 @@ contract C {
}
}
// ----
+// TypeError: (90-102): Type tuple(struct C.S storage ref,struct C.S storage ref,int_const 1,int_const 2) is not implicitly convertible to expected type tuple(struct C.S storage ref,struct C.S storage ref,).
// Warning: (79-102): This assignment performs two copies to storage. Since storage copies do not first copy to a temporary location, one of them might be overwritten before the second is executed and thus may have unexpected effects. It is safer to perform the copies separately or assign to storage pointers first.
-// Warning: (79-102): Different number of components on the left hand side (3) than on the right hand side (4).
diff --git a/test/libsolidity/syntaxTests/tupleAssignments/error_fill.sol b/test/libsolidity/syntaxTests/tupleAssignments/error_fill.sol
index 5b7f870b..ae722391 100644
--- a/test/libsolidity/syntaxTests/tupleAssignments/error_fill.sol
+++ b/test/libsolidity/syntaxTests/tupleAssignments/error_fill.sol
@@ -8,5 +8,5 @@ contract C {
}
}
// ----
-// TypeError: (126-136): Different number of components on the left hand side (2) than on the right hand side (3).
-// TypeError: (140-150): Different number of components on the left hand side (2) than on the right hand side (3).
+// TypeError: (133-136): Type tuple(uint256,uint256,bytes32) is not implicitly convertible to expected type tuple(uint256,).
+// TypeError: (147-150): Type tuple(uint256,uint256,bytes32) is not implicitly convertible to expected type tuple(,bytes32).
diff --git a/test/libsolidity/syntaxTests/tupleAssignments/nowarn_explicit_singleton_token_expression.sol b/test/libsolidity/syntaxTests/tupleAssignments/nowarn_explicit_singleton_token_expression.sol
deleted file mode 100644
index 3262781b..00000000
--- a/test/libsolidity/syntaxTests/tupleAssignments/nowarn_explicit_singleton_token_expression.sol
+++ /dev/null
@@ -1,8 +0,0 @@
-contract C {
- function f() public pure {
- uint a;
- (a,) = (uint(1),);
- }
-}
-// ----
-// Warning: (53-70): Different number of components on the left hand side (2) than on the right hand side (1).
diff --git a/test/libsolidity/syntaxTests/tupleAssignments/warn_fill_assignment.sol b/test/libsolidity/syntaxTests/tupleAssignments/warn_fill_assignment.sol
deleted file mode 100644
index a079a509..00000000
--- a/test/libsolidity/syntaxTests/tupleAssignments/warn_fill_assignment.sol
+++ /dev/null
@@ -1,11 +0,0 @@
-contract C {
- function f() public pure returns (uint, uint, bytes32) {
- uint a;
- bytes32 b;
- (a,) = f();
- (,b) = f();
- }
-}
-// ----
-// Warning: (96-106): Different number of components on the left hand side (2) than on the right hand side (3).
-// Warning: (110-120): Different number of components on the left hand side (2) than on the right hand side (3).
diff --git a/test/libsolidity/syntaxTests/types/empty_tuple_function.sol b/test/libsolidity/syntaxTests/types/empty_tuple_function.sol
index 05b54442..ff31d440 100644
--- a/test/libsolidity/syntaxTests/types/empty_tuple_function.sol
+++ b/test/libsolidity/syntaxTests/types/empty_tuple_function.sol
@@ -8,5 +8,5 @@ contract C {
}
}
// ----
-// Warning: (162-165): Tuple component cannot be empty.
-// Warning: (181-184): Tuple component cannot be empty.
+// TypeError: (162-165): Tuple component cannot be empty.
+// TypeError: (181-184): Tuple component cannot be empty.
diff --git a/test/libsolidity/syntaxTests/types/empty_tuple_function_050.sol b/test/libsolidity/syntaxTests/types/empty_tuple_function_050.sol
deleted file mode 100644
index c4b9e03f..00000000
--- a/test/libsolidity/syntaxTests/types/empty_tuple_function_050.sol
+++ /dev/null
@@ -1,11 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- function f() private pure {}
- function a() public pure {
- bool x = true;
- bool y = true;
- (x) ? (f(), y = false) : (f(), y = false);
- }
-}
-// ----
-// TypeError: (168-171): Tuple component cannot be empty.
diff --git a/test/libsolidity/syntaxTests/types/empty_tuple_lvalue.sol b/test/libsolidity/syntaxTests/types/empty_tuple_lvalue.sol
index cba30c1b..3d252f0b 100644
--- a/test/libsolidity/syntaxTests/types/empty_tuple_lvalue.sol
+++ b/test/libsolidity/syntaxTests/types/empty_tuple_lvalue.sol
@@ -8,6 +8,6 @@ contract C {
}
}
// ----
-// Warning: (146-149): Tuple component cannot be empty.
-// Warning: (151-154): Tuple component cannot be empty.
+// TypeError: (146-149): Tuple component cannot be empty.
+// TypeError: (151-154): Tuple component cannot be empty.
// TypeError: (145-155): Type tuple(tuple(),tuple()) is not implicitly convertible to expected type tuple(uint256,uint256).
diff --git a/test/libsolidity/syntaxTests/types/empty_tuple_lvalue_050.sol b/test/libsolidity/syntaxTests/types/empty_tuple_lvalue_050.sol
deleted file mode 100644
index b0691778..00000000
--- a/test/libsolidity/syntaxTests/types/empty_tuple_lvalue_050.sol
+++ /dev/null
@@ -1,11 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- function f() private pure {}
- function a() public {
- uint x;
- uint y;
- (x, y) = (f(), f());
- }
-}
-// ----
-// TypeError: (152-155): Tuple component cannot be empty.
diff --git a/test/libsolidity/syntaxTests/types/no_singleton_tuple.sol b/test/libsolidity/syntaxTests/types/no_singleton_tuple.sol
new file mode 100644
index 00000000..62a58f83
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/no_singleton_tuple.sol
@@ -0,0 +1,8 @@
+contract C {
+ function f() public pure {
+ uint a;
+ (a,) = (uint(1),);
+ }
+}
+// ----
+// TypeError: (60-70): Tuple component cannot be empty.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump.sol b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_no_restrict_warning.sol
index 418be561..418be561 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_no_restrict_warning.sol
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol
new file mode 100644
index 00000000..c1729db7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/assembly_jump_view_fail.sol
@@ -0,0 +1,8 @@
+contract C {
+ function k() public view {
+ assembly { jump(2) }
+ }
+}
+// ----
+// Warning: (63-70): Jump instructions and labels are low-level EVM features that can lead to incorrect stack access. Because of that they are discouraged. Please consider using "switch", "if" or "for" statements instead.
+// TypeError: (63-70): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol
new file mode 100644
index 00000000..0b834022
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_restrict_warning.sol
@@ -0,0 +1,21 @@
+contract C {
+ function f() view public {
+ bytes32 x = keccak256("abc");
+ bytes32 y = sha256("abc");
+ address z = ecrecover(bytes32(1), uint8(2), bytes32(3), bytes32(4));
+ require(true);
+ assert(true);
+ x; y; z;
+ }
+ function g() public {
+ bytes32 x = keccak256("abc");
+ bytes32 y = sha256("abc");
+ address z = ecrecover(bytes32(1), uint8(2), bytes32(3), bytes32(4));
+ require(true);
+ assert(true);
+ x; y; z;
+ }
+}
+// ----
+// Warning: (17-261): Function state mutability can be restricted to pure
+// Warning: (266-505): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol
new file mode 100644
index 00000000..9b00fd6d
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol
@@ -0,0 +1,23 @@
+contract C {
+ function f() view public {
+ address(this).transfer(1);
+ }
+ function g() view public {
+ require(address(this).send(2));
+ }
+ function h() view public {
+ selfdestruct(address(this));
+ }
+ function i() view public {
+ require(address(this).delegatecall(""));
+ }
+ function j() view public {
+ require(address(this).call(""));
+ }
+}
+// ----
+// TypeError: (52-77): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (132-153): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (201-228): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (283-313): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (369-391): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol
index 22855c34..e21037bd 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/call_internal_functions_fail.sol
@@ -1,7 +1,10 @@
contract C {
+ uint x;
function f() pure public { g(); }
- function g() view public {}
+ function g() view public { x; }
+ function h() view public { i(); }
+ function i() public { x = 2; }
}
// ----
-// TypeError: (44-47): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
-// Warning: (55-82): Function state mutability can be restricted to pure
+// TypeError: (56-59): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
+// TypeError: (130-133): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol b/test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol
new file mode 100644
index 00000000..a4b4a353
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/constant_restrict_warning.sol
@@ -0,0 +1,12 @@
+contract C {
+ uint constant x = 2;
+ function f() view public returns (uint) {
+ return x;
+ }
+ function g() public returns (uint) {
+ return x;
+ }
+}
+// ----
+// Warning: (42-107): Function state mutability can be restricted to pure
+// Warning: (112-172): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/creation.sol b/test/libsolidity/syntaxTests/viewPureChecker/creation_no_restrict_warning.sol
index d80edd1b..d80edd1b 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/creation.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/creation_no_restrict_warning.sol
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol
new file mode 100644
index 00000000..08e45ea1
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/creation_view_fail.sol
@@ -0,0 +1,6 @@
+contract D {}
+contract C {
+ function f() public view { new D(); }
+}
+// ----
+// TypeError: (58-65): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol
new file mode 100644
index 00000000..d00f65c9
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/function_types_fail.sol
@@ -0,0 +1,18 @@
+contract C {
+ function f() pure public {
+ function () external nonpayFun;
+ nonpayFun();
+ }
+ function g() pure public {
+ function () external view viewFun;
+ viewFun();
+ }
+ function h() view public {
+ function () external nonpayFun;
+ nonpayFun();
+ }
+}
+// ----
+// TypeError: (92-103): Function declared as pure, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (193-202): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
+// TypeError: (289-300): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol
new file mode 100644
index 00000000..0ff1ac24
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/local_storage_variables_fail.sol
@@ -0,0 +1,15 @@
+contract C {
+ struct S { uint a; }
+ S s;
+ function f() pure public {
+ S storage x = s;
+ x;
+ }
+ function g() view public {
+ S storage x = s;
+ x.a = 1;
+ }
+}
+// ----
+// TypeError: (100-101): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
+// TypeError: (184-187): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol
new file mode 100644
index 00000000..513850f7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/modifiers_fail.sol
@@ -0,0 +1,12 @@
+contract D {
+ uint x;
+ modifier viewm(uint) { uint a = x; _; a; }
+ modifier nonpayablem(uint) { x = 2; _; }
+}
+contract C is D {
+ function f() viewm(0) pure public {}
+ function g() nonpayablem(0) view public {}
+}
+// ----
+// TypeError: (154-162): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
+// TypeError: (195-209): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol
new file mode 100644
index 00000000..61702495
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/overriding_fail.sol
@@ -0,0 +1,16 @@
+contract D {
+ uint x;
+ function f() public view { x; }
+ function g() public pure {}
+}
+contract C1 is D {
+ function f() public {}
+ function g() public view {}
+}
+contract C2 is D {
+ function g() public {}
+}
+// ----
+// TypeError: (118-140): Overriding function changes state mutability from "view" to "nonpayable".
+// TypeError: (145-172): Overriding function changes state mutability from "pure" to "view".
+// TypeError: (198-220): Overriding function changes state mutability from "pure" to "nonpayable".
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/overriding.sol b/test/libsolidity/syntaxTests/viewPureChecker/overriding_no_restrict_warning.sol
index c82c7908..c82c7908 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/overriding.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/overriding_no_restrict_warning.sol
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol
new file mode 100644
index 00000000..785656b9
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/read_storage_pure_fail.sol
@@ -0,0 +1,8 @@
+contract C {
+ uint x;
+ function f() public pure returns (uint) {
+ return x;
+ }
+}
+// ----
+// TypeError: (86-87): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol
new file mode 100644
index 00000000..e04d0825
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_fail.sol
@@ -0,0 +1,13 @@
+contract C {
+ struct S { uint x; }
+ S s;
+ function f() pure internal returns (S storage) {
+ return s;
+ }
+ function g() pure public {
+ f().x;
+ }
+}
+// ----
+// TypeError: (115-116): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
+// TypeError: (163-168): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/returning_structs.sol b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_no_restrict_warning.sol
index 9b4eb466..9b4eb466 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/returning_structs.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/returning_structs_no_restrict_warning.sol
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/selector.sol b/test/libsolidity/syntaxTests/viewPureChecker/selector.sol
index 2ad4518d..c4e30075 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/selector.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/selector.sol
@@ -5,4 +5,8 @@ contract C {
function g() pure public returns (bytes4) {
return this.f.selector ^ this.x.selector;
}
+ function h() view public returns (bytes4) {
+ x;
+ return this.f.selector ^ this.x.selector;
+ }
}
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail.sol
index 2a8bba31..3fed4d29 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail.sol
@@ -3,4 +3,4 @@ contract C {
function f() view public { x = 2; }
}
// ----
-// Warning: (56-57): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (56-57): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail_v050.sol b/test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail_v050.sol
deleted file mode 100644
index b85078ed..00000000
--- a/test/libsolidity/syntaxTests/viewPureChecker/write_storage_fail_v050.sol
+++ /dev/null
@@ -1,7 +0,0 @@
-pragma experimental "v0.5.0";
-contract C {
- uint x;
- function f() view public { x = 2; }
-}
-// ----
-// TypeError: (86-87): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.