diff options
author | Erik Kundt <bitshift@posteo.org> | 2018-07-05 00:04:44 +0800 |
---|---|---|
committer | Erik Kundt <bitshift@posteo.org> | 2018-07-17 23:44:51 +0800 |
commit | b5ecfbe5bc2afdf8f42ec67715794aefad9dfe0f (patch) | |
tree | fc949d51bb2f84b08072ea75cae070343e875661 | |
parent | 1d33f41c1ab96746b97b97f79732ec23759fb8f0 (diff) | |
download | dexon-solidity-b5ecfbe5bc2afdf8f42ec67715794aefad9dfe0f.tar.gz dexon-solidity-b5ecfbe5bc2afdf8f42ec67715794aefad9dfe0f.tar.zst dexon-solidity-b5ecfbe5bc2afdf8f42ec67715794aefad9dfe0f.zip |
Enforces visibility specifier and updates docs.
-rw-r--r-- | Changelog.md | 2 | ||||
-rw-r--r-- | docs/contracts.rst | 15 | ||||
-rw-r--r-- | docs/control-structures.rst | 4 | ||||
-rw-r--r-- | docs/layout-of-source-files.rst | 2 | ||||
-rw-r--r-- | docs/types.rst | 3 | ||||
-rw-r--r-- | libsolidity/analysis/StaticAnalyzer.cpp | 10 | ||||
-rw-r--r-- | libsolidity/analysis/SyntaxChecker.cpp | 2 |
7 files changed, 14 insertions, 24 deletions
diff --git a/Changelog.md b/Changelog.md index f3c06d90..1046fcbd 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,7 @@ How to update your code: * Change every ``.call()`` to a ``.call("")`` and every ``.call(signature, a, b, c)`` to use ``.call(abi.encodeWithSignature(signature, a, b, c))`` (the last one only works for value types). * Change every ``keccak256(a, b, c)`` to ``keccak256(abi.encodePacked(a, b, c))``. + * Add ``public`` to every function that does not specify its visibility already. * Make your fallback functions ``external``. * Explicitly state the storage location for local variables of struct and array types, e.g. change ``uint[] x = m_x`` to ``uint[] storage x = m_x``. @@ -49,6 +50,7 @@ Breaking Changes: * Remove obsolete ``std`` directory from the Solidity repository. This means accessing ``https://github.com/ethereum/soldity/blob/develop/std/*.sol`` (or ``https://github.com/ethereum/solidity/std/*.sol`` in Remix) will not be possible. * References Resolver: Turn missing storage locations into an error. This was already the case in the experimental 0.5.0 mode. * Syntax Checker: Named return values in function types are an error. + * Syntax Checker: Strictly require visibility specifier. This was already the case in the experimental 0.5.0 mode. * Syntax Checker: Disallow unary ``+``. This was already the case in the experimental 0.5.0 mode. * View Pure Checker: Strictly enfore state mutability. This was already the case in the experimental 0.5.0 mode. diff --git a/docs/contracts.rst b/docs/contracts.rst index 033e9a45..51d7923d 100644 --- a/docs/contracts.rst +++ b/docs/contracts.rst @@ -131,10 +131,9 @@ a "message call") and external ones that do), there are four types of visibilities for functions and state variables. -Functions can be specified as being ``external``, -``public``, ``internal`` or ``private``, where the default is -``public``. For state variables, ``external`` is not possible -and the default is ``internal``. +Functions have to be specified as being ``external``, +``public``, ``internal`` or ``private``. +For state variables, ``external`` is not possible. ``external``: External functions are part of the contract @@ -850,10 +849,10 @@ Details are given in the following example. :: - pragma solidity ^0.4.22; + pragma solidity >0.4.24; contract owned { - constructor() { owner = msg.sender; } + constructor() public { owner = msg.sender; } address owner; } @@ -862,7 +861,7 @@ Details are given in the following example. // internal functions and state variables. These cannot be // accessed externally via `this`, though. contract mortal is owned { - function kill() { + function kill() public { if (msg.sender == owner) selfdestruct(owner); } } @@ -884,7 +883,7 @@ Details are given in the following example. // also a base class of `mortal`, yet there is only a single // instance of `owned` (as for virtual inheritance in C++). contract named is owned, mortal { - constructor(bytes32 name) { + constructor(bytes32 name) public { Config config = Config(0xD5f9D8D94886E70b06E474c3fB14Fd43E2f23970); NameReg(config.lookup(1)).register(name); } diff --git a/docs/control-structures.rst b/docs/control-structures.rst index ead236c4..9fd017db 100644 --- a/docs/control-structures.rst +++ b/docs/control-structures.rst @@ -465,10 +465,10 @@ The following example shows how an error string can be used together with revert :: - pragma solidity ^0.4.22; + pragma solidity >0.4.24; contract VendingMachine { - function buy(uint amount) payable { + function buy(uint amount) public payable { if (amount > msg.value / 2 ether) revert("Not enough Ether provided."); // Alternative way to do it: diff --git a/docs/layout-of-source-files.rst b/docs/layout-of-source-files.rst index 81faf816..46ef3d57 100644 --- a/docs/layout-of-source-files.rst +++ b/docs/layout-of-source-files.rst @@ -205,7 +205,7 @@ for the two input parameters and two returned values. * @return s The calculated surface. * @return p The calculated perimeter. */ - function rectangle(uint w, uint h) returns (uint s, uint p) { + function rectangle(uint w, uint h) public returns (uint s, uint p) { s = w * h; p = 2 * (w + h); } diff --git a/docs/types.rst b/docs/types.rst index 0fe36757..c81dee33 100644 --- a/docs/types.rst +++ b/docs/types.rst @@ -483,7 +483,7 @@ Another example that uses external function types:: contract OracleUser { Oracle constant oracle = Oracle(0x1234567); // known contract - function buySomething() { + function buySomething() public { oracle.query("USD", this.oracleResponse); } function oracleResponse(bytes memory response) public { @@ -979,4 +979,3 @@ converted to a matching size. This makes alignment and padding explicit:: uint16 x = 0xffff; bytes32(uint256(x)); // pad on the left bytes32(bytes2(x)); // pad on the right - diff --git a/libsolidity/analysis/StaticAnalyzer.cpp b/libsolidity/analysis/StaticAnalyzer.cpp index 323282ca..60a58665 100644 --- a/libsolidity/analysis/StaticAnalyzer.cpp +++ b/libsolidity/analysis/StaticAnalyzer.cpp @@ -51,16 +51,6 @@ void StaticAnalyzer::endVisit(ContractDefinition const&) bool StaticAnalyzer::visit(FunctionDefinition const& _function) { - const bool isInterface = m_currentContract->contractKind() == ContractDefinition::ContractKind::Interface; - - if (_function.noVisibilitySpecified()) - m_errorReporter.warning( - _function.location(), - "No visibility specified. Defaulting to \"" + - Declaration::visibilityToString(_function.visibility()) + - "\"." + - (isInterface ? " In interfaces it defaults to external." : "") - ); if (_function.isImplemented()) m_currentFunction = &_function; else diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index fba18a45..234c177c 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -201,7 +201,7 @@ bool SyntaxChecker::visit(FunctionDefinition const& _function) { bool const v050 = m_sourceUnit->annotation().experimentalFeatures.count(ExperimentalFeature::V050); - if (v050 && _function.noVisibilitySpecified()) + if (_function.noVisibilitySpecified()) m_errorReporter.syntaxError(_function.location(), "No visibility specified."); if (_function.isOldStyleConstructor()) |