diff options
134 files changed, 617 insertions, 739 deletions
diff --git a/Changelog.md b/Changelog.md index 5a60cbfc..b36bec2e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -8,12 +8,14 @@ How to update your code: Breaking Changes: * ABI Encoder: Properly pad data from calldata (``msg.data`` and external function parameters). Use ``abi.encodePacked`` for unpadded encoding. * Code Generator: Signed right shift uses proper arithmetic shift, i.e. rounding towards negative infinity. Warning: this may silently change the semantics of existing code! + * Code Generator: Revert at runtime if calldata is too short or points out of bounds. This is done inside the ``ABI decoder`` and therefore also applies to ``abi.decode()``. * Commandline interface: Remove obsolete ``--formal`` option. * Commandline interface: Rename the ``--julia`` option to ``--yul``. * Commandline interface: Require ``-`` if standard input is used as source. * General: ``continue`` in a ``do...while`` loop jumps to the condition (it used to jump to the loop body). Warning: this may silently change the semantics of existing code. * General: Disallow declaring empty structs. * General: Disallow raw ``callcode`` (was already deprecated in 0.4.12). It is still possible to use it via inline assembly. + * General: Disallow ``var`` keyword. * General: Disallow ``sha3`` and ``suicide`` aliases. * General: Disallow the ``years`` unit denomination (was already deprecated in 0.4.24) * General: Introduce ``emit`` as a keyword instead of parsing it as identifier. @@ -25,6 +27,7 @@ Breaking Changes: * General: C99-style scoping rules are enforced now. 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 arithmetic operations for boolean variables. * Type Checker: Disallow conversions between ``bytesX`` and ``uintY`` of different size. * 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. @@ -39,6 +42,7 @@ Language Features: Compiler Features: * 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. diff --git a/docs/_static/theme_overrides.css b/docs/_static/theme_overrides.css deleted file mode 100644 index d750f4f1..00000000 --- a/docs/_static/theme_overrides.css +++ /dev/null @@ -1,13 +0,0 @@ -/* override table width restrictions */ -@media screen and (min-width: 767px) { - - .wy-table-responsive table td { - /* !important prevents the common CSS stylesheets from overriding - this as on sphinx_rtd_theme they are loaded after this stylesheet */ - white-space: normal !important; - } - - .wy-table-responsive { - overflow: visible !important; - } -} diff --git a/docs/abi-spec.rst b/docs/abi-spec.rst index e4f8ed4f..366ca951 100644 --- a/docs/abi-spec.rst +++ b/docs/abi-spec.rst @@ -437,10 +437,10 @@ For example, :: - pragma solidity ^0.4.0; + pragma solidity >0.4.24; contract Test { - function Test() public { b = 0x12345678901234567890123456789012; } + constructor() public { b = 0x12345678901234567890123456789012; } event Event(uint indexed a, bytes32 b); event Event2(uint indexed a, bytes32 b); function foo(uint a) public { emit Event(a, b); } @@ -582,4 +582,4 @@ Note that constants will be packed using the minimum number of bytes required to This means that, for example, ``abi.encodePacked(0) == abi.encodePacked(uint8(0)) == hex"00"`` and ``abi.encodePacked(0x12345678) == abi.encodePacked(uint32(0x12345678)) == hex"12345678"``. -If padding is needed, explicit type conversions can be used: ``abi.encodePacked(uint16(0x12)) == hex"0012"``.
\ No newline at end of file +If padding is needed, explicit type conversions can be used: ``abi.encodePacked(uint16(0x12)) == hex"0012"``. diff --git a/docs/common-patterns.rst b/docs/common-patterns.rst index 739e136f..7c38b0e7 100644 --- a/docs/common-patterns.rst +++ b/docs/common-patterns.rst @@ -28,7 +28,7 @@ become the new richest. :: - pragma solidity ^0.4.11; + pragma solidity >0.4.24; contract WithdrawalContract { address public richest; @@ -36,7 +36,7 @@ become the new richest. mapping (address => uint) pendingWithdrawals; - function WithdrawalContract() public payable { + constructor() public payable { richest = msg.sender; mostSent = msg.value; } @@ -65,13 +65,13 @@ This is as opposed to the more intuitive sending pattern: :: - pragma solidity ^0.4.11; + pragma solidity >0.4.24; contract SendContract { address public richest; uint public mostSent; - function SendContract() public payable { + constructor() public payable { richest = msg.sender; mostSent = msg.value; } diff --git a/docs/conf.py b/docs/conf.py index fcf46c11..55f4f1a8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -27,6 +27,8 @@ def setup(sphinx): from pygments_lexer_solidity import SolidityLexer sphinx.add_lexer('Solidity', SolidityLexer()) + sphinx.add_stylesheet('css/custom.css') + # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. @@ -141,16 +143,7 @@ html_theme = 'sphinx_rtd_theme' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# A dictionary of values to pass into the template engine’s context for -# all pages. Single values can also be put in -# this dictionary using the -A command-line option of sphinx-build. -html_context = { - 'css_files': [ - '_static/theme_overrides.css', # override wide tables in sphinx_rtd_theme - ], - } +html_static_path = [] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied diff --git a/docs/contracts.rst b/docs/contracts.rst index 845fd973..41240a9c 100644 --- a/docs/contracts.rst +++ b/docs/contracts.rst @@ -301,10 +301,10 @@ inheritable properties of contracts and may be overridden by derived contracts. :: - pragma solidity ^0.4.22; + pragma solidity >0.4.24; contract owned { - function owned() public { owner = msg.sender; } + constructor() public { owner = msg.sender; } address owner; // This contract only defines a modifier but does not use @@ -346,7 +346,7 @@ inheritable properties of contracts and may be overridden by derived contracts. mapping (address => bool) registeredAddresses; uint price; - function Register(uint initialPrice) public { price = initialPrice; } + constructor(uint initialPrice) public { price = initialPrice; } // It is important to also provide the // `payable` keyword here, otherwise the function will @@ -473,7 +473,7 @@ The following statements are considered modifying the state: } .. note:: - ``constant`` on functions is an alias to ``view``, but this is deprecated and will be dropped in version 0.5.0. + ``constant`` on functions used to be an alias to ``view``, but this was dropped in version 0.5.0. .. note:: Getter methods are marked ``view``. @@ -990,7 +990,7 @@ default constructor: ``contructor() public {}``. :: - pragma solidity ^0.4.22; + pragma solidity >0.4.24; contract A { uint public a; @@ -1006,24 +1006,8 @@ default constructor: ``contructor() public {}``. A constructor set as ``internal`` causes the contract to be marked as :ref:`abstract <abstract-contract>`. -.. note :: - Prior to version 0.4.22, constructors were defined as functions with the same name as the contract. This syntax is now deprecated. - -:: - - pragma solidity ^0.4.11; - - contract A { - uint public a; - - function A(uint _a) internal { - a = _a; - } - } - - contract B is A(1) { - function B() public {} - } +.. warning :: + Prior to version 0.4.22, constructors were defined as functions with the same name as the contract. This syntax was deprecated and is not allowed anymore in version 0.5.0. .. index:: ! base;constructor @@ -1344,9 +1328,9 @@ custom types without the overhead of external function calls: using BigInt for BigInt.bigint; function f() public pure { - var x = BigInt.fromUint(7); - var y = BigInt.fromUint(uint(-1)); - var z = x.add(y); + BigInt.bigint memory x = BigInt.fromUint(7); + BigInt.bigint memory y = BigInt.fromUint(uint(-1)); + BigInt.bigint memory z = x.add(y); } } @@ -1402,7 +1386,7 @@ Using For ********* The directive ``using A for B;`` can be used to attach library -functions (from the library ``A``) to any type (``B``). +functions (from the library ``A``) to any type (``B``). These functions will receive the object they are called on as their first parameter (like the ``self`` variable in Python). diff --git a/docs/control-structures.rst b/docs/control-structures.rst index cc1f7ca5..8ced0fbc 100644 --- a/docs/control-structures.rst +++ b/docs/control-structures.rst @@ -225,11 +225,11 @@ creation-dependencies are not possible. :: - pragma solidity ^0.4.0; + pragma solidity >0.4.24; contract D { uint x; - function D(uint a) public payable { + constructor(uint a) public payable { x = a; } } diff --git a/docs/docs-css/custom.css b/docs/docs-css/custom.css new file mode 100644 index 00000000..970148ed --- /dev/null +++ b/docs/docs-css/custom.css @@ -0,0 +1,14 @@ +pre { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; +} + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: pre-wrap; +} +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: pre-wrap; +} diff --git a/docs/frequently-asked-questions.rst b/docs/frequently-asked-questions.rst index ca5a1aee..0d6fa033 100644 --- a/docs/frequently-asked-questions.rst +++ b/docs/frequently-asked-questions.rst @@ -136,14 +136,9 @@ See `struct_and_for_loop_tester.sol <https://github.com/fivedogit/solidity-baby- How do for loops work? ====================== -Very similar to JavaScript. There is one point to watch out for, though: +Very similar to JavaScript. Such as the following example: -If you use ``for (var i = 0; i < a.length; i ++) { a[i] = i; }``, then -the type of ``i`` will be inferred only from ``0``, whose type is ``uint8``. -This means that if ``a`` has more than ``255`` elements, your loop will -not terminate because ``i`` can only hold values up to ``255``. - -Better use ``for (uint i = 0; i < a.length...`` +``for (uint i = 0; i < a.length; i ++) { a[i] = i; }`` See `struct_and_for_loop_tester.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/65_struct_and_for_loop_tester.sol>`_. @@ -426,10 +421,10 @@ In the case of a ``contract A`` calling a new instance of ``contract B``, parent You will need to make sure that you have both contracts aware of each other's presence and that ``contract B`` has a ``payable`` constructor. In this example:: - pragma solidity ^0.4.0; + pragma solidity >0.4.24; contract B { - function B() public payable {} + constructor() public payable {} } contract A { diff --git a/docs/grammar.txt b/docs/grammar.txt index 5d977827..7b29fc62 100644 --- a/docs/grammar.txt +++ b/docs/grammar.txt @@ -58,7 +58,7 @@ ArrayTypeName = TypeName '[' Expression? ']' FunctionTypeName = 'function' FunctionTypeParameterList ( 'internal' | 'external' | StateMutability )* ( 'returns' FunctionTypeParameterList )? StorageLocation = 'memory' | 'storage' | 'calldata' -StateMutability = 'pure' | 'constant' | 'view' | 'payable' +StateMutability = 'pure' | 'view' | 'payable' Block = '{' Statement* '}' Statement = IfStatement | WhileStatement | ForStatement | Block | InlineAssemblyStatement | @@ -78,7 +78,7 @@ Break = 'break' Return = 'return' Expression? Throw = 'throw' EmitStatement = 'emit' FunctionCall -VariableDefinition = ('var' IdentifierList | VariableDeclaration | '(' VariableDeclaration? (',' VariableDeclaration? )* ')' ) ( '=' Expression )? +VariableDefinition = (VariableDeclaration | '(' VariableDeclaration? (',' VariableDeclaration? )* ')' ) ( '=' Expression )? IdentifierList = '(' ( Identifier? ',' )* Identifier? ')' // Precedence by order (see github.com/ethereum/solidity/pull/732) @@ -140,8 +140,7 @@ TupleExpression = '(' ( Expression? ( ',' Expression? )* )? ')' ElementaryTypeNameExpression = ElementaryTypeName -ElementaryTypeName = 'address' | 'bool' | 'string' | 'var' - | Int | Uint | Byte | Fixed | Ufixed +ElementaryTypeName = 'address' | 'bool' | 'string' | Int | Uint | Byte | Fixed | Ufixed Int = 'int' | 'int8' | 'int16' | 'int24' | 'int32' | 'int40' | 'int48' | 'int56' | 'int64' | 'int72' | 'int80' | 'int88' | 'int96' | 'int104' | 'int112' | 'int120' | 'int128' | 'int136' | 'int144' | 'int152' | 'int160' | 'int168' | 'int176' | 'int184' | 'int192' | 'int200' | 'int208' | 'int216' | 'int224' | 'int232' | 'int240' | 'int248' | 'int256' diff --git a/docs/introduction-to-smart-contracts.rst b/docs/introduction-to-smart-contracts.rst index 71f9bd8e..e1b61d8b 100644 --- a/docs/introduction-to-smart-contracts.rst +++ b/docs/introduction-to-smart-contracts.rst @@ -80,7 +80,7 @@ registering with username and password — all you need is an Ethereum keypair. :: - pragma solidity ^0.4.21; + pragma solidity >0.4.24; contract Coin { // The keyword "public" makes those variables @@ -94,7 +94,7 @@ registering with username and password — all you need is an Ethereum keypair. // This is the constructor whose code is // run only when the contract is created. - function Coin() public { + constructor() public { minter = msg.sender; } diff --git a/docs/miscellaneous.rst b/docs/miscellaneous.rst index 30ece7e1..c19c8c59 100644 --- a/docs/miscellaneous.rst +++ b/docs/miscellaneous.rst @@ -157,7 +157,7 @@ These steps are applied to each basic block and the newly generated code is used :: - var x = 7; + uint x = 7; data[7] = 9; if (data[x] != x + 2) return 2; @@ -401,7 +401,6 @@ Modifiers - ``view`` for functions: Disallows modification of state - this is not enforced yet. - ``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. -- ``constant`` for functions: Same as ``view``. - ``anonymous`` for events: Does not store event signature as topic. - ``indexed`` for event parameters: Stores the parameter as topic. diff --git a/docs/security-considerations.rst b/docs/security-considerations.rst index ec67773d..afdecb98 100644 --- a/docs/security-considerations.rst +++ b/docs/security-considerations.rst @@ -103,7 +103,7 @@ outlined further below: mapping(address => uint) shares; /// Withdraw your share. function withdraw() public { - var share = shares[msg.sender]; + uint share = shares[msg.sender]; shares[msg.sender] = 0; msg.sender.transfer(share); } @@ -180,13 +180,13 @@ Never use tx.origin for authorization. Let's say you have a wallet contract like :: - pragma solidity ^0.4.11; + pragma solidity >0.4.24; // THIS CONTRACT CONTAINS A BUG - DO NOT USE contract TxUserWallet { address owner; - function TxUserWallet() public { + constructor() public { owner = msg.sender; } @@ -200,7 +200,7 @@ Now someone tricks you into sending ether to the address of this attack wallet: :: - pragma solidity ^0.4.11; + pragma solidity >0.4.24; interface TxUserWallet { function transferTo(address dest, uint amount) public; @@ -209,7 +209,7 @@ Now someone tricks you into sending ether to the address of this attack wallet: contract TxAttackWallet { address owner; - function TxAttackWallet() public { + constructor() public { owner = msg.sender; } @@ -224,7 +224,6 @@ If your wallet had checked ``msg.sender`` for authorization, it would get the ad Minor Details ============= -- In ``for (var i = 0; i < arrayName.length; i++) { ... }``, the type of ``i`` will be ``uint8``, because this is the smallest type that is required to hold the value ``0``. If the array has more than 255 elements, the loop will not terminate. - Types that do not occupy the full 32 bytes might contain "dirty higher order bits". This is especially important if you access ``msg.data`` - it poses a malleability risk: You can craft transactions that call a function ``f(uint8 x)`` with a raw byte argument diff --git a/docs/types.rst b/docs/types.rst index 528807d9..217a2273 100644 --- a/docs/types.rst +++ b/docs/types.rst @@ -7,10 +7,8 @@ Types ***** Solidity is a statically typed language, which means that the type of each -variable (state and local) needs to be specified (or at least known - -see :ref:`type-deduction` below) at -compile-time. Solidity provides several elementary types which can be combined -to form complex types. +variable (state and local) needs to be specified. +Solidity provides several elementary types which can be combined to form complex types. In addition, types can interact with each other in expressions containing operators. For a quick reference of the various operators, see :ref:`order`. @@ -378,7 +376,7 @@ be passed via and returned from external function calls. Function types are notated as follows:: - function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)] + function (<parameter types>) {internal|external} [pure|view|payable] [returns (<return types>)] In contrast to the parameter types, the return types cannot be empty - if the function type should not return anything, the whole ``returns (<return types>)`` @@ -548,7 +546,7 @@ memory-stored reference type do not create a copy. // the data location of memoryArray is memory function f(uint[] memoryArray) public { x = memoryArray; // works, copies the whole array to storage - var y = x; // works, assigns a pointer, data location of y is storage + uint[] storage y = x; // works, assigns a pointer, data location of y is storage y[7]; // fine, returns the 8th element y.length = 2; // fine, modifies x through y delete x; // fine, clears the array, also modifies y @@ -986,26 +984,3 @@ converted to a matching size. This makes alignment and padding explicit:: bytes32(uint256(x)); // pad on the left bytes32(bytes2(x)); // pad on the right -.. index:: ! type;deduction, ! var - -.. _type-deduction: - -Type Deduction -============== - -For convenience, it is not always necessary to explicitly specify the type of a -variable, the compiler automatically infers it from the type of the first -expression that is assigned to the variable:: - - uint24 x = 0x123; - var y = x; - -Here, the type of ``y`` will be ``uint24``. Using ``var`` is not possible for function -parameters or return parameters. - -.. warning:: - The type is only deduced from the first assignment, so - the loop in the following snippet is infinite, as ``i`` will have the type - ``uint8`` and the highest value of this type is smaller than ``2000``. - ``for (var i = 0; i < 2000; i++) { ... }`` - diff --git a/libevmasm/KnownState.cpp b/libevmasm/KnownState.cpp index e2f10f22..7c593fc9 100644 --- a/libevmasm/KnownState.cpp +++ b/libevmasm/KnownState.cpp @@ -121,28 +121,33 @@ KnownState::StoreOperation KnownState::feedItem(AssemblyItem const& _item, bool vector<Id> arguments(info.args); for (int i = 0; i < info.args; ++i) arguments[i] = stackElement(m_stackHeight - i, _item.location()); - - if (_item.instruction() == Instruction::SSTORE) + switch (_item.instruction()) + { + case Instruction::SSTORE: op = storeInStorage(arguments[0], arguments[1], _item.location()); - else if (_item.instruction() == Instruction::SLOAD) + break; + case Instruction::SLOAD: setStackElement( m_stackHeight + _item.deposit(), loadFromStorage(arguments[0], _item.location()) ); - else if (_item.instruction() == Instruction::MSTORE) + break; + case Instruction::MSTORE: op = storeInMemory(arguments[0], arguments[1], _item.location()); - else if (_item.instruction() == Instruction::MLOAD) + break; + case Instruction::MLOAD: setStackElement( m_stackHeight + _item.deposit(), loadFromMemory(arguments[0], _item.location()) ); - else if (_item.instruction() == Instruction::KECCAK256) + break; + case Instruction::KECCAK256: setStackElement( m_stackHeight + _item.deposit(), applyKeccak256(arguments.at(0), arguments.at(1), _item.location()) ); - else - { + break; + default: bool invMem = SemanticInformation::invalidatesMemory(_item.instruction()); bool invStor = SemanticInformation::invalidatesStorage(_item.instruction()); // We could be a bit more fine-grained here (CALL only invalidates part of diff --git a/libsolidity/analysis/StaticAnalyzer.cpp b/libsolidity/analysis/StaticAnalyzer.cpp index dad4cc7f..c7440565 100644 --- a/libsolidity/analysis/StaticAnalyzer.cpp +++ b/libsolidity/analysis/StaticAnalyzer.cpp @@ -58,8 +58,8 @@ bool StaticAnalyzer::visit(FunctionDefinition const& _function) _function.location(), "No visibility specified. Defaulting to \"" + Declaration::visibilityToString(_function.visibility()) + - "\". " + - (isInterface ? "In interfaces it defaults to external." : "") + "\"." + + (isInterface ? " In interfaces it defaults to external." : "") ); if (_function.isImplemented()) m_currentFunction = &_function; diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index c408b393..cd0dc2a4 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -262,14 +262,9 @@ bool SyntaxChecker::visit(FunctionTypeName const& _node) bool SyntaxChecker::visit(VariableDeclaration const& _declaration) { - bool const v050 = m_sourceUnit->annotation().experimentalFeatures.count(ExperimentalFeature::V050); - if (!_declaration.typeName()) { - if (v050) - m_errorReporter.syntaxError(_declaration.location(), "Use of the \"var\" keyword is deprecated."); - else - m_errorReporter.warning(_declaration.location(), "Use of the \"var\" keyword is deprecated."); + m_errorReporter.syntaxError(_declaration.location(), "Use of the \"var\" keyword is disallowed."); } return true; } diff --git a/libsolidity/codegen/CompilerUtils.cpp b/libsolidity/codegen/CompilerUtils.cpp index 3446be55..a5e96335 100644 --- a/libsolidity/codegen/CompilerUtils.cpp +++ b/libsolidity/codegen/CompilerUtils.cpp @@ -181,7 +181,7 @@ void CompilerUtils::storeInMemoryDynamic(Type const& _type, bool _padToWordBound } } -void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMemory, bool _revertOnOutOfBounds) +void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMemory) { /// Stack: <source_offset> <length> if (m_context.experimentalFeatureActive(ExperimentalFeature::ABIEncoderV2)) @@ -194,14 +194,10 @@ void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMem } //@todo this does not yet support nested dynamic arrays - - if (_revertOnOutOfBounds) - { - size_t encodedSize = 0; - for (auto const& t: _typeParameters) - encodedSize += t->decodingType()->calldataEncodedSize(true); - m_context.appendInlineAssembly("{ if lt(len, " + to_string(encodedSize) + ") { revert(0, 0) } }", {"len"}); - } + size_t encodedSize = 0; + for (auto const& t: _typeParameters) + encodedSize += t->decodingType()->calldataEncodedSize(true); + m_context.appendInlineAssembly("{ if lt(len, " + to_string(encodedSize) + ") { revert(0, 0) } }", {"len"}); m_context << Instruction::DUP2 << Instruction::ADD; m_context << Instruction::SWAP1; @@ -231,26 +227,21 @@ void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMem { // compute data pointer m_context << Instruction::DUP1 << Instruction::MLOAD; - if (_revertOnOutOfBounds) - { - // Check that the data pointer is valid and that length times - // item size is still inside the range. - Whiskers templ(R"({ - if gt(ptr, 0x100000000) { revert(0, 0) } - ptr := add(ptr, base_offset) - let array_data_start := add(ptr, 0x20) - if gt(array_data_start, input_end) { revert(0, 0) } - let array_length := mload(ptr) - if or( - gt(array_length, 0x100000000), - gt(add(array_data_start, mul(array_length, <item_size>)), input_end) - ) { revert(0, 0) } - })"); - templ("item_size", to_string(arrayType.isByteArray() ? 1 : arrayType.baseType()->calldataEncodedSize(true))); - m_context.appendInlineAssembly(templ.render(), {"input_end", "base_offset", "offset", "ptr"}); - } - else - m_context << Instruction::DUP3 << Instruction::ADD; + // Check that the data pointer is valid and that length times + // item size is still inside the range. + Whiskers templ(R"({ + if gt(ptr, 0x100000000) { revert(0, 0) } + ptr := add(ptr, base_offset) + let array_data_start := add(ptr, 0x20) + if gt(array_data_start, input_end) { revert(0, 0) } + let array_length := mload(ptr) + if or( + gt(array_length, 0x100000000), + gt(add(array_data_start, mul(array_length, <item_size>)), input_end) + ) { revert(0, 0) } + })"); + templ("item_size", to_string(arrayType.isByteArray() ? 1 : arrayType.baseType()->calldataEncodedSize(true))); + m_context.appendInlineAssembly(templ.render(), {"input_end", "base_offset", "offset", "ptr"}); // stack: v1 v2 ... v(k-1) input_end base_offset current_offset v(k) moveIntoStack(3); m_context << u256(0x20) << Instruction::ADD; @@ -273,30 +264,25 @@ void CompilerUtils::abiDecode(TypePointers const& _typeParameters, bool _fromMem loadFromMemoryDynamic(IntegerType(256), !_fromMemory); m_context << Instruction::SWAP1; // stack: input_end base_offset next_pointer data_offset - if (_revertOnOutOfBounds) - m_context.appendInlineAssembly("{ if gt(data_offset, 0x100000000) { revert(0, 0) } }", {"data_offset"}); + m_context.appendInlineAssembly("{ if gt(data_offset, 0x100000000) { revert(0, 0) } }", {"data_offset"}); m_context << Instruction::DUP3 << Instruction::ADD; // stack: input_end base_offset next_pointer array_head_ptr - if (_revertOnOutOfBounds) - m_context.appendInlineAssembly( - "{ if gt(add(array_head_ptr, 0x20), input_end) { revert(0, 0) } }", - {"input_end", "base_offset", "next_ptr", "array_head_ptr"} - ); + m_context.appendInlineAssembly( + "{ if gt(add(array_head_ptr, 0x20), input_end) { revert(0, 0) } }", + {"input_end", "base_offset", "next_ptr", "array_head_ptr"} + ); // retrieve length loadFromMemoryDynamic(IntegerType(256), !_fromMemory, true); // stack: input_end base_offset next_pointer array_length data_pointer m_context << Instruction::SWAP2; // stack: input_end base_offset data_pointer array_length next_pointer - if (_revertOnOutOfBounds) - { - unsigned itemSize = arrayType.isByteArray() ? 1 : arrayType.baseType()->calldataEncodedSize(true); - m_context.appendInlineAssembly(R"({ - if or( - gt(array_length, 0x100000000), - gt(add(data_ptr, mul(array_length, )" + to_string(itemSize) + R"()), input_end) - ) { revert(0, 0) } - })", {"input_end", "base_offset", "data_ptr", "array_length", "next_ptr"}); - } + unsigned itemSize = arrayType.isByteArray() ? 1 : arrayType.baseType()->calldataEncodedSize(true); + m_context.appendInlineAssembly(R"({ + if or( + gt(array_length, 0x100000000), + gt(add(data_ptr, mul(array_length, )" + to_string(itemSize) + R"()), input_end) + ) { revert(0, 0) } + })", {"input_end", "base_offset", "data_ptr", "array_length", "next_ptr"}); } else { diff --git a/libsolidity/codegen/CompilerUtils.h b/libsolidity/codegen/CompilerUtils.h index 8e3a8a5d..0ff3ad7c 100644 --- a/libsolidity/codegen/CompilerUtils.h +++ b/libsolidity/codegen/CompilerUtils.h @@ -102,7 +102,7 @@ public: /// area. Also has a hard cap of 0x100000000 for any given length/offset field. /// Stack pre: <source_offset> <length> /// Stack post: <value0> <value1> ... <valuen> - void abiDecode(TypePointers const& _typeParameters, bool _fromMemory = false, bool _revertOnOutOfBounds = false); + void abiDecode(TypePointers const& _typeParameters, bool _fromMemory = false); /// Copies values (of types @a _givenTypes) given on the stack to a location in memory given /// at the stack top, encoding them according to the ABI as the given types @a _targetTypes. diff --git a/libsolidity/codegen/ExpressionCompiler.cpp b/libsolidity/codegen/ExpressionCompiler.cpp index ecbd0243..2e548e32 100644 --- a/libsolidity/codegen/ExpressionCompiler.cpp +++ b/libsolidity/codegen/ExpressionCompiler.cpp @@ -2049,7 +2049,7 @@ void ExpressionCompiler::appendExternalFunctionCall( mstore(0x40, newMem) })", {"start", "size"}); - utils().abiDecode(returnTypes, true, true); + utils().abiDecode(returnTypes, true); } } diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index e9810fe3..e2bd6fb4 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -322,11 +322,18 @@ StateMutability Parser::parseStateMutability(Token::Value _token) StateMutability stateMutability(StateMutability::NonPayable); if (_token == Token::Payable) stateMutability = StateMutability::Payable; - // FIXME: constant should be removed at the next breaking release - else if (_token == Token::View || _token == Token::Constant) + else if (_token == Token::View) stateMutability = StateMutability::View; else if (_token == Token::Pure) stateMutability = StateMutability::Pure; + else if (_token == Token::Constant) + { + stateMutability = StateMutability::View; + parserError( + "The state mutability modifier \"constant\" was removed in version 0.5.0. " + "Use \"view\" or \"pure\" instead." + ); + } else solAssert(false, "Invalid state mutability specifier."); m_scanner->next(); diff --git a/scripts/tests.sh b/scripts/tests.sh index d63c1fe4..7fb260bc 100755 --- a/scripts/tests.sh +++ b/scripts/tests.sh @@ -80,13 +80,13 @@ function download_eth() mkdir -p /tmp/test if grep -i trusty /etc/lsb-release >/dev/null 2>&1 then - # built from 5ac09111bd0b6518365fe956e1bdb97a2db82af1 at 2018-04-05 - ETH_BINARY=eth_2018-04-05_trusty - ETH_HASH="1e5e178b005e5b51f9d347df4452875ba9b53cc6" + # built from d661ac4fec0aeffbedcdc195f67f5ded0c798278 at 2018-06-20 + ETH_BINARY=aleth_2018-06-20_trusty + ETH_HASH="54b8a5455e45b295e3a962f353ff8f1580ed106c" else - # built from 5ac09111bd0b6518365fe956e1bdb97a2db82af1 at 2018-04-05 - ETH_BINARY=eth_2018-04-05_artful - ETH_HASH="eb2d0df022753bb2b442ba73e565a9babf6828d6" + # built from d661ac4fec0aeffbedcdc195f67f5ded0c798278 at 2018-06-20 + ETH_BINARY=aleth_2018-06-20_artful + ETH_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" @@ -109,9 +109,18 @@ function run_eth() 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" + exit 1 + fi +} + if [ "$IPC_ENABLED" = true ]; then download_eth + check_eth ETH_PID=$(run_eth /tmp/test) fi diff --git a/test/ExecutionFramework.cpp b/test/ExecutionFramework.cpp index a24f78fb..00f5e697 100644 --- a/test/ExecutionFramework.cpp +++ b/test/ExecutionFramework.cpp @@ -142,6 +142,11 @@ void ExecutionFramework::sendMessage(bytes const& _data, bool _isCreation, u256 entry.data = fromHex(log.data, WhenError::Throw); m_logs.push_back(entry); } + + if (!receipt.status.empty()) + m_transactionSuccessful = (receipt.status == "1"); + else + m_transactionSuccessful = (m_gas != m_gasUsed); } void ExecutionFramework::sendEther(Address const& _to, u256 const& _value) diff --git a/test/ExecutionFramework.h b/test/ExecutionFramework.h index 4525cbf9..cdbec81d 100644 --- a/test/ExecutionFramework.h +++ b/test/ExecutionFramework.h @@ -72,6 +72,7 @@ public: ) { compileAndRunWithoutCheck(_sourceCode, _value, _contractName, _arguments, _libraryAddresses); + BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(!m_output.empty()); return m_output; } @@ -234,6 +235,7 @@ protected: unsigned m_optimizeRuns = 200; bool m_optimize = false; bool m_showMessages = false; + bool m_transactionSuccessful = true; Address m_sender; Address m_contractAddress; u256 m_blockNumber; diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp index 160b0047..b9b19b2f 100644 --- a/test/RPCSession.cpp +++ b/test/RPCSession.cpp @@ -163,6 +163,11 @@ RPCSession::TransactionReceipt RPCSession::eth_getTransactionReceipt(string cons receipt.gasUsed = result["gasUsed"].asString(); receipt.contractAddress = result["contractAddress"].asString(); receipt.blockNumber = result["blockNumber"].asString(); + if (m_receiptHasStatusField) + { + BOOST_REQUIRE(!result["status"].isNull()); + receipt.status = result["status"].asString(); + } for (auto const& log: result["logs"]) { LogEntry entry; @@ -225,7 +230,10 @@ void RPCSession::test_setChainParams(vector<string> const& _accounts) if (test::Options::get().evmVersion() >= solidity::EVMVersion::spuriousDragon()) forks += "\"EIP158ForkBlock\": \"0x00\",\n"; if (test::Options::get().evmVersion() >= solidity::EVMVersion::byzantium()) + { forks += "\"byzantiumForkBlock\": \"0x00\",\n"; + m_receiptHasStatusField = true; + } if (test::Options::get().evmVersion() >= solidity::EVMVersion::constantinople()) forks += "\"constantinopleForkBlock\": \"0x00\",\n"; static string const c_configString = R"( @@ -247,8 +255,8 @@ void RPCSession::test_setChainParams(vector<string> const& _accounts) "gasLimit": "0x1000000000000", "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "nonce": "0x0000000000000042", - "difficulty": "1" - }, + "difficulty": "131072" + }, "accounts": { "0000000000000000000000000000000000000001": { "wei": "1", "precompiled": { "name": "ecrecover", "linear": { "base": 3000, "word": 0 } } }, "0000000000000000000000000000000000000002": { "wei": "1", "precompiled": { "name": "sha256", "linear": { "base": 60, "word": 12 } } }, diff --git a/test/RPCSession.h b/test/RPCSession.h index 63f1dd21..5af2e26a 100644 --- a/test/RPCSession.h +++ b/test/RPCSession.h @@ -99,6 +99,8 @@ public: std::string contractAddress; std::vector<LogEntry> logEntries; std::string blockNumber; + /// note: pre-byzantium the status field will be empty + std::string status; }; static RPCSession& instance(std::string const& _path); @@ -136,6 +138,7 @@ private: unsigned m_maxMiningTime = 6000000; // 600 seconds unsigned m_sleepTime = 10; // 10 milliseconds unsigned m_successfulMineRuns = 0; + bool m_receiptHasStatusField = false; std::vector<std::string> m_accounts; }; diff --git a/test/compilationTests/MultiSigWallet/Factory.sol b/test/compilationTests/MultiSigWallet/Factory.sol index f7a96cbd..f37d230f 100644 --- a/test/compilationTests/MultiSigWallet/Factory.sol +++ b/test/compilationTests/MultiSigWallet/Factory.sol @@ -10,7 +10,7 @@ contract Factory { /// @return Returns number of instantiations by creator. function getInstantiationCount(address creator) public - constant + view returns (uint) { return instantiations[creator].length; diff --git a/test/compilationTests/MultiSigWallet/MultiSigWallet.sol b/test/compilationTests/MultiSigWallet/MultiSigWallet.sol index e534d09a..6b10f17e 100644 --- a/test/compilationTests/MultiSigWallet/MultiSigWallet.sol +++ b/test/compilationTests/MultiSigWallet/MultiSigWallet.sol @@ -241,7 +241,7 @@ contract MultiSigWallet { /// @return Confirmation status. function isConfirmed(uint transactionId) public - constant + view returns (bool) { uint count = 0; @@ -285,7 +285,7 @@ contract MultiSigWallet { /// @return Number of confirmations. function getConfirmationCount(uint transactionId) public - constant + view returns (uint count) { for (uint i=0; i<owners.length; i++) @@ -299,7 +299,7 @@ contract MultiSigWallet { /// @return Total number of transactions after filters are applied. function getTransactionCount(bool pending, bool executed) public - constant + view returns (uint count) { for (uint i=0; i<transactionCount; i++) @@ -312,7 +312,7 @@ contract MultiSigWallet { /// @return List of owner addresses. function getOwners() public - constant + view returns (address[]) { return owners; @@ -323,7 +323,7 @@ contract MultiSigWallet { /// @return Returns array of owner addresses. function getConfirmations(uint transactionId) public - constant + view returns (address[] _confirmations) { address[] memory confirmationsTemp = new address[](owners.length); @@ -347,7 +347,7 @@ contract MultiSigWallet { /// @return Returns array of transaction IDs. function getTransactionIds(uint from, uint to, bool pending, bool executed) public - constant + view returns (uint[] _transactionIds) { uint[] memory transactionIdsTemp = new uint[](transactionCount); diff --git a/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol b/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol index 0ca9fa54..3a68f662 100644 --- a/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol +++ b/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol @@ -85,7 +85,7 @@ contract MultiSigWalletWithDailyLimit is MultiSigWallet { /// @return Returns amount. function calcMaxWithdraw() public - constant + view returns (uint) { if (now > lastDay + 24 hours) diff --git a/test/compilationTests/MultiSigWallet/TestToken.sol b/test/compilationTests/MultiSigWallet/TestToken.sol index 69727cbd..df195c58 100644 --- a/test/compilationTests/MultiSigWallet/TestToken.sol +++ b/test/compilationTests/MultiSigWallet/TestToken.sol @@ -59,7 +59,7 @@ contract TestToken { } function allowance(address _owner, address _spender) - constant + view public returns (uint256 remaining) { @@ -67,7 +67,7 @@ contract TestToken { } function balanceOf(address _owner) - constant + view public returns (uint256 balance) { diff --git a/test/compilationTests/corion/ico.sol b/test/compilationTests/corion/ico.sol index 54305d41..b6d8e035 100644 --- a/test/compilationTests/corion/ico.sol +++ b/test/compilationTests/corion/ico.sol @@ -81,7 +81,7 @@ contract ico is safeMath { } } - function ICObonus() public constant returns(uint256 bonus) { + function ICObonus() public view returns(uint256 bonus) { /* Query of current bonus @@ -113,7 +113,7 @@ contract ico is safeMath { return true; } - function checkInterest(address addr) public constant returns(uint256 amount) { + function checkInterest(address addr) public view returns(uint256 amount) { /* Query of compound interest @@ -355,7 +355,7 @@ contract ico is safeMath { } } - function getIcoReward(uint256 value) public constant returns (uint256 reward) { + function getIcoReward(uint256 value) public view returns (uint256 reward) { /* Expected token volume at token purchase @@ -368,7 +368,7 @@ contract ico is safeMath { if ( reward < 5e6) { return 0; } } - function isICO() public constant returns (bool success) { + function isICO() public view returns (bool success) { return startBlock <= block.number && block.number <= icoDelay && ( ! aborted ) && ( ! closed ); } diff --git a/test/compilationTests/corion/module.sol b/test/compilationTests/corion/module.sol index 5f13215f..362283ef 100644 --- a/test/compilationTests/corion/module.sol +++ b/test/compilationTests/corion/module.sol @@ -2,7 +2,7 @@ pragma solidity ^0.4.11; contract abstractModuleHandler { function transfer(address from, address to, uint256 value, bool fee) external returns (bool success) {} - function balanceOf(address owner) public constant returns (bool success, uint256 value) {} + function balanceOf(address owner) public view returns (bool success, uint256 value) {} } contract module { @@ -127,7 +127,7 @@ contract module { if ( moduleStatus != status.Connected ) { return false; } return addr == moduleHandlerAddress; } - function isActive() public constant returns (bool success, bool active) { + function isActive() public view returns (bool success, bool active) { /* Check self for ready for functions or not. diff --git a/test/compilationTests/corion/moduleHandler.sol b/test/compilationTests/corion/moduleHandler.sol index e77d9e09..b3d03c2a 100644 --- a/test/compilationTests/corion/moduleHandler.sol +++ b/test/compilationTests/corion/moduleHandler.sol @@ -16,7 +16,7 @@ contract abstractModule { function disconnectModule() external returns (bool success) {} function replaceModule(address addr) external returns (bool success) {} function disableModule(bool forever) external returns (bool success) {} - function isActive() public constant returns (bool success) {} + function isActive() public view returns (bool success) {} function replaceModuleHandler(address newHandler) external returns (bool success) {} function transferEvent(address from, address to, uint256 value) external returns (bool success) {} function newSchellingRoundEvent(uint256 roundID, uint256 reward) external returns (bool success) {} @@ -81,7 +81,7 @@ contract moduleHandler is multiOwner, announcementTypes { } modules[id] = input; } - function getModuleAddressByName(string name) public constant returns( bool success, bool found, address addr ) { + function getModuleAddressByName(string name) public view returns( bool success, bool found, address addr ) { /* Search by name for module. The result is an Ethereum address. @@ -94,7 +94,7 @@ contract moduleHandler is multiOwner, announcementTypes { if ( _success && _found ) { return (true, true, modules[_id].addr); } return (true, false, address(0x00)); } - function getModuleIDByHash(bytes32 hashOfName) public constant returns( bool success, bool found, uint256 id ) { + function getModuleIDByHash(bytes32 hashOfName) public view returns( bool success, bool found, uint256 id ) { /* Search by hash of name in the module array. The result is an index array. @@ -109,7 +109,7 @@ contract moduleHandler is multiOwner, announcementTypes { } return (true, false, 0); } - function getModuleIDByName(string name) public constant returns( bool success, bool found, uint256 id ) { + function getModuleIDByName(string name) public view returns( bool success, bool found, uint256 id ) { /* Search by name for module. The result is an index array. @@ -125,7 +125,7 @@ contract moduleHandler is multiOwner, announcementTypes { } return (true, false, 0); } - function getModuleIDByAddress(address addr) public constant returns( bool success, bool found, uint256 id ) { + function getModuleIDByAddress(address addr) public view returns( bool success, bool found, uint256 id ) { /* Search by ethereum address for module. The result is an index array. @@ -298,7 +298,7 @@ contract moduleHandler is multiOwner, announcementTypes { } return true; } - function balanceOf(address owner) public constant returns (bool success, uint256 value) { + function balanceOf(address owner) public view returns (bool success, uint256 value) { /* Query of token balance. @@ -310,7 +310,7 @@ contract moduleHandler is multiOwner, announcementTypes { require( _success && _found ); return (true, token(modules[_id].addr).balanceOf(owner)); } - function totalSupply() public constant returns (bool success, uint256 value) { + function totalSupply() public view returns (bool success, uint256 value) { /* Query of the whole token amount. @@ -321,7 +321,7 @@ contract moduleHandler is multiOwner, announcementTypes { require( _success && _found ); return (true, token(modules[_id].addr).totalSupply()); } - function isICO() public constant returns (bool success, bool ico) { + function isICO() public view returns (bool success, bool ico) { /* Query of ICO state @@ -332,7 +332,7 @@ contract moduleHandler is multiOwner, announcementTypes { require( _success && _found ); return (true, token(modules[_id].addr).isICO()); } - function getCurrentSchellingRoundID() public constant returns (bool success, uint256 round) { + function getCurrentSchellingRoundID() public view returns (bool success, uint256 round) { /* Query of number of the actual Schelling round. diff --git a/test/compilationTests/corion/multiOwner.sol b/test/compilationTests/corion/multiOwner.sol index 2b8a46b9..78f7109c 100644 --- a/test/compilationTests/corion/multiOwner.sol +++ b/test/compilationTests/corion/multiOwner.sol @@ -38,13 +38,13 @@ contract multiOwner is safeMath { /* Constants */ - function ownersForChange() public constant returns (uint256 owners) { + function ownersForChange() public view returns (uint256 owners) { return ownerCount * 75 / 100; } - function calcDoHash(string job, bytes32 data) public constant returns (bytes32 hash) { + function calcDoHash(string job, bytes32 data) public pure returns (bytes32 hash) { return keccak256(abi.encodePacked(job, data)); } - function validDoHash(bytes32 doHash) public constant returns (bool valid) { + function validDoHash(bytes32 doHash) public view returns (bool valid) { return doDB[doHash].length > 0; } /* diff --git a/test/compilationTests/corion/premium.sol b/test/compilationTests/corion/premium.sol index 5a80ecc6..695dd344 100644 --- a/test/compilationTests/corion/premium.sol +++ b/test/compilationTests/corion/premium.sol @@ -140,7 +140,7 @@ contract premium is module, safeMath { emit Approval(msg.sender, spender, amount); } - function allowance(address owner, address spender) constant returns (uint256 remaining, uint256 nonce) { + function allowance(address owner, address spender) view returns (uint256 remaining, uint256 nonce) { /* Get the quantity of tokens given to be used @@ -319,7 +319,7 @@ contract premium is module, safeMath { return _codeLength > 0; } - function balanceOf(address owner) constant returns (uint256 value) { + function balanceOf(address owner) view returns (uint256 value) { /* Token balance query @@ -329,7 +329,7 @@ contract premium is module, safeMath { return db.balanceOf(owner); } - function totalSupply() constant returns (uint256 value) { + function totalSupply() view returns (uint256 value) { /* Total token quantity query diff --git a/test/compilationTests/corion/provider.sol b/test/compilationTests/corion/provider.sol index 0c1f69e5..16546809 100644 --- a/test/compilationTests/corion/provider.sol +++ b/test/compilationTests/corion/provider.sol @@ -147,7 +147,7 @@ contract provider is module, safeMath, announcementTypes { else { return false; } return true; } - function getUserDetails(address addr, uint256 schellingRound) public constant returns (address ProviderAddress, uint256 ProviderHeight, uint256 ConnectedOn, uint256 value) { + function getUserDetails(address addr, uint256 schellingRound) public view returns (address ProviderAddress, uint256 ProviderHeight, uint256 ConnectedOn, uint256 value) { /* Collecting the datas of the client. @@ -168,7 +168,7 @@ contract provider is module, safeMath, announcementTypes { value = clients[addr].supply[schellingRound]; } } - function rightForInterest(uint256 value, bool priv) internal returns (bool) { + function rightForInterest(uint256 value, bool priv) internal view returns (bool) { /* the share from the token emission. In case is a private provider it has to be checked if it has enough connected capital to be able to accept share from the token emission. @@ -299,7 +299,7 @@ contract provider is module, safeMath, announcementTypes { providers[addr].data[currHeight].currentRate = rate; emit EProviderDetailsChanged(addr, currHeight, website, country, info, rate, admin); } - function getProviderInfo(address addr, uint256 height) public constant returns (string name, string website, string country, string info, uint256 create) { + function getProviderInfo(address addr, uint256 height) public view returns (string name, string website, string country, string info, uint256 create) { /* for the infos of the provider. In case the height is unknown then the system will use the last known height. @@ -321,7 +321,7 @@ contract provider is module, safeMath, announcementTypes { info = providers[addr].data[height].info; create = providers[addr].data[height].create; } - function getProviderDetails(address addr, uint256 height) public constant returns (uint8 rate, bool isForRent, uint256 clientsCount, bool priv, bool getInterest, bool valid) { + function getProviderDetails(address addr, uint256 height) public view returns (uint8 rate, bool isForRent, uint256 clientsCount, bool priv, bool getInterest, bool valid) { /* Asking for the datas of the provider. In case the height is unknown then the system will use the last known height. @@ -345,7 +345,7 @@ contract provider is module, safeMath, announcementTypes { getInterest = rightForInterest(getProviderCurrentSupply(addr), providers[addr].data[height].priv ); valid = providers[addr].data[height].valid; } - function getProviderCurrentSupply(address addr) internal returns (uint256) { + function getProviderCurrentSupply(address addr) internal view returns (uint256) { /* Inner function for polling the current height and the current quantity of the connected capital of the schelling round. @@ -469,7 +469,7 @@ contract provider is module, safeMath, announcementTypes { delete clients[msg.sender].providerConnected; emit EClientLost(msg.sender, provider, currHeight, bal); } - function checkReward(address addr) public constant returns (uint256 reward) { + function checkReward(address addr) public returns (uint256 reward) { /* Polling the share from the token emission for clients and for providers. diff --git a/test/compilationTests/corion/publisher.sol b/test/compilationTests/corion/publisher.sol index 0e8f825f..f7d8fdea 100644 --- a/test/compilationTests/corion/publisher.sol +++ b/test/compilationTests/corion/publisher.sol @@ -70,7 +70,7 @@ contract publisher is announcementTypes, module, safeMath { super.registerModuleHandler(moduleHandler);
}
- function Announcements(uint256 id) public constant returns (uint256 Type, uint256 Start, uint256 End, bool Closed, string Announcement, string Link, bool Opposited, string _str, uint256 _uint, address _addr) {
+ function Announcements(uint256 id) public view returns (uint256 Type, uint256 Start, uint256 End, bool Closed, string Announcement, string Link, bool Opposited, string _str, uint256 _uint, address _addr) {
/*
Announcement data query
@@ -101,7 +101,7 @@ contract publisher is announcementTypes, module, safeMath { _addr = announcements[id]._addr;
}
- function checkOpposited(uint256 weight, bool oppositable) public constant returns (bool success) {
+ function checkOpposited(uint256 weight, bool oppositable) public view returns (bool success) {
/*
Veto check
diff --git a/test/compilationTests/corion/schelling.sol b/test/compilationTests/corion/schelling.sol index f8c36fc5..74f8af9d 100644 --- a/test/compilationTests/corion/schelling.sol +++ b/test/compilationTests/corion/schelling.sol @@ -54,7 +54,7 @@ contract schellingDB is safeMath, schellingVars { Funds */ mapping(address => uint256) private funds; - function getFunds(address _owner) constant returns(bool, uint256) { + function getFunds(address _owner) 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) constant returns(bool, uint256, uint256, uint256, uint256, bool) { + function getRound(uint256 _id) 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() constant returns(bool, uint256) { + function getCurrentRound() view returns(bool, uint256) { return (true, rounds.length-1); } /* Voter */ mapping(address => _voter) private voter; - function getVoter(address _owner) constant returns(bool success, uint256 roundID, + function getVoter(address _owner) 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) constant returns(bool, uint256) { + function getSchellingExpansion(uint256 _id) 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() constant returns(bool, uint256) { + function getCurrentSchellingRound() view returns(bool, uint256) { return (true, currentSchellingRound); } } @@ -183,7 +183,7 @@ contract schelling is module, announcementTypes, schellingVars { voter.rewards ) ); } - function getVoter(address addr) internal returns (_voter) { + function getVoter(address addr) internal view returns (_voter) { (bool a, uint256 b, bytes32 c, schellingVars.voterStatus d, bool e, uint256 f) = db.getVoter(addr); require( a ); return _voter(b, c, d, e, f); @@ -221,7 +221,7 @@ contract schelling is module, announcementTypes, schellingVars { function setCurrentSchellingRound(uint256 id) internal { require( db.setCurrentSchellingRound(id) ); } - function getCurrentSchellingRound() internal returns(uint256) { + function getCurrentSchellingRound() internal view returns(uint256) { (bool a, uint256 b) = db.getCurrentSchellingRound(); require( a ); return b; @@ -229,7 +229,7 @@ contract schelling is module, announcementTypes, schellingVars { function setSchellingExpansion(uint256 id, uint256 amount) internal { require( db.setSchellingExpansion(id, amount) ); } - function getSchellingExpansion(uint256 id) internal returns(uint256) { + function getSchellingExpansion(uint256 id) internal view returns(uint256) { (bool a, uint256 b) = db.getSchellingExpansion(id); require( a ); return b; @@ -417,7 +417,7 @@ contract schelling is module, announcementTypes, schellingVars { setVoter(msg.sender, voter); } - function checkReward() public constant returns (uint256 reward) { + function checkReward() public view returns (uint256 reward) { /* Withdraw of the amount of the prize (it’s only information). @@ -496,7 +496,7 @@ contract schelling is module, announcementTypes, schellingVars { require( moduleHandler(moduleHandlerAddress).transfer(address(this), msg.sender, funds, true) ); } - function getCurrentSchellingRoundID() public constant returns (uint256) { + function getCurrentSchellingRoundID() public view returns (uint256) { /* Number of actual Schelling round. @@ -504,7 +504,7 @@ contract schelling is module, announcementTypes, schellingVars { */ return getCurrentSchellingRound(); } - function getSchellingRound(uint256 id) public constant returns (uint256 expansion) { + function getSchellingRound(uint256 id) public view returns (uint256 expansion) { /* Amount of token emission of the Schelling round. diff --git a/test/compilationTests/corion/token.sol b/test/compilationTests/corion/token.sol index 0709baca..fecbce3d 100644 --- a/test/compilationTests/corion/token.sol +++ b/test/compilationTests/corion/token.sol @@ -155,7 +155,7 @@ contract token is safeMath, module, announcementTypes { emit Approval(msg.sender, spender, amount); } - function allowance(address owner, address spender) constant returns (uint256 remaining, uint256 nonce) { + function allowance(address owner, address spender) view returns (uint256 remaining, uint256 nonce) { /* Get the quantity of tokens given to be used @@ -386,7 +386,7 @@ contract token is safeMath, module, announcementTypes { } } - function getTransactionFee(uint256 value) public constant returns (bool success, uint256 fee) { + function getTransactionFee(uint256 value) public view returns (bool success, uint256 fee) { /* Transaction fee query. @@ -472,7 +472,7 @@ contract token is safeMath, module, announcementTypes { return _codeLength > 0; } - function balanceOf(address owner) constant returns (uint256 value) { + function balanceOf(address owner) view returns (uint256 value) { /* Token balance query @@ -483,7 +483,7 @@ contract token is safeMath, module, announcementTypes { return db.balanceOf(owner); } - function totalSupply() constant returns (uint256 value) { + function totalSupply() view returns (uint256 value) { /* Total token quantity query diff --git a/test/compilationTests/corion/tokenDB.sol b/test/compilationTests/corion/tokenDB.sol index 6de1b6c3..40304a54 100644 --- a/test/compilationTests/corion/tokenDB.sol +++ b/test/compilationTests/corion/tokenDB.sol @@ -61,7 +61,7 @@ contract tokenDB is safeMath, ownedDB { return true;
}
- function getAllowance(address owner, address spender) constant returns(bool success, uint256 remaining, uint256 nonce) {
+ function getAllowance(address owner, address spender) view returns(bool success, uint256 remaining, uint256 nonce) {
/*
Get allowance from the database.
diff --git a/test/compilationTests/gnosis/Events/CategoricalEvent.sol b/test/compilationTests/gnosis/Events/CategoricalEvent.sol index 0f5196e8..4815e315 100644 --- a/test/compilationTests/gnosis/Events/CategoricalEvent.sol +++ b/test/compilationTests/gnosis/Events/CategoricalEvent.sol @@ -45,7 +45,7 @@ contract CategoricalEvent is Event { /// @return Event hash function getEventHash() public - constant + view returns (bytes32) { return keccak256(abi.encodePacked(collateralToken, oracle, outcomeTokens.length)); diff --git a/test/compilationTests/gnosis/Events/Event.sol b/test/compilationTests/gnosis/Events/Event.sol index a6edb778..177f61df 100644 --- a/test/compilationTests/gnosis/Events/Event.sol +++ b/test/compilationTests/gnosis/Events/Event.sol @@ -90,7 +90,7 @@ contract Event { /// @return Outcome count function getOutcomeCount() public - constant + view returns (uint8) { return uint8(outcomeTokens.length); @@ -100,7 +100,7 @@ contract Event { /// @return Outcome tokens function getOutcomeTokens() public - constant + view returns (OutcomeToken[]) { return outcomeTokens; @@ -110,7 +110,7 @@ contract Event { /// @return Outcome token distribution function getOutcomeTokenDistribution(address owner) public - constant + view returns (uint[] outcomeTokenDistribution) { outcomeTokenDistribution = new uint[](outcomeTokens.length); @@ -120,7 +120,7 @@ contract Event { /// @dev Calculates and returns event hash /// @return Event hash - function getEventHash() public constant returns (bytes32); + function getEventHash() public view returns (bytes32); /// @dev Exchanges sender's winning outcome tokens for collateral tokens /// @return Sender's winnings diff --git a/test/compilationTests/gnosis/Events/ScalarEvent.sol b/test/compilationTests/gnosis/Events/ScalarEvent.sol index d5cbef14..832c2ab1 100644 --- a/test/compilationTests/gnosis/Events/ScalarEvent.sol +++ b/test/compilationTests/gnosis/Events/ScalarEvent.sol @@ -79,7 +79,7 @@ contract ScalarEvent is Event { /// @return Event hash function getEventHash() public - constant + view returns (bytes32) { return keccak256(abi.encodePacked(collateralToken, oracle, lowerBound, upperBound)); diff --git a/test/compilationTests/gnosis/MarketMakers/LMSRMarketMaker.sol b/test/compilationTests/gnosis/MarketMakers/LMSRMarketMaker.sol index 344dd8d2..cf4fcd7d 100644 --- a/test/compilationTests/gnosis/MarketMakers/LMSRMarketMaker.sol +++ b/test/compilationTests/gnosis/MarketMakers/LMSRMarketMaker.sol @@ -24,7 +24,7 @@ contract LMSRMarketMaker is MarketMaker { /// @return Cost function calcCost(Market market, uint8 outcomeTokenIndex, uint outcomeTokenCount) public - constant + view returns (uint cost) { require(market.eventContract().getOutcomeCount() > 1); @@ -59,7 +59,7 @@ contract LMSRMarketMaker is MarketMaker { /// @return Profit function calcProfit(Market market, uint8 outcomeTokenIndex, uint outcomeTokenCount) public - constant + view returns (uint profit) { require(market.eventContract().getOutcomeCount() > 1); @@ -85,7 +85,7 @@ contract LMSRMarketMaker is MarketMaker { /// @return Marginal price of an outcome as a fixed point number function calcMarginalPrice(Market market, uint8 outcomeTokenIndex) public - constant + view returns (uint price) { require(market.eventContract().getOutcomeCount() > 1); @@ -110,7 +110,7 @@ contract LMSRMarketMaker is MarketMaker { /// @return Cost level function calcCostLevel(int logN, int[] netOutcomeTokensSold, uint funding) private - constant + view returns(int costLevel) { // The cost function is C = b * log(sum(exp(q/b) for q in quantities)). @@ -131,7 +131,7 @@ contract LMSRMarketMaker is MarketMaker { /// @return A result structure composed of the sum, the offset used, and the summand associated with the supplied index function sumExpOffset(int logN, int[] netOutcomeTokensSold, uint funding, uint8 outcomeIndex) private - constant + view returns (uint sum, int offset, uint outcomeExpTerm) { // Naive calculation of this causes an overflow @@ -170,7 +170,7 @@ contract LMSRMarketMaker is MarketMaker { /// @return Net outcome tokens sold by market function getNetOutcomeTokensSold(Market market) private - constant + view returns (int[] quantities) { quantities = new int[](market.eventContract().getOutcomeCount()); diff --git a/test/compilationTests/gnosis/MarketMakers/MarketMaker.sol b/test/compilationTests/gnosis/MarketMakers/MarketMaker.sol index 3162ce64..ef5942cd 100644 --- a/test/compilationTests/gnosis/MarketMakers/MarketMaker.sol +++ b/test/compilationTests/gnosis/MarketMakers/MarketMaker.sol @@ -8,7 +8,7 @@ contract MarketMaker { /* * Public functions */ - function calcCost(Market market, uint8 outcomeTokenIndex, uint outcomeTokenCount) public constant returns (uint); - function calcProfit(Market market, uint8 outcomeTokenIndex, uint outcomeTokenCount) public constant returns (uint); - function calcMarginalPrice(Market market, uint8 outcomeTokenIndex) public constant returns (uint); + function calcCost(Market market, uint8 outcomeTokenIndex, uint outcomeTokenCount) public view returns (uint); + function calcProfit(Market market, uint8 outcomeTokenIndex, uint outcomeTokenCount) public view returns (uint); + function calcMarginalPrice(Market market, uint8 outcomeTokenIndex) public view returns (uint); } diff --git a/test/compilationTests/gnosis/Markets/Market.sol b/test/compilationTests/gnosis/Markets/Market.sol index 635b14db..7bcecfe5 100644 --- a/test/compilationTests/gnosis/Markets/Market.sol +++ b/test/compilationTests/gnosis/Markets/Market.sol @@ -43,5 +43,5 @@ contract Market { function buy(uint8 outcomeTokenIndex, uint outcomeTokenCount, uint maxCost) public returns (uint); function sell(uint8 outcomeTokenIndex, uint outcomeTokenCount, uint minProfit) public returns (uint); function shortSell(uint8 outcomeTokenIndex, uint outcomeTokenCount, uint minProfit) public returns (uint); - function calcMarketFee(uint outcomeTokenCost) public constant returns (uint); + function calcMarketFee(uint outcomeTokenCost) public view returns (uint); } diff --git a/test/compilationTests/gnosis/Markets/StandardMarket.sol b/test/compilationTests/gnosis/Markets/StandardMarket.sol index 84f30386..0a9f77db 100644 --- a/test/compilationTests/gnosis/Markets/StandardMarket.sol +++ b/test/compilationTests/gnosis/Markets/StandardMarket.sol @@ -186,7 +186,7 @@ contract StandardMarket is Market { /// @return Fee for trade function calcMarketFee(uint outcomeTokenCost) public - constant + view returns (uint) { return outcomeTokenCost * fee / FEE_RANGE; diff --git a/test/compilationTests/gnosis/Oracles/CentralizedOracle.sol b/test/compilationTests/gnosis/Oracles/CentralizedOracle.sol index 362c514c..de182a61 100644 --- a/test/compilationTests/gnosis/Oracles/CentralizedOracle.sol +++ b/test/compilationTests/gnosis/Oracles/CentralizedOracle.sol @@ -72,7 +72,7 @@ contract CentralizedOracle is Oracle { /// @return Is outcome set? function isOutcomeSet() public - constant + view returns (bool) { return isSet; @@ -82,7 +82,7 @@ contract CentralizedOracle is Oracle { /// @return Outcome function getOutcome() public - constant + view returns (int) { return outcome; diff --git a/test/compilationTests/gnosis/Oracles/DifficultyOracle.sol b/test/compilationTests/gnosis/Oracles/DifficultyOracle.sol index 94fc70ca..3d801da1 100644 --- a/test/compilationTests/gnosis/Oracles/DifficultyOracle.sol +++ b/test/compilationTests/gnosis/Oracles/DifficultyOracle.sol @@ -44,7 +44,7 @@ contract DifficultyOracle is Oracle { /// @return Is outcome set? function isOutcomeSet() public - constant + view returns (bool) { // Difficulty is always bigger than 0 @@ -55,7 +55,7 @@ contract DifficultyOracle is Oracle { /// @return Outcome function getOutcome() public - constant + view returns (int) { return int(difficulty); diff --git a/test/compilationTests/gnosis/Oracles/FutarchyOracle.sol b/test/compilationTests/gnosis/Oracles/FutarchyOracle.sol index 7105f247..cf851f5b 100644 --- a/test/compilationTests/gnosis/Oracles/FutarchyOracle.sol +++ b/test/compilationTests/gnosis/Oracles/FutarchyOracle.sol @@ -151,7 +151,7 @@ contract FutarchyOracle is Oracle { /// @return Is outcome set? function isOutcomeSet() public - constant + view returns (bool) { return isSet; @@ -161,7 +161,7 @@ contract FutarchyOracle is Oracle { /// @return Outcome function getOutcome() public - constant + view returns (int) { return int(winningMarketIndex); diff --git a/test/compilationTests/gnosis/Oracles/MajorityOracle.sol b/test/compilationTests/gnosis/Oracles/MajorityOracle.sol index 24cf9dea..d8097370 100644 --- a/test/compilationTests/gnosis/Oracles/MajorityOracle.sol +++ b/test/compilationTests/gnosis/Oracles/MajorityOracle.sol @@ -32,6 +32,7 @@ contract MajorityOracle is Oracle { /// @return Outcome function getStatusAndOutcome() public + view returns (bool outcomeSet, int outcome) { uint i; @@ -69,7 +70,7 @@ contract MajorityOracle is Oracle { /// @return Is outcome set? function isOutcomeSet() public - constant + view returns (bool) { (bool outcomeSet, ) = getStatusAndOutcome(); @@ -80,7 +81,7 @@ contract MajorityOracle is Oracle { /// @return Outcome function getOutcome() public - constant + view returns (int) { (, int winningOutcome) = getStatusAndOutcome(); diff --git a/test/compilationTests/gnosis/Oracles/Oracle.sol b/test/compilationTests/gnosis/Oracles/Oracle.sol index cf96eb9f..450aff00 100644 --- a/test/compilationTests/gnosis/Oracles/Oracle.sol +++ b/test/compilationTests/gnosis/Oracles/Oracle.sol @@ -4,6 +4,6 @@ pragma solidity ^0.4.11; /// @title Abstract oracle contract - Functions to be implemented by oracles contract Oracle { - function isOutcomeSet() public constant returns (bool); - function getOutcome() public constant returns (int); + function isOutcomeSet() public view returns (bool); + function getOutcome() public view returns (int); } diff --git a/test/compilationTests/gnosis/Oracles/SignedMessageOracle.sol b/test/compilationTests/gnosis/Oracles/SignedMessageOracle.sol index 121824ff..284f420e 100644 --- a/test/compilationTests/gnosis/Oracles/SignedMessageOracle.sol +++ b/test/compilationTests/gnosis/Oracles/SignedMessageOracle.sol @@ -84,7 +84,7 @@ contract SignedMessageOracle is Oracle { /// @return Is outcome set? function isOutcomeSet() public - constant + view returns (bool) { return isSet; @@ -94,7 +94,7 @@ contract SignedMessageOracle is Oracle { /// @return Outcome function getOutcome() public - constant + view returns (int) { return outcome; diff --git a/test/compilationTests/gnosis/Oracles/UltimateOracle.sol b/test/compilationTests/gnosis/Oracles/UltimateOracle.sol index dd66c9ab..b7cc231c 100644 --- a/test/compilationTests/gnosis/Oracles/UltimateOracle.sol +++ b/test/compilationTests/gnosis/Oracles/UltimateOracle.sol @@ -144,6 +144,7 @@ contract UltimateOracle is Oracle { /// @return Is challenge period over? function isChallengePeriodOver() public + view returns (bool) { return forwardedOutcomeSetTimestamp != 0 && now.sub(forwardedOutcomeSetTimestamp) > challengePeriod; @@ -153,6 +154,7 @@ contract UltimateOracle is Oracle { /// @return Is front runner period over? function isFrontRunnerPeriodOver() public + view returns (bool) { return frontRunnerSetTimestamp != 0 && now.sub(frontRunnerSetTimestamp) > frontRunnerPeriod; @@ -162,6 +164,7 @@ contract UltimateOracle is Oracle { /// @return Is challenged? function isChallenged() public + view returns (bool) { return frontRunnerSetTimestamp != 0; @@ -171,7 +174,7 @@ contract UltimateOracle is Oracle { /// @return Is outcome set? function isOutcomeSet() public - constant + view returns (bool) { return isChallengePeriodOver() && !isChallenged() @@ -182,7 +185,7 @@ contract UltimateOracle is Oracle { /// @return Outcome function getOutcome() public - constant + view returns (int) { if (isFrontRunnerPeriodOver()) diff --git a/test/compilationTests/gnosis/Tokens/StandardToken.sol b/test/compilationTests/gnosis/Tokens/StandardToken.sol index b7d0d37a..5fb20210 100644 --- a/test/compilationTests/gnosis/Tokens/StandardToken.sol +++ b/test/compilationTests/gnosis/Tokens/StandardToken.sol @@ -73,7 +73,7 @@ contract StandardToken is Token { /// @return Remaining allowance for spender function allowance(address owner, address spender) public - constant + view returns (uint) { return allowances[owner][spender]; @@ -84,7 +84,7 @@ contract StandardToken is Token { /// @return Balance of owner function balanceOf(address owner) public - constant + view returns (uint) { return balances[owner]; @@ -94,7 +94,7 @@ contract StandardToken is Token { /// @return Total supply function totalSupply() public - constant + view returns (uint) { return totalTokens; diff --git a/test/compilationTests/gnosis/Tokens/Token.sol b/test/compilationTests/gnosis/Tokens/Token.sol index 19bb618b..70ecdff7 100644 --- a/test/compilationTests/gnosis/Tokens/Token.sol +++ b/test/compilationTests/gnosis/Tokens/Token.sol @@ -17,7 +17,7 @@ contract Token { function transfer(address to, uint value) public returns (bool); function transferFrom(address from, address to, uint value) public returns (bool); function approve(address spender, uint value) public returns (bool); - function balanceOf(address owner) public constant returns (uint); - function allowance(address owner, address spender) public constant returns (uint); - function totalSupply() public constant returns (uint); + function balanceOf(address owner) public view returns (uint); + function allowance(address owner, address spender) public view returns (uint); + function totalSupply() public view returns (uint); } diff --git a/test/compilationTests/gnosis/Utils/Math.sol b/test/compilationTests/gnosis/Utils/Math.sol index 95d95346..93456c33 100644 --- a/test/compilationTests/gnosis/Utils/Math.sol +++ b/test/compilationTests/gnosis/Utils/Math.sol @@ -22,7 +22,7 @@ library Math { /// @return e**x function exp(int x) public - constant + pure returns (uint) { // revert if x is > MAX_POWER, where @@ -107,7 +107,7 @@ library Math { /// @return ln(x) function ln(uint x) public - constant + pure returns (int) { require(x > 0); @@ -157,7 +157,7 @@ library Math { /// @return logarithmic value function floorLog2(uint x) public - constant + pure returns (int lo) { lo = -64; @@ -178,7 +178,7 @@ library Math { /// @return Maximum number function max(int[] nums) public - constant + pure returns (int max) { require(nums.length > 0); @@ -194,7 +194,7 @@ library Math { /// @return Did no overflow occur? function safeToAdd(uint a, uint b) public - constant + pure returns (bool) { return a + b >= a; @@ -206,7 +206,7 @@ library Math { /// @return Did no underflow occur? function safeToSub(uint a, uint b) public - constant + pure returns (bool) { return a >= b; @@ -218,7 +218,7 @@ library Math { /// @return Did no overflow occur? function safeToMul(uint a, uint b) public - constant + pure returns (bool) { return b == 0 || a * b / b == a; @@ -230,7 +230,7 @@ library Math { /// @return Sum function add(uint a, uint b) public - constant + pure returns (uint) { require(safeToAdd(a, b)); @@ -243,7 +243,7 @@ library Math { /// @return Difference function sub(uint a, uint b) public - constant + pure returns (uint) { require(safeToSub(a, b)); @@ -256,7 +256,7 @@ library Math { /// @return Product function mul(uint a, uint b) public - constant + pure returns (uint) { require(safeToMul(a, b)); @@ -269,7 +269,7 @@ library Math { /// @return Did no overflow occur? function safeToAdd(int a, int b) public - constant + pure returns (bool) { return (b >= 0 && a + b >= a) || (b < 0 && a + b < a); @@ -281,7 +281,7 @@ library Math { /// @return Did no underflow occur? function safeToSub(int a, int b) public - constant + pure returns (bool) { return (b >= 0 && a - b <= a) || (b < 0 && a - b > a); @@ -293,7 +293,7 @@ library Math { /// @return Did no overflow occur? function safeToMul(int a, int b) public - constant + pure returns (bool) { return (b == 0) || (a * b / b == a); @@ -305,7 +305,7 @@ library Math { /// @return Sum function add(int a, int b) public - constant + pure returns (int) { require(safeToAdd(a, b)); @@ -318,7 +318,7 @@ library Math { /// @return Difference function sub(int a, int b) public - constant + pure returns (int) { require(safeToSub(a, b)); @@ -331,7 +331,7 @@ library Math { /// @return Product function mul(int a, int b) public - constant + pure returns (int) { require(safeToMul(a, b)); diff --git a/test/compilationTests/milestonetracker/MilestoneTracker.sol b/test/compilationTests/milestonetracker/MilestoneTracker.sol index 56422169..378f7b73 100644 --- a/test/compilationTests/milestonetracker/MilestoneTracker.sol +++ b/test/compilationTests/milestonetracker/MilestoneTracker.sol @@ -124,7 +124,7 @@ contract MilestoneTracker { ///////// /// @return The number of milestones ever created even if they were canceled - function numberOfMilestones() constant returns (uint) { + function numberOfMilestones() view returns (uint) { return milestones.length; } diff --git a/test/compilationTests/milestonetracker/RLP.sol b/test/compilationTests/milestonetracker/RLP.sol index e71d567e..e96bb332 100644 --- a/test/compilationTests/milestonetracker/RLP.sol +++ b/test/compilationTests/milestonetracker/RLP.sol @@ -30,7 +30,7 @@ library RLP { /* Iterator */ - function next(Iterator memory self) internal constant returns (RLPItem memory subItem) { + function next(Iterator memory self) internal view returns (RLPItem memory subItem) { if(hasNext(self)) { uint ptr = self._unsafe_nextPtr; uint itemLength = _itemLength(ptr); @@ -42,14 +42,14 @@ library RLP { throw; } - function next(Iterator memory self, bool strict) internal constant returns (RLPItem memory subItem) { + function next(Iterator memory self, bool strict) internal view returns (RLPItem memory subItem) { subItem = next(self); if(strict && !_validate(subItem)) throw; return; } - function hasNext(Iterator memory self) internal constant returns (bool) { + function hasNext(Iterator memory self) internal view returns (bool) { RLPItem memory item = self._unsafe_item; return self._unsafe_nextPtr < item._unsafe_memPtr + item._unsafe_length; } @@ -59,7 +59,7 @@ library RLP { /// @dev Creates an RLPItem from an array of RLP encoded bytes. /// @param self The RLP encoded bytes. /// @return An RLPItem - function toRLPItem(bytes memory self) internal constant returns (RLPItem memory) { + function toRLPItem(bytes memory self) internal view returns (RLPItem memory) { uint len = self.length; if (len == 0) { return RLPItem(0, 0); @@ -75,7 +75,7 @@ library RLP { /// @param self The RLP encoded bytes. /// @param strict Will throw if the data is not RLP encoded. /// @return An RLPItem - function toRLPItem(bytes memory self, bool strict) internal constant returns (RLPItem memory) { + function toRLPItem(bytes memory self, bool strict) internal view returns (RLPItem memory) { RLPItem memory item = toRLPItem(self); if(strict) { uint len = self.length; @@ -92,14 +92,14 @@ library RLP { /// @dev Check if the RLP item is null. /// @param self The RLP item. /// @return 'true' if the item is null. - function isNull(RLPItem memory self) internal constant returns (bool ret) { + function isNull(RLPItem memory self) internal view returns (bool ret) { return self._unsafe_length == 0; } /// @dev Check if the RLP item is a list. /// @param self The RLP item. /// @return 'true' if the item is a list. - function isList(RLPItem memory self) internal constant returns (bool ret) { + function isList(RLPItem memory self) internal view returns (bool ret) { if (self._unsafe_length == 0) return false; uint memPtr = self._unsafe_memPtr; @@ -111,7 +111,7 @@ library RLP { /// @dev Check if the RLP item is data. /// @param self The RLP item. /// @return 'true' if the item is data. - function isData(RLPItem memory self) internal constant returns (bool ret) { + function isData(RLPItem memory self) internal view returns (bool ret) { if (self._unsafe_length == 0) return false; uint memPtr = self._unsafe_memPtr; @@ -123,7 +123,7 @@ library RLP { /// @dev Check if the RLP item is empty (string or list). /// @param self The RLP item. /// @return 'true' if the item is null. - function isEmpty(RLPItem memory self) internal constant returns (bool ret) { + function isEmpty(RLPItem memory self) internal view returns (bool ret) { if(isNull(self)) return false; uint b0; @@ -137,7 +137,7 @@ library RLP { /// @dev Get the number of items in an RLP encoded list. /// @param self The RLP item. /// @return The number of items. - function items(RLPItem memory self) internal constant returns (uint) { + function items(RLPItem memory self) internal view returns (uint) { if (!isList(self)) return 0; uint b0; @@ -158,7 +158,7 @@ library RLP { /// @dev Create an iterator. /// @param self The RLP item. /// @return An 'Iterator' over the item. - function iterator(RLPItem memory self) internal constant returns (Iterator memory it) { + function iterator(RLPItem memory self) internal view returns (Iterator memory it) { if (!isList(self)) throw; uint ptr = self._unsafe_memPtr + _payloadOffset(self); @@ -169,7 +169,7 @@ library RLP { /// @dev Return the RLP encoded bytes. /// @param self The RLPItem. /// @return The bytes. - function toBytes(RLPItem memory self) internal constant returns (bytes memory bts) { + function toBytes(RLPItem memory self) internal returns (bytes memory bts) { uint len = self._unsafe_length; if (len == 0) return; @@ -181,7 +181,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toData(RLPItem memory self) internal constant returns (bytes memory bts) { + function toData(RLPItem memory self) internal returns (bytes memory bts) { if(!isData(self)) throw; (uint rStartPos, uint len) = _decode(self); @@ -193,7 +193,7 @@ library RLP { /// Warning: This is inefficient, as it requires that the list is read twice. /// @param self The RLP item. /// @return Array of RLPItems. - function toList(RLPItem memory self) internal constant returns (RLPItem[] memory list) { + function toList(RLPItem memory self) internal view returns (RLPItem[] memory list) { if(!isList(self)) throw; uint numItems = items(self); @@ -210,7 +210,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toAscii(RLPItem memory self) internal constant returns (string memory str) { + function toAscii(RLPItem memory self) internal returns (string memory str) { if(!isData(self)) throw; (uint rStartPos, uint len) = _decode(self); @@ -223,7 +223,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toUint(RLPItem memory self) internal constant returns (uint data) { + function toUint(RLPItem memory self) internal view returns (uint data) { if(!isData(self)) throw; (uint rStartPos, uint len) = _decode(self); @@ -238,7 +238,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toBool(RLPItem memory self) internal constant returns (bool data) { + function toBool(RLPItem memory self) internal view returns (bool data) { if(!isData(self)) throw; (uint rStartPos, uint len) = _decode(self); @@ -257,7 +257,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toByte(RLPItem memory self) internal constant returns (byte data) { + function toByte(RLPItem memory self) internal view returns (byte data) { if(!isData(self)) throw; (uint rStartPos, uint len) = _decode(self); @@ -274,7 +274,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toInt(RLPItem memory self) internal constant returns (int data) { + function toInt(RLPItem memory self) internal view returns (int data) { return int(toUint(self)); } @@ -282,7 +282,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toBytes32(RLPItem memory self) internal constant returns (bytes32 data) { + function toBytes32(RLPItem memory self) internal view returns (bytes32 data) { return bytes32(toUint(self)); } @@ -290,7 +290,7 @@ library RLP { /// RLPItem is a list. /// @param self The RLPItem. /// @return The decoded string. - function toAddress(RLPItem memory self) internal constant returns (address data) { + function toAddress(RLPItem memory self) internal view returns (address data) { if(!isData(self)) throw; (uint rStartPos, uint len) = _decode(self); @@ -302,7 +302,7 @@ library RLP { } // Get the payload offset. - function _payloadOffset(RLPItem memory self) private constant returns (uint) { + function _payloadOffset(RLPItem memory self) private view returns (uint) { if(self._unsafe_length == 0) return 0; uint b0; @@ -320,7 +320,7 @@ library RLP { } // Get the full length of an RLP item. - function _itemLength(uint memPtr) private constant returns (uint len) { + function _itemLength(uint memPtr) private view returns (uint len) { uint b0; assembly { b0 := byte(0, mload(memPtr)) @@ -348,7 +348,7 @@ library RLP { } // Get start position and length of the data. - function _decode(RLPItem memory self) private constant returns (uint memPtr, uint len) { + function _decode(RLPItem memory self) private view returns (uint memPtr, uint len) { if(!isData(self)) throw; uint b0; @@ -376,7 +376,7 @@ library RLP { } // Assumes that enough memory has been allocated to store in target. - function _copyToBytes(uint btsPtr, bytes memory tgt, uint btsLen) private constant { + function _copyToBytes(uint btsPtr, bytes memory tgt, uint btsLen) private { // Exploiting the fact that 'tgt' was the last thing to be allocated, // we can write entire words, and just overwrite any excess. assembly { @@ -400,7 +400,7 @@ library RLP { } // Check that an RLP item is valid. - function _validate(RLPItem memory self) private constant returns (bool ret) { + function _validate(RLPItem memory self) private view returns (bool ret) { // Check that RLP is well-formed. uint b0; uint b1; diff --git a/test/compilationTests/zeppelin/DayLimit.sol b/test/compilationTests/zeppelin/DayLimit.sol index 0bcb341a..e55076b7 100644 --- a/test/compilationTests/zeppelin/DayLimit.sol +++ b/test/compilationTests/zeppelin/DayLimit.sol @@ -59,7 +59,7 @@ contract DayLimit { * @dev Private function to determine today's index * @return uint256 of today's index. */ - function today() private constant returns (uint256) { + function today() private view returns (uint256) { return now / 1 days; } diff --git a/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol b/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol index afae79b7..d4066812 100644 --- a/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol +++ b/test/compilationTests/zeppelin/crowdsale/CappedCrowdsale.sol @@ -18,14 +18,14 @@ contract CappedCrowdsale is Crowdsale { // overriding Crowdsale#validPurchase to add extra cap logic // @return true if investors can buy at the moment - function validPurchase() internal constant returns (bool) { + function validPurchase() internal view returns (bool) { bool withinCap = weiRaised.add(msg.value) <= cap; return super.validPurchase() && withinCap; } // overriding Crowdsale#hasEnded to add cap logic // @return true if crowdsale event has ended - function hasEnded() public constant returns (bool) { + function hasEnded() public view returns (bool) { bool capReached = weiRaised >= cap; return super.hasEnded() || capReached; } diff --git a/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol b/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol index d798f41d..1f148a74 100644 --- a/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol +++ b/test/compilationTests/zeppelin/crowdsale/Crowdsale.sol @@ -92,7 +92,7 @@ contract Crowdsale { } // @return true if the transaction can buy tokens - function validPurchase() internal constant returns (bool) { + function validPurchase() internal view returns (bool) { uint256 current = block.number; bool withinPeriod = current >= startBlock && current <= endBlock; bool nonZeroPurchase = msg.value != 0; @@ -100,7 +100,7 @@ contract Crowdsale { } // @return true if crowdsale event has ended - function hasEnded() public constant returns (bool) { + function hasEnded() public view returns (bool) { return block.number > endBlock; } diff --git a/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol b/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol index 5e798d45..bb6b5e17 100644 --- a/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol +++ b/test/compilationTests/zeppelin/crowdsale/RefundableCrowdsale.sol @@ -52,7 +52,7 @@ contract RefundableCrowdsale is FinalizableCrowdsale { super.finalization(); } - function goalReached() public constant returns (bool) { + function goalReached() public view returns (bool) { return weiRaised >= goal; } diff --git a/test/compilationTests/zeppelin/math/Math.sol b/test/compilationTests/zeppelin/math/Math.sol index 3d016c0a..9997998a 100644 --- a/test/compilationTests/zeppelin/math/Math.sol +++ b/test/compilationTests/zeppelin/math/Math.sol @@ -6,19 +6,19 @@ pragma solidity ^0.4.11; */ library Math { - function max64(uint64 a, uint64 b) internal constant returns (uint64) { + function max64(uint64 a, uint64 b) internal pure returns (uint64) { return a >= b ? a : b; } - function min64(uint64 a, uint64 b) internal constant returns (uint64) { + function min64(uint64 a, uint64 b) internal pure returns (uint64) { return a < b ? a : b; } - function max256(uint256 a, uint256 b) internal constant returns (uint256) { + function max256(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } - function min256(uint256 a, uint256 b) internal constant returns (uint256) { + function min256(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } } diff --git a/test/compilationTests/zeppelin/math/SafeMath.sol b/test/compilationTests/zeppelin/math/SafeMath.sol index dc05ba28..a98635e2 100644 --- a/test/compilationTests/zeppelin/math/SafeMath.sol +++ b/test/compilationTests/zeppelin/math/SafeMath.sol @@ -6,25 +6,25 @@ pragma solidity ^0.4.11; * @dev Math operations with safety checks that throw on error */ library SafeMath { - function mul(uint256 a, uint256 b) internal returns (uint256) { + function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } - function div(uint256 a, uint256 b) internal returns (uint256) { + function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } - function sub(uint256 a, uint256 b) internal returns (uint256) { + function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } - function add(uint256 a, uint256 b) internal returns (uint256) { + function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; diff --git a/test/compilationTests/zeppelin/ownership/Shareable.sol b/test/compilationTests/zeppelin/ownership/Shareable.sol index f8059650..c954052b 100644 --- a/test/compilationTests/zeppelin/ownership/Shareable.sol +++ b/test/compilationTests/zeppelin/ownership/Shareable.sol @@ -96,7 +96,7 @@ contract Shareable { * @param ownerIndex uint256 The index of the owner * @return The address of the owner */ - function getOwner(uint256 ownerIndex) external constant returns (address) { + function getOwner(uint256 ownerIndex) external view returns (address) { return address(owners[ownerIndex + 1]); } @@ -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) constant returns (bool) { + function isOwner(address _addr) 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) constant returns (bool) { + function hasConfirmed(bytes32 _operation, address _owner) view returns (bool) { PendingState memory pending = pendings[_operation]; uint256 index = ownerIndex[_owner]; diff --git a/test/compilationTests/zeppelin/token/BasicToken.sol b/test/compilationTests/zeppelin/token/BasicToken.sol index 831f706e..8a3d8ead 100644 --- a/test/compilationTests/zeppelin/token/BasicToken.sol +++ b/test/compilationTests/zeppelin/token/BasicToken.sol @@ -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) constant returns (uint256 balance) { + function balanceOf(address _owner) view returns (uint256 balance) { return balances[_owner]; } diff --git a/test/compilationTests/zeppelin/token/ERC20.sol b/test/compilationTests/zeppelin/token/ERC20.sol index 1045ac35..ae5aa624 100644 --- a/test/compilationTests/zeppelin/token/ERC20.sol +++ b/test/compilationTests/zeppelin/token/ERC20.sol @@ -9,7 +9,7 @@ import './ERC20Basic.sol'; * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { - function allowance(address owner, address spender) constant returns (uint256); + function allowance(address owner, address spender) view returns (uint256); function transferFrom(address from, address to, uint256 value); function approve(address spender, uint256 value); 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 0e98779e..94fb7bcf 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) constant returns (uint256); + function balanceOf(address who) view returns (uint256); function transfer(address to, uint256 value); 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 ee5032c9..0ccd60b2 100644 --- a/test/compilationTests/zeppelin/token/LimitedTransferToken.sol +++ b/test/compilationTests/zeppelin/token/LimitedTransferToken.sol @@ -10,7 +10,7 @@ import "./ERC20.sol"; * LimitedTransferToken has been designed to allow for different limiting factors, * this can be achieved by recursively calling super.transferableTokens() until the base class is * hit. For example: - * function transferableTokens(address holder, uint64 time) constant public returns (uint256) { + * function transferableTokens(address holder, uint64 time) view public returns (uint256) { * return min256(unlockedTokens, super.transferableTokens(holder, time)); * } * A working example is VestedToken.sol: @@ -51,7 +51,7 @@ contract LimitedTransferToken is ERC20 { * @dev Overwriting transferableTokens(address holder, uint64 time) is the way to provide the * specific logic for limiting token transferability for a holder over time. */ - function transferableTokens(address holder, uint64 time) constant public returns (uint256) { + function transferableTokens(address holder, uint64 time) view public returns (uint256) { return balanceOf(holder); } } diff --git a/test/compilationTests/zeppelin/token/StandardToken.sol b/test/compilationTests/zeppelin/token/StandardToken.sol index ab9f582e..900a9102 100644 --- a/test/compilationTests/zeppelin/token/StandardToken.sol +++ b/test/compilationTests/zeppelin/token/StandardToken.sol @@ -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) constant returns (uint256 remaining) { + function allowance(address _owner, address _spender) view returns (uint256 remaining) { return allowed[_owner][_spender]; } diff --git a/test/compilationTests/zeppelin/token/VestedToken.sol b/test/compilationTests/zeppelin/token/VestedToken.sol index e9929018..3953612d 100644 --- a/test/compilationTests/zeppelin/token/VestedToken.sol +++ b/test/compilationTests/zeppelin/token/VestedToken.sol @@ -106,7 +106,7 @@ contract VestedToken is StandardToken, LimitedTransferToken { * @param time uint64 The specific time. * @return An uint256 representing a holder's total amount of transferable tokens. */ - function transferableTokens(address holder, uint64 time) constant public returns (uint256) { + function transferableTokens(address holder, uint64 time) view public returns (uint256) { uint256 grantIndex = tokenGrantsCount(holder); if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants @@ -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) constant returns (uint256 index) { + function tokenGrantsCount(address _holder) 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) constant returns (uint256) + uint256 vesting) 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) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting, bool revokable, bool burnsOnRevoke) { + function tokenGrant(address _holder, uint256 _grantId) 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; @@ -212,7 +212,7 @@ contract VestedToken is StandardToken, LimitedTransferToken { * @param time The time to be checked * @return An uint256 representing the amount of vested tokens of a specific grant at a specific time. */ - function vestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) { + function vestedTokens(TokenGrant grant, uint64 time) private view returns (uint256) { return calculateVestedTokens( grant.value, uint256(time), @@ -229,7 +229,7 @@ contract VestedToken is StandardToken, LimitedTransferToken { * @return An uint256 representing the amount of non vested tokens of a specifc grant on the * passed time frame. */ - function nonVestedTokens(TokenGrant grant, uint64 time) private constant returns (uint256) { + function nonVestedTokens(TokenGrant grant, uint64 time) private view returns (uint256) { return grant.value.sub(vestedTokens(grant, time)); } @@ -238,7 +238,7 @@ contract VestedToken is StandardToken, LimitedTransferToken { * @param holder address The address of the holder * @return An uint256 representing the date of the last transferable tokens. */ - function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) { + function lastTokenIsTransferableDate(address holder) view public returns (uint64 date) { date = uint64(now); uint256 grantIndex = grants[holder].length; for (uint256 i = 0; i < grantIndex; i++) { diff --git a/test/contracts/AuctionRegistrar.cpp b/test/contracts/AuctionRegistrar.cpp index f5abb83d..3d759aa0 100644 --- a/test/contracts/AuctionRegistrar.cpp +++ b/test/contracts/AuctionRegistrar.cpp @@ -43,20 +43,20 @@ static char const* registrarCode = R"DELIMITER( pragma solidity ^0.4.0; contract NameRegister { - function addr(string _name) constant returns (address o_owner); - function name(address _owner) constant returns (string o_name); + function addr(string _name) view returns (address o_owner); + function name(address _owner) view returns (string o_name); } contract Registrar is NameRegister { event Changed(string indexed name); event PrimaryChanged(string indexed name, address indexed addr); - function owner(string _name) constant returns (address o_owner); - function addr(string _name) constant returns (address o_address); - function subRegistrar(string _name) constant returns (address o_subRegistrar); - function content(string _name) constant returns (bytes32 o_content); + function owner(string _name) view returns (address o_owner); + function addr(string _name) view returns (address o_address); + function subRegistrar(string _name) view returns (address o_subRegistrar); + function content(string _name) view returns (bytes32 o_content); - function name(address _owner) constant returns (string o_name); + function name(address _owner) view returns (string o_name); } contract AuctionSystem { @@ -67,7 +67,7 @@ contract AuctionSystem { function onAuctionEnd(string _name) internal; function bid(string _name, address _bidder, uint _value) internal { - var auction = m_auctions[_name]; + Auction storage auction = m_auctions[_name]; if (auction.endDate > 0 && now > auction.endDate) { emit AuctionEnded(_name, auction.highestBidder); @@ -117,9 +117,9 @@ contract GlobalRegistrar is Registrar, AuctionSystem { } function onAuctionEnd(string _name) internal { - var auction = m_auctions[_name]; - var record = m_toRecord[_name]; - var previousOwner = record.owner; + Auction storage auction = m_auctions[_name]; + Record storage record = m_toRecord[_name]; + address previousOwner = record.owner; record.renewalDate = now + c_renewalInterval; record.owner = auction.highestBidder; emit Changed(_name); @@ -201,11 +201,11 @@ contract GlobalRegistrar is Registrar, AuctionSystem { return true; } - function owner(string _name) constant returns (address) { return m_toRecord[_name].owner; } - function addr(string _name) constant returns (address) { return m_toRecord[_name].primary; } - function subRegistrar(string _name) constant returns (address) { return m_toRecord[_name].subRegistrar; } - function content(string _name) constant returns (bytes32) { return m_toRecord[_name].content; } - function name(address _addr) constant returns (string o_name) { return m_toName[_addr]; } + function owner(string _name) view returns (address) { return m_toRecord[_name].owner; } + function addr(string _name) view returns (address) { return m_toRecord[_name].primary; } + function subRegistrar(string _name) view returns (address) { return m_toRecord[_name].subRegistrar; } + function content(string _name) view returns (bytes32) { return m_toRecord[_name].content; } + function name(address _addr) view returns (string o_name) { return m_toName[_addr]; } mapping (address => string) m_toName; mapping (string => Record) m_toRecord; @@ -223,6 +223,7 @@ protected: s_compiledRegistrar.reset(new bytes(compileContract(registrarCode, "GlobalRegistrar"))); sendMessage(*s_compiledRegistrar, true); + BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(!m_output.empty()); } diff --git a/test/contracts/FixedFeeRegistrar.cpp b/test/contracts/FixedFeeRegistrar.cpp index 142f4144..87f801b0 100644 --- a/test/contracts/FixedFeeRegistrar.cpp +++ b/test/contracts/FixedFeeRegistrar.cpp @@ -58,10 +58,10 @@ pragma solidity ^0.4.0; contract Registrar { event Changed(string indexed name); - function owner(string _name) constant returns (address o_owner); - function addr(string _name) constant returns (address o_address); - function subRegistrar(string _name) constant returns (address o_subRegistrar); - function content(string _name) constant returns (bytes32 o_content); + function owner(string _name) view returns (address o_owner); + function addr(string _name) view returns (address o_address); + function subRegistrar(string _name) view returns (address o_subRegistrar); + function content(string _name) view returns (bytes32 o_content); } contract FixedFeeRegistrar is Registrar { @@ -104,20 +104,20 @@ contract FixedFeeRegistrar is Registrar { emit Changed(_name); } - function record(string _name) constant returns (address o_addr, address o_subRegistrar, bytes32 o_content, address o_owner) { + function record(string _name) view returns (address o_addr, address o_subRegistrar, bytes32 o_content, address o_owner) { Record rec = m_record(_name); o_addr = rec.addr; o_subRegistrar = rec.subRegistrar; o_content = rec.content; o_owner = rec.owner; } - function addr(string _name) constant returns (address) { return m_record(_name).addr; } - function subRegistrar(string _name) constant returns (address) { return m_record(_name).subRegistrar; } - function content(string _name) constant returns (bytes32) { return m_record(_name).content; } - function owner(string _name) constant returns (address) { return m_record(_name).owner; } + function addr(string _name) view returns (address) { return m_record(_name).addr; } + function subRegistrar(string _name) view returns (address) { return m_record(_name).subRegistrar; } + function content(string _name) view returns (bytes32) { return m_record(_name).content; } + function owner(string _name) view returns (address) { return m_record(_name).owner; } Record[2**253] m_recordData; - function m_record(string _name) constant internal returns (Record storage o_record) { + function m_record(string _name) view internal returns (Record storage o_record) { return m_recordData[uint(keccak256(bytes(_name))) / 8]; } uint constant c_fee = 69 ether; @@ -135,6 +135,7 @@ protected: s_compiledRegistrar.reset(new bytes(compileContract(registrarCode, "FixedFeeRegistrar"))); sendMessage(*s_compiledRegistrar, true); + BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(!m_output.empty()); } u256 const m_fee = u256("69000000000000000000"); diff --git a/test/contracts/LLL_ENS.cpp b/test/contracts/LLL_ENS.cpp index 028d58c8..3461c577 100644 --- a/test/contracts/LLL_ENS.cpp +++ b/test/contracts/LLL_ENS.cpp @@ -349,6 +349,7 @@ protected: BOOST_REQUIRE(errors.empty()); } sendMessage(*s_compiledEns, true); + BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(!m_output.empty()); } diff --git a/test/contracts/LLL_ERC20.cpp b/test/contracts/LLL_ERC20.cpp index 60b43e4f..89d1c4f0 100644 --- a/test/contracts/LLL_ERC20.cpp +++ b/test/contracts/LLL_ERC20.cpp @@ -400,6 +400,7 @@ protected: BOOST_REQUIRE(errors.empty()); } sendMessage(*s_compiledErc20, true); + BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(!m_output.empty()); } @@ -629,18 +630,22 @@ BOOST_AUTO_TEST_CASE(bad_data) // Correct data: transfer(address _to, 1). sendMessage((bytes)fromHex("a9059cbb") + (bytes)fromHex("000000000000000000000000123456789a123456789a123456789a123456789a") + encodeArgs(1), false, 0); + BOOST_CHECK(m_transactionSuccessful); BOOST_CHECK(m_output == SUCCESS); // Too little data (address is truncated by one byte). sendMessage((bytes)fromHex("a9059cbb") + (bytes)fromHex("000000000000000000000000123456789a123456789a123456789a12345678") + encodeArgs(1), false, 0); + BOOST_CHECK(!m_transactionSuccessful); BOOST_CHECK(m_output != SUCCESS); // Too much data (address is extended with a zero byte). sendMessage((bytes)fromHex("a9059cbb") + (bytes)fromHex("000000000000000000000000123456789a123456789a123456789a123456789a00") + encodeArgs(1), false, 0); + BOOST_CHECK(!m_transactionSuccessful); BOOST_CHECK(m_output != SUCCESS); // Invalid address (a bit above the 160th is set). sendMessage((bytes)fromHex("a9059cbb") + (bytes)fromHex("000000000000000000000100123456789a123456789a123456789a123456789a") + encodeArgs(1), false, 0); + BOOST_CHECK(!m_transactionSuccessful); BOOST_CHECK(m_output != SUCCESS); } diff --git a/test/contracts/Wallet.cpp b/test/contracts/Wallet.cpp index 6328b518..fb104300 100644 --- a/test/contracts/Wallet.cpp +++ b/test/contracts/Wallet.cpp @@ -119,7 +119,7 @@ contract multiowned { // make sure they're an owner if (ownerIndex == 0) return; uint ownerIndexBit = 2**ownerIndex; - var pending = m_pending[_operation]; + PendingState pending = m_pending[_operation]; if (pending.ownersDone & ownerIndexBit > 0) { pending.yetNeeded++; pending.ownersDone -= ownerIndexBit; @@ -177,8 +177,8 @@ contract multiowned { return m_ownerIndex[uint(_addr)] > 0; } - function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) { - var pending = m_pending[_operation]; + function hasConfirmed(bytes32 _operation, address _owner) view returns (bool) { + PendingState pending = m_pending[_operation]; uint ownerIndex = m_ownerIndex[uint(_owner)]; // make sure they're an owner @@ -201,7 +201,7 @@ contract multiowned { // make sure they're an owner if (ownerIndex == 0) return; - var pending = m_pending[_operation]; + PendingState pending = m_pending[_operation]; // if we're not yet working on this operation, switch over and reset the confirmation status. if (pending.yetNeeded == 0) { // reset count of confirmations needed. @@ -319,7 +319,7 @@ contract daylimit is multiowned { return false; } // determines today's index. - function today() private constant returns (uint) { return now / 1 days; } + function today() private view returns (uint) { return now / 1 days; } // FIELDS @@ -451,6 +451,7 @@ protected: bytes args = encodeArgs(u256(0x60), _required, _dailyLimit, u256(_owners.size()), _owners); sendMessage(*s_compiledWallet + args, true, _value); + BOOST_REQUIRE(m_transactionSuccessful); BOOST_REQUIRE(!m_output.empty()); } }; diff --git a/test/liblll/EndToEndTest.cpp b/test/liblll/EndToEndTest.cpp index fd8099f2..ceaf450e 100644 --- a/test/liblll/EndToEndTest.cpp +++ b/test/liblll/EndToEndTest.cpp @@ -50,6 +50,7 @@ BOOST_AUTO_TEST_CASE(bare_panic) { char const* sourceCode = "(panic)"; compileAndRunWithoutCheck(sourceCode); + BOOST_REQUIRE(!m_transactionSuccessful); BOOST_REQUIRE(m_output.empty()); } @@ -57,6 +58,7 @@ BOOST_AUTO_TEST_CASE(panic) { char const* sourceCode = "{ (panic) }"; compileAndRunWithoutCheck(sourceCode); + BOOST_REQUIRE(!m_transactionSuccessful); BOOST_REQUIRE(m_output.empty()); } @@ -69,6 +71,7 @@ BOOST_AUTO_TEST_CASE(macro_zeroarg) (zeroarg))) )"; compileAndRun(sourceCode); + BOOST_CHECK(m_transactionSuccessful); BOOST_CHECK(callFallback() == encodeArgs(u256(0x1234))); } diff --git a/test/libsolidity/ABIDecoderTests.cpp b/test/libsolidity/ABIDecoderTests.cpp index c122d806..b4f829ca 100644 --- a/test/libsolidity/ABIDecoderTests.cpp +++ b/test/libsolidity/ABIDecoderTests.cpp @@ -266,7 +266,6 @@ BOOST_AUTO_TEST_CASE(calldata_arrays_too_large) } } )"; - bool newEncoder = false; BOTH_ENCODERS( compileAndRun(sourceCode); bytes args = encodeArgs( @@ -275,9 +274,8 @@ BOOST_AUTO_TEST_CASE(calldata_arrays_too_large) ); ABI_CHECK( callContractFunction("f(uint256,uint256[],uint256)", args), - newEncoder ? encodeArgs() : encodeArgs(7) + encodeArgs() ); - newEncoder = true; ) } @@ -374,7 +372,7 @@ BOOST_AUTO_TEST_CASE(decode_function_type_array) } // uses "decode from memory" function test1_dynamic() public returns (uint) { - var x = new function() external returns (uint)[](3); + function () external returns (uint)[] memory x = new function() external returns (uint)[](4); x[0] = this.f1; x[1] = this.f2; x[2] = this.f3; @@ -387,7 +385,7 @@ BOOST_AUTO_TEST_CASE(decode_function_type_array) } // uses "decode from calldata" function test2_dynamic() public returns (uint) { - var x = new function() external returns (uint)[](3); + function () external returns (uint)[] memory x = new function() external returns (uint)[](3); x[0] = this.f1; x[1] = this.f2; x[2] = this.f3; @@ -449,13 +447,11 @@ BOOST_AUTO_TEST_CASE(short_input_value_type) function f(uint a, uint b) public pure returns (uint) { return a; } } )"; - bool newDecoder = false; BOTH_ENCODERS( compileAndRun(sourceCode); ABI_CHECK(callContractFunction("f(uint256,uint256)", 1, 2), encodeArgs(1)); ABI_CHECK(callContractFunctionNoEncoding("f(uint256,uint256)", bytes(64, 0)), encodeArgs(0)); - ABI_CHECK(callContractFunctionNoEncoding("f(uint256,uint256)", bytes(63, 0)), newDecoder ? encodeArgs() : encodeArgs(0)); - newDecoder = true; + ABI_CHECK(callContractFunctionNoEncoding("f(uint256,uint256)", bytes(63, 0)), encodeArgs()); ) } @@ -466,15 +462,13 @@ BOOST_AUTO_TEST_CASE(short_input_array) function f(uint[] a) public pure returns (uint) { return 7; } } )"; - bool newDecoder = false; BOTH_ENCODERS( compileAndRun(sourceCode); ABI_CHECK(callContractFunctionNoEncoding("f(uint256[])", encodeArgs(0x20, 0)), encodeArgs(7)); - ABI_CHECK(callContractFunctionNoEncoding("f(uint256[])", encodeArgs(0x20, 1)), newDecoder ? encodeArgs() : encodeArgs(7)); - ABI_CHECK(callContractFunctionNoEncoding("f(uint256[])", encodeArgs(0x20, 1) + bytes(31, 0)), newDecoder ? encodeArgs() : encodeArgs(7)); + ABI_CHECK(callContractFunctionNoEncoding("f(uint256[])", encodeArgs(0x20, 1)), encodeArgs()); + ABI_CHECK(callContractFunctionNoEncoding("f(uint256[])", encodeArgs(0x20, 1) + bytes(31, 0)), encodeArgs()); ABI_CHECK(callContractFunctionNoEncoding("f(uint256[])", encodeArgs(0x20, 1) + bytes(32, 0)), encodeArgs(7)); ABI_CHECK(callContractFunctionNoEncoding("f(uint256[])", encodeArgs(0x20, 2, 5, 6)), encodeArgs(7)); - newDecoder = true; ) } @@ -558,7 +552,7 @@ BOOST_AUTO_TEST_CASE(storage_ptr) r[2] = 3; s.x = 11; s.y = 12; - var (a, b, c, d) = L.f(r, s); + (uint a, uint b, uint c, uint d) = L.f(r, s); return (r[2], s.x, a, b, c, d); } } diff --git a/test/libsolidity/ASTLegacyJSON.cpp b/test/libsolidity/ASTLegacyJSON.cpp index 13148682..cd8384ea 100644 --- a/test/libsolidity/ASTLegacyJSON.cpp +++ b/test/libsolidity/ASTLegacyJSON.cpp @@ -252,7 +252,7 @@ BOOST_AUTO_TEST_CASE(function_type) CompilerStack c; c.addSource("a", "contract C { function f(function() external payable returns (uint) x) " - "returns (function() external constant returns (uint)) {} }" + "returns (function() external view returns (uint)) {} }" ); c.setEVMVersion(dev::test::Options::get().evmVersion()); c.parseAndAnalyze(); diff --git a/test/libsolidity/GasMeter.cpp b/test/libsolidity/GasMeter.cpp index 42965582..a404c072 100644 --- a/test/libsolidity/GasMeter.cpp +++ b/test/libsolidity/GasMeter.cpp @@ -87,6 +87,7 @@ public: for (bytes const& arguments: _argumentVariants) { sendMessage(hash.asBytes() + arguments, false, 0); + BOOST_CHECK(m_transactionSuccessful); gasUsed = max(gasUsed, m_gasUsed); gas = max(gas, gasForTransaction(hash.asBytes() + arguments, false)); } @@ -315,7 +316,7 @@ BOOST_AUTO_TEST_CASE(complex_control_flow) // we previously considered. This of course reduces accuracy. char const* sourceCode = R"( contract log { - function ln(int128 x) constant returns (int128 result) { + function ln(int128 x) pure returns (int128 result) { int128 t = x / 256; int128 y = 5545177; x = t; diff --git a/test/libsolidity/SolidityABIJSON.cpp b/test/libsolidity/SolidityABIJSON.cpp index a3ebd139..6994a290 100644 --- a/test/libsolidity/SolidityABIJSON.cpp +++ b/test/libsolidity/SolidityABIJSON.cpp @@ -306,62 +306,6 @@ BOOST_AUTO_TEST_CASE(view_function) checkInterface(sourceCode, interface); } -// constant is an alias to view above -BOOST_AUTO_TEST_CASE(constant_function) -{ - char const* sourceCode = R"( - contract test { - function foo(uint a, uint b) returns(uint d) { return a + b; } - function boo(uint32 a) constant returns(uint b) { return a * 4; } - } - )"; - - char const* interface = R"([ - { - "name": "foo", - "constant": false, - "payable" : false, - "stateMutability": "nonpayable", - "type": "function", - "inputs": [ - { - "name": "a", - "type": "uint256" - }, - { - "name": "b", - "type": "uint256" - } - ], - "outputs": [ - { - "name": "d", - "type": "uint256" - } - ] - }, - { - "name": "boo", - "constant": true, - "payable" : false, - "stateMutability": "view", - "type": "function", - "inputs": [{ - "name": "a", - "type": "uint32" - }], - "outputs": [ - { - "name": "b", - "type": "uint256" - } - ] - } - ])"; - - checkInterface(sourceCode, interface); -} - BOOST_AUTO_TEST_CASE(pure_function) { char const* sourceCode = R"( diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 889c68b9..9e6aa43d 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -49,6 +49,25 @@ namespace test BOOST_FIXTURE_TEST_SUITE(SolidityEndToEndTest, SolidityExecutionFramework) +BOOST_AUTO_TEST_CASE(transaction_status) +{ + char const* sourceCode = R"( + contract test { + function f() { } + function g() { revert(); } + function h() { assert(false); } + } + )"; + compileAndRun(sourceCode); + callContractFunction("f()"); + BOOST_CHECK(m_transactionSuccessful); + callContractFunction("g()"); + BOOST_CHECK(!m_transactionSuccessful); + callContractFunction("h()"); + BOOST_CHECK(!m_transactionSuccessful); +} + + BOOST_AUTO_TEST_CASE(smoke_test) { char const* sourceCode = R"( @@ -305,7 +324,7 @@ BOOST_AUTO_TEST_CASE(conditional_expression_functions) function y() returns (uint) { return 2; } function f(bool cond) returns (uint) { - var z = cond ? x : y; + function () returns (uint) z = cond ? x : y; return z(); } } @@ -433,7 +452,7 @@ BOOST_AUTO_TEST_CASE(while_loop) contract test { function f(uint n) returns(uint nfac) { nfac = 1; - var i = 2; + uint i = 2; while (i <= n) nfac *= i++; } } @@ -460,7 +479,7 @@ BOOST_AUTO_TEST_CASE(do_while_loop) contract test { function f(uint n) returns(uint nfac) { nfac = 1; - var i = 2; + uint i = 2; do { nfac *= i++; } while (i <= n); } } @@ -561,7 +580,8 @@ BOOST_AUTO_TEST_CASE(for_loop) contract test { function f(uint n) returns(uint nfac) { nfac = 1; - for (var i = 2; i <= n; i++) + uint i; + for (i = 2; i <= n; i++) nfac *= i; } } @@ -735,7 +755,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) { - var a = 0x1; var b = 0x10; var c = 0x100; + uint8 a = 0x1; uint8 b = 0x10; uint16 c = 0x100; y = a + b + c + x1 + x2 + x3; y += b + x2; } @@ -1252,7 +1272,7 @@ BOOST_AUTO_TEST_CASE(struct_reference) } function set() { data.z = 2; - var map = data.recursive; + mapping(uint8 => s2) map = data.recursive; s2 inner = map[0]; inner.z = 3; inner.recursive[0].z = inner.recursive[1].z + 1; @@ -1836,8 +1856,7 @@ BOOST_AUTO_TEST_CASE(uncalled_blockhash) contract C { function f() public view returns (bytes32) { - var x = block.blockhash; - return x(block.number - 1); + return (block.blockhash)(block.number - 1); } } )"; @@ -2061,7 +2080,7 @@ BOOST_AUTO_TEST_CASE(packed_keccak256) char const* sourceCode = R"( contract test { function a(bytes32 input) returns (bytes32 hash) { - var b = 65536; + uint24 b = 65536; uint c = 256; return keccak256(abi.encodePacked(8, input, b, input, c)); } @@ -2113,7 +2132,7 @@ BOOST_AUTO_TEST_CASE(packed_sha256) char const* sourceCode = R"( contract test { function a(bytes32 input) returns (bytes32 hash) { - var b = 65536; + uint24 b = 65536; uint c = 256; return sha256(abi.encodePacked(8, input, b, input, c)); } @@ -2140,7 +2159,7 @@ BOOST_AUTO_TEST_CASE(packed_ripemd160) char const* sourceCode = R"( contract test { function a(bytes32 input) returns (bytes32 hash) { - var b = 65536; + uint24 b = 65536; uint c = 256; return ripemd160(abi.encodePacked(8, input, b, input, c)); } @@ -2319,9 +2338,8 @@ BOOST_AUTO_TEST_CASE(inter_contract_calls_with_local_vars) contract Main { Helper h; function callHelper(uint a, uint b) returns (uint c) { - var fu = h.multiply; - var y = 9; - var ret = fu(a, b); + uint8 y = 9; + uint256 ret = h.multiply(a, b); return ret + y; } function getHelper() returns (address haddress) { @@ -2568,10 +2586,8 @@ BOOST_AUTO_TEST_CASE(value_complex) helper h; constructor() payable { h = new helper(); } function sendAmount(uint amount) payable returns (uint256 bal) { - var x1 = h.getBalance.value(amount); uint someStackElement = 20; - var x2 = x1.gas(1000); - return x2.value(amount + 3)();// overwrite value + return h.getBalance.value(amount).gas(1000).value(amount + 3)(); } } )"; @@ -2591,10 +2607,7 @@ BOOST_AUTO_TEST_CASE(value_insane) helper h; constructor() payable { h = new helper(); } function sendAmount(uint amount) returns (uint256 bal) { - var x1 = h.getBalance.value; - var x2 = x1(amount).gas; - var x3 = x2(1000).value; - return x3(amount + 3)();// overwrite value + return h.getBalance.value(amount).gas(1000).value(amount + 3)();// overwrite value } } )"; @@ -2797,7 +2810,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_local_variables) { char const* sourceCode = R"( contract C { - modifier mod1 { var a = 1; var b = 2; _; } + 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; } } @@ -2811,7 +2824,7 @@ BOOST_AUTO_TEST_CASE(function_modifier_loop) { char const* sourceCode = R"( contract C { - modifier repeat(uint count) { for (var i = 0; i < count; ++i) _; } + modifier repeat(uint count) { uint i; for (i = 0; i < count; ++i) _; } function f() repeat(10) returns (uint r) { r += 1; } } )"; @@ -2989,8 +3002,7 @@ BOOST_AUTO_TEST_CASE(crazy_elementary_typenames_on_stack) function f() returns (uint r) { uint; uint; uint; uint; int x = -7; - var a = uint; - return a(x); + return uint(x); } } )"; @@ -3088,9 +3100,11 @@ BOOST_AUTO_TEST_CASE(short_data_calls_fallback) compileAndRun(sourceCode); // should call fallback sendMessage(asBytes("\xd8\x8e\x0b"), false, 0); + BOOST_CHECK(m_transactionSuccessful); ABI_CHECK(callContractFunction("x()"), encodeArgs(2)); // should call function sendMessage(asBytes(string("\xd8\x8e\x0b") + string(1, 0)), false, 0); + BOOST_CHECK(m_transactionSuccessful); ABI_CHECK(callContractFunction("x()"), encodeArgs(3)); } @@ -3775,6 +3789,7 @@ BOOST_AUTO_TEST_CASE(bytes_from_calldata_to_memory) compileAndRun(sourceCode); bytes calldata1 = FixedHash<4>(dev::keccak256("f()")).asBytes() + bytes(61, 0x22) + bytes(12, 0x12); sendMessage(calldata1, false); + BOOST_CHECK(m_transactionSuccessful); BOOST_CHECK(m_output == encodeArgs(dev::keccak256(bytes{'a', 'b', 'c'} + calldata1))); } @@ -3910,7 +3925,8 @@ BOOST_AUTO_TEST_CASE(copy_from_calldata_removes_bytes_data) ABI_CHECK(callContractFunction("set()", 1, 2, 3, 4, 5), encodeArgs(true)); BOOST_CHECK(!storageEmpty(m_contractAddress)); sendMessage(bytes(), false); - BOOST_CHECK(m_output == bytes()); + BOOST_CHECK(m_transactionSuccessful); + BOOST_CHECK(m_output.empty()); BOOST_CHECK(storageEmpty(m_contractAddress)); } @@ -4056,7 +4072,7 @@ BOOST_AUTO_TEST_CASE(struct_copy_via_local) function test() returns (bool) { data1.a = 1; data1.b = 2; - var x = data1; + Struct memory x = data1; data2 = x; return data2.a == data1.a && data2.b == data1.b; } @@ -6227,6 +6243,7 @@ BOOST_AUTO_TEST_CASE(evm_exceptions_in_constructor_out_of_baund) } )"; ABI_CHECK(compileAndRunWithoutCheck(sourceCode, 0, "A"), encodeArgs()); + BOOST_CHECK(!m_transactionSuccessful); } BOOST_AUTO_TEST_CASE(positive_integers_to_signed) @@ -6279,7 +6296,7 @@ BOOST_AUTO_TEST_CASE(send_zero_ether) contract Main { constructor() payable {} function s() returns (bool) { - var r = new Receiver(); + Receiver r = new Receiver(); return r.send(0); } } @@ -6562,7 +6579,7 @@ BOOST_AUTO_TEST_CASE(bytes_in_constructors_packer) } contract Creator { function f(uint x, bytes s) returns (uint r, byte ch) { - var c = new Main(s, x); + Main c = new Main(s, x); r = c.m_x(); ch = c.part(x); } @@ -6601,7 +6618,7 @@ BOOST_AUTO_TEST_CASE(arrays_in_constructors) } contract Creator { function f(uint x, address[] s) returns (uint r, address ch) { - var c = new Main(s, x); + Main c = new Main(s, x); r = c.m_x(); ch = c.part(x); } @@ -7353,8 +7370,8 @@ BOOST_AUTO_TEST_CASE(constant_string_literal) string constant public x = "abefghijklmnopqabcdefghijklmnopqabcdefghijklmnopqabca"; constructor() { - var xx = x; - var bb = b; + string memory xx = x; + bytes32 bb = b; } function getB() returns (bytes32) { return b; } function getX() returns (string) { return x; } @@ -7445,7 +7462,7 @@ BOOST_AUTO_TEST_CASE(cross_contract_types) contract Lib { struct S {uint a; uint b; } } contract Test { function f() returns (uint r) { - var x = Lib.S({a: 2, b: 3}); + Lib.S memory x = Lib.S({a: 2, b: 3}); r = x.b; } } @@ -7530,7 +7547,7 @@ BOOST_AUTO_TEST_CASE(fixed_arrays_as_return_type) contract B { function f() returns (uint16[5] res, uint16[5] res2) { - var a = new A(); + A a = new A(); res = a.f(2); res2 = a.f(1000); } @@ -7813,13 +7830,13 @@ BOOST_AUTO_TEST_CASE(multi_variable_declaration) a = 1; b = 2; c = 3; } function f() returns (bool) { - var (x, y, z) = g(); + (uint x, uint y, uint z) = g(); if (x != 1 || y != 2 || z != 3) return false; - var (, a,) = g(); + (, uint a,) = g(); if (a != 2) return false; - var (b,) = g(); + (uint b,) = g(); if (b != 1) return false; - var (,c) = g(); + (, uint c) = g(); if (c != 3) return false; return true; } @@ -8021,11 +8038,11 @@ BOOST_AUTO_TEST_CASE(create_memory_array) contract C { struct S { uint[2] a; bytes b; } function f() returns (byte, uint, uint, byte) { - var x = new bytes(200); + bytes memory x = new bytes(200); x[199] = 'A'; - var y = new uint[2][](300); + uint[2][] memory y = new uint[2][](300); y[203][1] = 8; - var z = new S[](180); + S[] memory z = new S[](180); z[170].a[1] = 4; z[170].b = new bytes(102); z[170].b[99] = 'B'; @@ -8315,8 +8332,7 @@ BOOST_AUTO_TEST_CASE(bound_function_in_var) D.s public x; function f(uint a) returns (uint) { x.a = 6; - var g = x.mul; - return g({x: a}); + return (x.mul)({x: a}); } } )"; @@ -9104,7 +9120,7 @@ BOOST_AUTO_TEST_CASE(skip_dynamic_types) } function g() returns (uint, uint) { // Previous implementation "moved" b to the second place and did not skip. - var (a, _, b) = this.f(); + (uint a,, uint b) = this.f(); return (a, b); } } @@ -9130,7 +9146,7 @@ BOOST_AUTO_TEST_CASE(skip_dynamic_types_for_structs) s.a = "abc"; s.b = [7, 8, 9]; s.y = 6; - var (x, a, y) = this.s(); + (uint x,, uint y) = this.s(); return (x, y); } } @@ -9172,7 +9188,7 @@ BOOST_AUTO_TEST_CASE(create_dynamic_array_with_zero_length) char const* sourceCode = R"( contract C { function f() returns (uint) { - var a = new uint[][](0); + uint[][] memory a = new uint[][](0); return 7; } } @@ -10023,7 +10039,7 @@ BOOST_AUTO_TEST_CASE(function_delete_stack) contract C { function a() returns (uint) { return 7; } function test() returns (uint) { - var y = a; + function () returns (uint) y = a; delete y; y(); } @@ -10061,7 +10077,7 @@ BOOST_AUTO_TEST_CASE(function_array_cross_calls) char const* sourceCode = R"( contract D { function f(function() external returns (function() external returns (uint))[] x) - returns (function() external returns (uint)[3] r) + public returns (function() external returns (uint)[3] r) { r[0] = x[0](); r[1] = x[1](); @@ -10069,23 +10085,23 @@ BOOST_AUTO_TEST_CASE(function_array_cross_calls) } } contract C { - function test() returns (uint, uint, uint) { + function test() public returns (uint, uint, uint) { function() external returns (function() external returns (uint))[] memory x = new function() external returns (function() external returns (uint))[](10); for (uint i = 0; i < x.length; i ++) x[i] = this.h; x[0] = this.htwo; - var y = (new D()).f(x); + function() external returns (uint)[3] memory y = (new D()).f(x); return (y[0](), y[1](), y[2]()); } - function e() returns (uint) { return 5; } - function f() returns (uint) { return 6; } - function g() returns (uint) { return 7; } + function e() public returns (uint) { return 5; } + function f() public returns (uint) { return 6; } + function g() public returns (uint) { return 7; } uint counter; - function h() returns (function() external returns (uint)) { + function h() public returns (function() external returns (uint)) { return counter++ == 0 ? this.f : this.g; } - function htwo() returns (function() external returns (uint)) { + function htwo() public returns (function() external returns (uint)) { return this.e; } } @@ -11214,7 +11230,7 @@ BOOST_AUTO_TEST_CASE(bubble_up_error_messages_through_create) } contract D { function f() public { - var x = new E(); + E x = new E(); } } contract C { @@ -11490,8 +11506,7 @@ BOOST_AUTO_TEST_CASE(function_types_sig) } function h() returns (bytes4) { function () pure external returns (bytes4) fun = this.f; - var funvar = fun; - return funvar.selector; + return fun.selector; } function i() pure returns (bytes4) { return this.x.selector; @@ -11723,8 +11738,8 @@ BOOST_AUTO_TEST_CASE(snark) Pairing.G1Point memory p2; p1.X = 1; p1.Y = 2; p2.X = 1; p2.Y = 2; - var explict_sum = Pairing.add(p1, p2); - var scalar_prod = Pairing.mul(p1, 2); + Pairing.G1Point memory explict_sum = Pairing.add(p1, p2); + Pairing.G1Point memory scalar_prod = Pairing.mul(p1, 2); return (explict_sum.X == scalar_prod.X && explict_sum.Y == scalar_prod.Y); } diff --git a/test/libsolidity/SolidityExpressionCompiler.cpp b/test/libsolidity/SolidityExpressionCompiler.cpp index 5d5fb218..2668dfdf 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() { var x = true; } + function f() { bool x = true; } } )"; bytes code = compileFirstExpression(sourceCode); @@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE(literal_false) { char const* sourceCode = R"( contract test { - function f() { var x = false; } + function f() { bool x = false; } } )"; bytes code = compileFirstExpression(sourceCode); @@ -201,7 +201,7 @@ BOOST_AUTO_TEST_CASE(int_literal) { char const* sourceCode = R"( contract test { - function f() { var x = 0x12345678901234567890; } + function f() { uint x = 0x12345678901234567890; } } )"; bytes code = compileFirstExpression(sourceCode); @@ -216,7 +216,7 @@ BOOST_AUTO_TEST_CASE(int_with_wei_ether_subdenomination) char const* sourceCode = R"( contract test { constructor() { - var x = 1 wei; + uint x = 1 wei; } } )"; @@ -230,8 +230,8 @@ BOOST_AUTO_TEST_CASE(int_with_szabo_ether_subdenomination) { char const* sourceCode = R"( contract test { - constructor() { - var x = 1 szabo; + function test () { + uint x = 1 szabo; } } )"; @@ -247,7 +247,7 @@ BOOST_AUTO_TEST_CASE(int_with_finney_ether_subdenomination) contract test { constructor() { - var x = 1 finney; + uint x = 1 finney; } } )"; @@ -262,7 +262,7 @@ BOOST_AUTO_TEST_CASE(int_with_ether_ether_subdenomination) char const* sourceCode = R"( contract test { constructor() { - var x = 1 ether; + uint x = 1 ether; } } )"; @@ -276,7 +276,7 @@ BOOST_AUTO_TEST_CASE(comparison) { char const* sourceCode = R"( contract test { - function f() { var x = (0x10aa < 0x11aa) != true; } + function f() { bool x = (0x10aa < 0x11aa) != true; } } )"; bytes code = compileFirstExpression(sourceCode); @@ -294,7 +294,7 @@ BOOST_AUTO_TEST_CASE(short_circuiting) { char const* sourceCode = R"( contract test { - function f() { var x = true != (4 <= 8 + 10 || 9 != 2); } + function f() { bool x = true != (4 <= 8 + 10 || 9 != 2); } } )"; bytes code = compileFirstExpression(sourceCode); @@ -490,7 +490,7 @@ BOOST_AUTO_TEST_CASE(intermediately_overflowing_literals) // have been applied char const* sourceCode = R"( contract test { - function f() { var x = (0x00ffffffffffffffffffffffffffffffffffffffff * 0xffffffffffffffffffffffffff01) & 0xbf; } + function f() { uint8 x = (0x00ffffffffffffffffffffffffffffffffffffffff * 0xffffffffffffffffffffffffff01) & 0xbf; } } )"; bytes code = compileFirstExpression(sourceCode); diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 153a7afb..ff0a45f0 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -352,16 +352,16 @@ BOOST_AUTO_TEST_CASE(dynamic_return_types_not_possible) contract C { function f(uint) public returns (string); function g() public { - var x = this.f(2); + string memory x = this.f(2); // we can assign to x but it is not usable. bytes(x).length; } } )"; if (dev::test::Options::get().evmVersion() == EVMVersion::homestead()) - CHECK_ERROR(sourceCode, TypeError, "Explicit type conversion not allowed from \"inaccessible dynamic type\" to \"bytes storage pointer\"."); + CHECK_ERROR(sourceCode, TypeError, "Type inaccessible dynamic type is not implicitly convertible to expected type string memory."); else - CHECK_WARNING(sourceCode, "Use of the \"var\" keyword is deprecated"); + CHECK_SUCCESS_NO_WARNINGS(sourceCode); } BOOST_AUTO_TEST_CASE(warn_nonpresent_pragma) diff --git a/test/libsolidity/SolidityOptimizer.cpp b/test/libsolidity/SolidityOptimizer.cpp index 805c8602..04d9ee16 100644 --- a/test/libsolidity/SolidityOptimizer.cpp +++ b/test/libsolidity/SolidityOptimizer.cpp @@ -246,7 +246,7 @@ BOOST_AUTO_TEST_CASE(storage_write_in_loops) contract test { uint d; function f(uint a) returns (uint r) { - var x = d; + uint x = d; for (uint i = 1; i < a * a; i++) { r = d; d = i; diff --git a/test/libsolidity/syntaxTests/constructor/constructor_no_visibility.sol b/test/libsolidity/syntaxTests/constructor/constructor_no_visibility.sol index f8820fdc..88553084 100644 --- a/test/libsolidity/syntaxTests/constructor/constructor_no_visibility.sol +++ b/test/libsolidity/syntaxTests/constructor/constructor_no_visibility.sol @@ -1,3 +1,3 @@ contract A { constructor() {} } // ---- -// Warning: (13-29): No visibility specified. Defaulting to "public". +// Warning: (13-29): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol index 15ed0e1e..78272c98 100644 --- a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol +++ b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol @@ -1,13 +1,9 @@ contract test1 { - constructor() constant {} -} -contract test2 { constructor() view {} } -contract test3 { +contract test2 { constructor() pure {} } // ---- -// TypeError: (19-44): Constructor must be payable or non-payable, but is "view". -// TypeError: (66-87): Constructor must be payable or non-payable, but is "view". -// TypeError: (109-130): Constructor must be payable or non-payable, but is "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". diff --git a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol index 6dbcbc97..1ceaffee 100644 --- a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol +++ b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol @@ -1,16 +1,11 @@ contract test1 { - function test1() constant {} + function test1() view {} } contract test2 { - function test2() view {} -} -contract test3 { - function test3() pure {} + function test2() pure {} } // ---- -// Warning: (21-49): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead. -// Warning: (73-97): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead. -// Warning: (121-145): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead. -// TypeError: (21-49): Constructor must be payable or non-payable, but is "view". -// TypeError: (73-97): Constructor must be payable or non-payable, but is "view". -// TypeError: (121-145): Constructor must be payable or non-payable, but is "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". diff --git a/test/libsolidity/syntaxTests/fallback/default_visibility.sol b/test/libsolidity/syntaxTests/fallback/default_visibility.sol index 2cb0af90..f45bbd3c 100644 --- a/test/libsolidity/syntaxTests/fallback/default_visibility.sol +++ b/test/libsolidity/syntaxTests/fallback/default_visibility.sol @@ -3,4 +3,4 @@ contract C { function() {} } // ---- -// Warning: (90-103): No visibility specified. Defaulting to "public". +// Warning: (90-103): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/040_functions_with_different_structs_in_interface.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/040_functions_with_different_structs_in_interface.sol index 2af584b7..1689e6f5 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/040_functions_with_different_structs_in_interface.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/040_functions_with_different_structs_in_interface.sol @@ -3,10 +3,8 @@ pragma experimental ABIEncoderV2; contract C { struct S1 { function() external a; } struct S2 { bytes24 a; } - 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. -// Warning: (122-144): No visibility specified. Defaulting to "public". -// Warning: (149-171): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/124_enum_member_access.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/124_enum_member_access.sol index 3fd7a0cb..98bc8e66 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/124_enum_member_access.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/124_enum_member_access.sol @@ -1,10 +1,8 @@ contract test { enum ActionChoices { GoLeft, GoRight, GoStraight, Sit } - constructor() + constructor() public { choices = ActionChoices.GoStraight; } ActionChoices choices; } -// ---- -// Warning: (80-149): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/239_multi_variable_declaration_wildcards_fine.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/239_multi_variable_declaration_wildcards_fine.sol index ae260ce4..0da5c7ee 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/239_multi_variable_declaration_wildcards_fine.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/239_multi_variable_declaration_wildcards_fine.sol @@ -1,7 +1,7 @@ contract C { function three() public returns (uint, uint, uint); function two() public returns (uint, uint); - function none(); + function none() public; function f() public { (uint a,) = three(); (uint b, uint c,) = two(); @@ -13,8 +13,7 @@ contract C { } } // ---- -// Warning: (172-191): Different number of components on the left hand side (2) than on the right hand side (3). -// Warning: (201-226): Different number of components on the left hand side (3) than on the right hand side (2). -// Warning: (236-255): Different number of components on the left hand side (2) than on the right hand side (3). -// Warning: (265-290): Different number of components on the left hand side (3) than on the right hand side (2). -// Warning: (121-137): No visibility specified. Defaulting to "public". +// Warning: (179-198): Different number of components on the left hand side (2) than on the right hand side (3). +// Warning: (208-233): Different number of components on the left hand side (3) than on the right hand side (2). +// Warning: (243-262): Different number of components on the left hand side (2) than on the right hand side (3). +// Warning: (272-297): Different number of components on the left hand side (3) than on the right hand side (2). diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/268_function_overload_array_type.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/268_function_overload_array_type.sol index 0ff1ed75..97e68aa3 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/268_function_overload_array_type.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/268_function_overload_array_type.sol @@ -1,7 +1,4 @@ - contract M { - function f(uint[]); - function f(int[]); - } -// ---- -// Warning: (25-44): No visibility specified. Defaulting to "public". -// Warning: (53-71): No visibility specified. Defaulting to "public". +contract M { + function f(uint[]) public; + function f(int[]) public; +} diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/275_inline_struct_declaration_arrays.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/275_inline_struct_declaration_arrays.sol index e69c2934..bdf033a3 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/275_inline_struct_declaration_arrays.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/275_inline_struct_declaration_arrays.sol @@ -3,11 +3,10 @@ contract C { uint a; string b; } - function f() { + function f() public { S[2] memory x = [S({a: 1, b: "fish"}), S({a: 2, b: "fish"})]; } } // ---- -// Warning: (72-162): No visibility specified. Defaulting to "public". -// Warning: (95-108): Unused local variable. -// Warning: (72-162): Function state mutability can be restricted to pure +// Warning: (102-115): Unused local variable. +// Warning: (72-169): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/403_return_structs.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/403_return_structs.sol index 5583dbff..8af8098c 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/403_return_structs.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/403_return_structs.sol @@ -2,10 +2,9 @@ pragma experimental ABIEncoderV2; contract C { struct S { uint a; T[] sub; } struct T { uint[] x; } - function f() returns (uint, S) { + function f() public returns (uint, S) { } } // ---- // Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments. -// Warning: (112-150): No visibility specified. Defaulting to "public". -// Warning: (112-150): Function state mutability can be restricted to pure +// Warning: (112-157): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/423_using_interface.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/423_using_interface.sol index f06ffa62..d576bb60 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/423_using_interface.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/423_using_interface.sol @@ -1,10 +1,8 @@ interface I { - function f(); + function f() external; } contract C is I { function f() public { } } // ---- -// Warning: (18-31): Functions in interfaces should be declared external. -// Warning: (18-31): No visibility specified. Defaulting to "public". In interfaces it defaults to external. diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/535_address_overload_resolution.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/535_address_overload_resolution.sol index 35f4639e..157ea36b 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/535_address_overload_resolution.sol +++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/535_address_overload_resolution.sol @@ -1,21 +1,18 @@ contract C { - function balance() returns (uint) { + function balance() public returns (uint) { this.balance; // to avoid pureness warning return 1; } - function transfer(uint amount) { + function transfer(uint amount) public { address(this).transfer(amount); // to avoid pureness warning } } contract D { - function f() { + function f() public { uint x = (new C()).balance(); x; (new C()).transfer(5); } } // ---- -// Warning: (17-127): No visibility specified. Defaulting to "public". -// Warning: (132-239): No visibility specified. Defaulting to "public". -// Warning: (259-359): No visibility specified. Defaulting to "public". -// Warning: (17-127): Function state mutability can be restricted to view +// Warning: (17-134): Function state mutability can be restricted to view diff --git a/test/libsolidity/syntaxTests/parsing/calling_function.sol b/test/libsolidity/syntaxTests/parsing/calling_function.sol index 4c4fc1fc..9e88c451 100644 --- a/test/libsolidity/syntaxTests/parsing/calling_function.sol +++ b/test/libsolidity/syntaxTests/parsing/calling_function.sol @@ -1,9 +1,7 @@ contract test { - function f() { + function f() public { function() returns(function() returns(function() returns(function() returns(uint)))) x; uint y; y = x()()()(); } } -// ---- -// Warning: (20-175): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/parsing/conditional_multiple.sol b/test/libsolidity/syntaxTests/parsing/conditional_multiple.sol index c7d11ed6..0e348f5b 100644 --- a/test/libsolidity/syntaxTests/parsing/conditional_multiple.sol +++ b/test/libsolidity/syntaxTests/parsing/conditional_multiple.sol @@ -1,9 +1,8 @@ contract A { - function f() { + function f() public { uint x = 3 < 0 ? 2 > 1 ? 2 : 1 : 7 > 2 ? 7 : 6; } } // ---- -// Warning: (17-93): No visibility specified. Defaulting to "public". -// Warning: (40-46): Unused local variable. -// Warning: (17-93): Function state mutability can be restricted to pure +// Warning: (47-53): Unused local variable. +// Warning: (17-100): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol b/test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol index 90974e96..40aaa917 100644 --- a/test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol +++ b/test/libsolidity/syntaxTests/parsing/conditional_true_false_literal.sol @@ -1,11 +1,10 @@ contract A { - function f() { + function f() public { uint x = true ? 1 : 0; uint y = false ? 0 : 1; } } // ---- -// Warning: (17-100): No visibility specified. Defaulting to "public". -// Warning: (40-46): Unused local variable. -// Warning: (71-77): Unused local variable. -// Warning: (17-100): Function state mutability can be restricted to pure +// Warning: (47-53): Unused local variable. +// Warning: (78-84): Unused local variable. +// Warning: (17-107): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol b/test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol index 35da69c6..705fbadf 100644 --- a/test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol +++ b/test/libsolidity/syntaxTests/parsing/conditional_with_constants.sol @@ -1,11 +1,10 @@ contract A { - function f() { + function f() public { uint x = 3 > 0 ? 3 : 0; uint y = (3 > 0) ? 3 : 0; } } // ---- -// Warning: (17-103): No visibility specified. Defaulting to "public". -// Warning: (40-46): Unused local variable. -// Warning: (72-78): Unused local variable. -// Warning: (17-103): Function state mutability can be restricted to pure +// Warning: (47-53): Unused local variable. +// Warning: (79-85): Unused local variable. +// Warning: (17-110): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol b/test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol index eb4c7091..bbabf957 100644 --- a/test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol +++ b/test/libsolidity/syntaxTests/parsing/conditional_with_variables.sol @@ -1,5 +1,5 @@ contract A { - function f() { + function f() public { uint x = 3; uint y = 1; uint z = (x > y) ? x : y; @@ -7,7 +7,6 @@ contract A { } } // ---- -// Warning: (17-143): No visibility specified. Defaulting to "public". -// Warning: (80-86): Unused local variable. -// Warning: (114-120): Unused local variable. -// Warning: (17-143): Function state mutability can be restricted to pure +// Warning: (87-93): Unused local variable. +// Warning: (121-127): Unused local variable. +// Warning: (17-150): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol b/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol index da068351..8fddc988 100644 --- a/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol +++ b/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol @@ -1,7 +1,8 @@ contract C { uint s; - // this test should fail starting from 0.5.0 function f() public constant returns (uint) { return s; } } +// ---- +// ParserError: (43-51): The state mutability modifier "constant" was removed in version 0.5.0. Use "view" or "pure" instead. diff --git a/test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol b/test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol index 8be9667a..6d88669a 100644 --- a/test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol +++ b/test/libsolidity/syntaxTests/parsing/declaring_fixed_and_ufixed_variables.sol @@ -1,14 +1,13 @@ contract A { fixed40x40 storeMe; - function f(ufixed x, fixed32x32 y) { + function f(ufixed x, fixed32x32 y) public { ufixed8x8 a; fixed b; } } // ---- -// Warning: (41-121): No visibility specified. Defaulting to "public". // Warning: (52-60): Unused function parameter. Remove or comment out the variable name to silence this warning. // Warning: (62-74): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (86-97): Unused local variable. -// Warning: (107-114): Unused local variable. -// Warning: (41-121): Function state mutability can be restricted to pure +// Warning: (93-104): Unused local variable. +// Warning: (114-121): Unused local variable. +// Warning: (41-128): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/else_if_statement.sol b/test/libsolidity/syntaxTests/parsing/else_if_statement.sol index 37763697..c2a1aaeb 100644 --- a/test/libsolidity/syntaxTests/parsing/else_if_statement.sol +++ b/test/libsolidity/syntaxTests/parsing/else_if_statement.sol @@ -1,8 +1,7 @@ contract test { - function fun(uint256 a) returns (uint8 b) { + function fun(uint256 a) public returns (uint8 b) { if (a < 0) b = 0x67; else if (a == 0) b = 0x12; else b = 0x78; } } // ---- -// Warning: (20-140): No visibility specified. Defaulting to "public". -// Warning: (20-140): Function state mutability can be restricted to pure +// Warning: (20-147): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/empty_function.sol b/test/libsolidity/syntaxTests/parsing/empty_function.sol index 218fd9a7..320a0bcc 100644 --- a/test/libsolidity/syntaxTests/parsing/empty_function.sol +++ b/test/libsolidity/syntaxTests/parsing/empty_function.sol @@ -1,10 +1,9 @@ contract test { uint256 stateVar; - function functionName(bytes20 arg1, address addr) view returns (int id) { } + function functionName(bytes20 arg1, address addr) public view returns (int id) { } } // ---- -// Warning: (36-111): No visibility specified. Defaulting to "public". // Warning: (58-70): Unused function parameter. Remove or comment out the variable name to silence this warning. // Warning: (72-84): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (100-106): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (36-111): Function state mutability can be restricted to pure +// Warning: (107-113): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (36-118): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol b/test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol index 602c26ed..606f59d7 100644 --- a/test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol +++ b/test/libsolidity/syntaxTests/parsing/enum_valid_declaration.sol @@ -1,9 +1,7 @@ contract c { enum validEnum { Value1, Value2, Value3, Value4 } - constructor() { + constructor() public { a = validEnum.Value3; } validEnum a; } -// ---- -// Warning: (71-122): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/parsing/exp_expression.sol b/test/libsolidity/syntaxTests/parsing/exp_expression.sol index cdabb996..6b307ea0 100644 --- a/test/libsolidity/syntaxTests/parsing/exp_expression.sol +++ b/test/libsolidity/syntaxTests/parsing/exp_expression.sol @@ -1,9 +1,8 @@ contract test { - function fun(uint256 a) { + function fun(uint256 a) public { uint256 x = 3 ** a; } } // ---- -// Warning: (20-79): No visibility specified. Defaulting to "public". -// Warning: (54-63): Unused local variable. -// Warning: (20-79): Function state mutability can be restricted to pure +// Warning: (61-70): Unused local variable. +// Warning: (20-86): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol b/test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol index bd86f2f5..fce669dd 100644 --- a/test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol +++ b/test/libsolidity/syntaxTests/parsing/for_loop_simple_initexpr.sol @@ -1,5 +1,5 @@ contract test { - function fun(uint256 a) { + function fun(uint256 a) public { uint256 i =0; for (i = 0; i < 10; i++) { uint256 x = i; break; continue; @@ -7,7 +7,6 @@ contract test { } } // ---- -// Warning: (20-162): No visibility specified. Defaulting to "public". // Warning: (33-42): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (115-124): Unused local variable. -// Warning: (20-162): Function state mutability can be restricted to pure +// Warning: (122-131): Unused local variable. +// Warning: (20-169): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol b/test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol index 4a27e0fb..4adf0948 100644 --- a/test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol +++ b/test/libsolidity/syntaxTests/parsing/for_loop_simple_noexpr.sol @@ -1,5 +1,5 @@ contract test { - function fun(uint256 a) { + function fun(uint256 a) public { uint256 i =0; for (;;) { uint256 x = i; break; continue; @@ -7,7 +7,6 @@ contract test { } } // ---- -// Warning: (24-170): No visibility specified. Defaulting to "public". // Warning: (37-46): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (115-124): Unused local variable. -// Warning: (24-170): Function state mutability can be restricted to pure +// Warning: (122-131): Unused local variable. +// Warning: (24-177): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol b/test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol index 3df88ef5..c6af519c 100644 --- a/test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol +++ b/test/libsolidity/syntaxTests/parsing/for_loop_single_stmt_body.sol @@ -1,11 +1,10 @@ contract test { - function fun(uint256 a) { + function fun(uint256 a) public { uint256 i = 0; for (i = 0; i < 10; i++) continue; } } // ---- -// Warning: (20-129): No visibility specified. Defaulting to "public". // Warning: (33-42): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (20-129): Function state mutability can be restricted to pure +// Warning: (20-136): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol b/test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol index a7c5e8bb..c22ae42f 100644 --- a/test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol +++ b/test/libsolidity/syntaxTests/parsing/for_loop_vardef_initexpr.sol @@ -1,12 +1,11 @@ contract test { - function fun(uint256 a) { + function fun(uint256 a) public { for (uint256 i = 0; i < 10; i++) { uint256 x = i; break; continue; } } } // ---- -// Warning: (20-148): No visibility specified. Defaulting to "public". // Warning: (33-42): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (101-110): Unused local variable. -// Warning: (20-148): Function state mutability can be restricted to pure +// Warning: (108-117): Unused local variable. +// Warning: (20-155): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/function_no_body.sol b/test/libsolidity/syntaxTests/parsing/function_no_body.sol index 0424ebd8..c4a686dc 100644 --- a/test/libsolidity/syntaxTests/parsing/function_no_body.sol +++ b/test/libsolidity/syntaxTests/parsing/function_no_body.sol @@ -1,5 +1,3 @@ contract test { - function functionName(bytes32 input) returns (bytes32 out); + function functionName(bytes32 input) public returns (bytes32 out); } -// ---- -// Warning: (17-76): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/parsing/function_normal_comments.sol b/test/libsolidity/syntaxTests/parsing/function_normal_comments.sol index c7a023ac..94e1e60a 100644 --- a/test/libsolidity/syntaxTests/parsing/function_normal_comments.sol +++ b/test/libsolidity/syntaxTests/parsing/function_normal_comments.sol @@ -1,10 +1,9 @@ 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) {} } // ---- -// Warning: (75-136): No visibility specified. Defaulting to "public". // Warning: (97-110): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (121-132): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (75-136): Function state mutability can be restricted to pure +// Warning: (128-139): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (75-143): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol b/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol index 3b784733..11e77f25 100644 --- a/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol +++ b/test/libsolidity/syntaxTests/parsing/function_type_as_storage_variable_with_assignment.sol @@ -1,10 +1,9 @@ contract test { - function f(uint x, uint y) returns (uint a) {} + function f(uint x, uint y) public returns (uint a) {} function (uint, uint) internal returns (uint) f1 = f; } // ---- -// Warning: (20-66): No visibility specified. Defaulting to "public". // Warning: (31-37): Unused function parameter. Remove or comment out the variable name to silence this warning. // Warning: (39-45): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (56-62): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (20-66): Function state mutability can be restricted to pure +// Warning: (63-69): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (20-73): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol b/test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol index fd6447c7..3defb5ea 100644 --- a/test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol +++ b/test/libsolidity/syntaxTests/parsing/function_type_in_expression.sol @@ -1,15 +1,13 @@ contract test { - function f(uint x, uint y) returns (uint a) {} - function g() { + function f(uint x, uint y) public returns (uint a) {} + function g() public { function (uint, uint) internal returns (uint) f1 = f; } } // ---- -// Warning: (20-66): No visibility specified. Defaulting to "public". // Warning: (31-37): Unused function parameter. Remove or comment out the variable name to silence this warning. // Warning: (39-45): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (56-62): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (71-153): No visibility specified. Defaulting to "public". -// Warning: (94-142): Unused local variable. -// Warning: (20-66): Function state mutability can be restricted to pure -// Warning: (71-153): Function state mutability can be restricted to pure +// Warning: (63-69): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (108-156): Unused local variable. +// Warning: (20-73): Function state mutability can be restricted to pure +// Warning: (78-167): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/if_statement.sol b/test/libsolidity/syntaxTests/parsing/if_statement.sol index 451fba1f..b3269785 100644 --- a/test/libsolidity/syntaxTests/parsing/if_statement.sol +++ b/test/libsolidity/syntaxTests/parsing/if_statement.sol @@ -1,9 +1,8 @@ contract test { - function fun(uint256 a) returns (uint) { + function fun(uint256 a) public returns (uint) { if (a >= 8) { return 2; } else { uint b = 7; } } } // ---- -// Warning: (20-121): No visibility specified. Defaulting to "public". -// Warning: (102-108): Unused local variable. -// Warning: (20-121): Function state mutability can be restricted to pure +// Warning: (109-115): Unused local variable. +// Warning: (20-128): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol b/test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol index f42f8f16..4730f950 100644 --- a/test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol +++ b/test/libsolidity/syntaxTests/parsing/inline_array_declaration.sol @@ -1,9 +1,8 @@ contract c { uint[] a; - function f() returns (uint, uint) { + function f() public returns (uint, uint) { a = [1,2,3]; return (a[3], [2,3,4][0]); } } // ---- -// Warning: (31-128): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/parsing/interface_basic.sol b/test/libsolidity/syntaxTests/parsing/interface_basic.sol index c25b48ba..2363eaa8 100644 --- a/test/libsolidity/syntaxTests/parsing/interface_basic.sol +++ b/test/libsolidity/syntaxTests/parsing/interface_basic.sol @@ -1,6 +1,5 @@ interface Interface { - function f(); + function f() public; } // ---- -// Warning: (23-36): Functions in interfaces should be declared external. -// Warning: (23-36): No visibility specified. Defaulting to "public". In interfaces it defaults to external. +// Warning: (23-43): Functions in interfaces should be declared external. diff --git a/test/libsolidity/syntaxTests/parsing/library_simple.sol b/test/libsolidity/syntaxTests/parsing/library_simple.sol index fcf2638e..006ff307 100644 --- a/test/libsolidity/syntaxTests/parsing/library_simple.sol +++ b/test/libsolidity/syntaxTests/parsing/library_simple.sol @@ -1,6 +1,5 @@ library Lib { - function f() { } + function f() public { } } // ---- -// Warning: (18-34): No visibility specified. Defaulting to "public". -// Warning: (18-34): Function state mutability can be restricted to pure +// Warning: (18-41): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol index 452b52c7..64116b88 100644 --- a/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol +++ b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations.sol @@ -1,5 +1,5 @@ contract c { - function f() + function f() public { a = 1 wei; b = 2 szabo; @@ -12,5 +12,4 @@ contract c { uint256 d; } // ---- -// Warning: (163-172): This declaration shadows an existing declaration. -// Warning: (17-128): No visibility specified. Defaulting to "public". +// Warning: (170-179): This declaration shadows an existing declaration. diff --git a/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol index e0f49fbf..2f2302ed 100644 --- a/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol +++ b/test/libsolidity/syntaxTests/parsing/literal_constants_with_ether_subdenominations_in_expressions.sol @@ -1,9 +1,7 @@ contract c { - constructor() + constructor() public { a = 1 wei * 100 wei + 7 szabo - 3; } uint256 a; } -// ---- -// Warning: (17-86): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol index 5d6c8dc5..e311dd96 100644 --- a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol +++ b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_locals.sol @@ -1,12 +1,11 @@ contract Foo { - function f() { + function f() public { uint[] storage x; uint[] memory y; } } // ---- -// Warning: (42-58): Uninitialized storage pointer. -// Warning: (19-90): No visibility specified. Defaulting to "public". -// Warning: (42-58): Unused local variable. -// Warning: (68-83): Unused local variable. -// Warning: (19-90): Function state mutability can be restricted to pure +// 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/modifier_invocation.sol b/test/libsolidity/syntaxTests/parsing/modifier_invocation.sol index cb2f2985..cf986efe 100644 --- a/test/libsolidity/syntaxTests/parsing/modifier_invocation.sol +++ b/test/libsolidity/syntaxTests/parsing/modifier_invocation.sol @@ -1,8 +1,7 @@ contract c { modifier mod1(uint a) { if (msg.sender == address(a)) _; } modifier mod2 { if (msg.sender == address(2)) _; } - function f() mod1(7) mod2 { } + function f() public mod1(7) mod2 { } } // ---- -// Warning: (135-164): No visibility specified. Defaulting to "public". -// Warning: (135-164): Function state mutability can be restricted to view +// Warning: (135-171): Function state mutability can be restricted to view diff --git a/test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol b/test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol index 95a4d1e7..85d9e6a8 100644 --- a/test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol +++ b/test/libsolidity/syntaxTests/parsing/multiple_functions_natspec_documentation.sol @@ -1,28 +1,24 @@ 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) {} } // ---- -// Warning: (74-136): No visibility specified. Defaulting to "public". // Warning: (97-110): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (121-132): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (173-235): No visibility specified. Defaulting to "public". -// Warning: (196-209): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (220-231): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (267-329): No visibility specified. Defaulting to "public". -// Warning: (290-303): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (314-325): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (366-428): No visibility specified. Defaulting to "public". -// Warning: (389-402): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (413-424): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (74-136): Function state mutability can be restricted to pure -// Warning: (173-235): Function state mutability can be restricted to pure -// Warning: (267-329): Function state mutability can be restricted to pure -// Warning: (366-428): Function state mutability can be restricted to pure +// Warning: (128-139): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (203-216): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (234-245): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (304-317): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (335-346): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (410-423): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (441-452): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (74-143): Function state mutability can be restricted to pure +// Warning: (180-249): Function state mutability can be restricted to pure +// Warning: (281-350): Function state mutability can be restricted to pure +// Warning: (387-456): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/no_function_params.sol b/test/libsolidity/syntaxTests/parsing/no_function_params.sol index 020f1233..5a024bdb 100644 --- a/test/libsolidity/syntaxTests/parsing/no_function_params.sol +++ b/test/libsolidity/syntaxTests/parsing/no_function_params.sol @@ -1,7 +1,6 @@ contract test { uint256 stateVar; - function functionName() {} + function functionName() public {} } // ---- -// Warning: (36-62): No visibility specified. Defaulting to "public". -// Warning: (36-62): Function state mutability can be restricted to pure +// Warning: (36-69): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/overloaded_functions.sol b/test/libsolidity/syntaxTests/parsing/overloaded_functions.sol index 1a78d155..fe050d1b 100644 --- a/test/libsolidity/syntaxTests/parsing/overloaded_functions.sol +++ b/test/libsolidity/syntaxTests/parsing/overloaded_functions.sol @@ -1,9 +1,7 @@ contract test { - function fun(uint a) returns(uint r) { return a; } - function fun(uint a, uint b) returns(uint r) { return a + b; } + function fun(uint a) public returns(uint r) { return a; } + function fun(uint a, uint b) public returns(uint r) { return a + b; } } // ---- -// Warning: (17-67): No visibility specified. Defaulting to "public". -// Warning: (69-131): No visibility specified. Defaulting to "public". -// Warning: (17-67): Function state mutability can be restricted to pure -// Warning: (69-131): Function state mutability can be restricted to pure +// Warning: (17-74): Function state mutability can be restricted to pure +// Warning: (76-145): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol b/test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol index e331440d..a50855c0 100644 --- a/test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol +++ b/test/libsolidity/syntaxTests/parsing/placeholder_in_function_context.sol @@ -1,9 +1,8 @@ contract c { - function fun() returns (uint r) { + function fun() public returns (uint r) { uint _ = 8; return _ + 1; } } // ---- -// Warning: (17-98): No visibility specified. Defaulting to "public". -// Warning: (17-98): Function state mutability can be restricted to pure +// Warning: (17-105): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/parsing/single_function_param.sol b/test/libsolidity/syntaxTests/parsing/single_function_param.sol index 08e531f1..955f20f0 100644 --- a/test/libsolidity/syntaxTests/parsing/single_function_param.sol +++ b/test/libsolidity/syntaxTests/parsing/single_function_param.sol @@ -1,9 +1,8 @@ contract test { uint256 stateVar; - function functionName(bytes32 input) returns (bytes32 out) {} + function functionName(bytes32 input) public returns (bytes32 out) {} } // ---- -// Warning: (36-97): No visibility specified. Defaulting to "public". // Warning: (58-71): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (82-93): Unused function parameter. Remove or comment out the variable name to silence this warning. -// Warning: (36-97): Function state mutability can be restricted to pure +// Warning: (89-100): Unused function parameter. Remove or comment out the variable name to silence this warning. +// Warning: (36-104): 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 d691da44..8266c94f 100644 --- a/test/libsolidity/syntaxTests/parsing/tuples.sol +++ b/test/libsolidity/syntaxTests/parsing/tuples.sol @@ -1,5 +1,5 @@ contract C { - function f() { + function f() public { uint a = (1); (uint b,) = (1,); (uint c, uint d) = (1, 2 + a); @@ -8,10 +8,9 @@ contract C { } } // ---- -// Warning: (47-63): Different number of components on the left hand side (2) than on the right hand side (1). -// Warning: (100-121): Different number of components on the left hand side (2) than on the right hand side (3). -// Warning: (14-136): No visibility specified. Defaulting to "public". -// Warning: (68-74): Unused local variable. -// Warning: (76-82): Unused local variable. -// Warning: (101-107): Unused local variable. -// Warning: (14-136): Function state mutability can be restricted to pure +// 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 diff --git a/test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol b/test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol index 4706a26d..db890b37 100644 --- a/test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol +++ b/test/libsolidity/syntaxTests/parsing/visibility_specifiers.sol @@ -3,15 +3,12 @@ contract c { uint internal b; uint public c; uint d; - function f() {} + function f() public {} function f_priv() private {} - function f_public() public {} function f_internal() internal {} } // ---- // Warning: (58-71): This declaration shadows an existing declaration. -// Warning: (89-104): No visibility specified. Defaulting to "public". -// Warning: (89-104): Function state mutability can be restricted to pure -// Warning: (109-137): Function state mutability can be restricted to pure -// Warning: (142-171): Function state mutability can be restricted to pure -// Warning: (176-209): Function state mutability can be restricted to pure +// Warning: (89-111): Function state mutability can be restricted to pure +// Warning: (116-144): Function state mutability can be restricted to pure +// Warning: (149-182): Function state mutability can be restricted to pure diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/566_require_visibility_specifiers.sol b/test/libsolidity/syntaxTests/visibility/function_no_visibility.sol index 7330ef8d..ecc36f04 100644 --- a/test/libsolidity/syntaxTests/nameAndTypeResolution/566_require_visibility_specifiers.sol +++ b/test/libsolidity/syntaxTests/visibility/function_no_visibility.sol @@ -2,4 +2,4 @@ contract C { function f() pure { } } // ---- -// Warning: (17-38): No visibility specified. Defaulting to "public". +// Warning: (17-38): No visibility specified. Defaulting to "public". diff --git a/test/libsolidity/syntaxTests/visibility/function_no_visibility_050.sol b/test/libsolidity/syntaxTests/visibility/function_no_visibility_050.sol new file mode 100644 index 00000000..ec7c0937 --- /dev/null +++ b/test/libsolidity/syntaxTests/visibility/function_no_visibility_050.sol @@ -0,0 +1,6 @@ +pragma experimental "v0.5.0"; +contract C { + function f() pure { } +} +// ---- +// SyntaxError: (47-68): No visibility specified. |