diff options
author | chriseth <chris@ethereum.org> | 2017-10-05 22:12:21 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-05 22:12:21 +0800 |
commit | d0fa56a217f50458b128b0a570724cdac0a5ee1a (patch) | |
tree | 49ca4270f829ac145b0d335092590d8de8961918 | |
parent | 8b26d65b62f54083e1bec02b34994962770b420f (diff) | |
parent | 09276cb9d3589493176bc45b2075517c2087d75b (diff) | |
download | dexon-solidity-d0fa56a217f50458b128b0a570724cdac0a5ee1a.tar dexon-solidity-d0fa56a217f50458b128b0a570724cdac0a5ee1a.tar.gz dexon-solidity-d0fa56a217f50458b128b0a570724cdac0a5ee1a.tar.bz2 dexon-solidity-d0fa56a217f50458b128b0a570724cdac0a5ee1a.tar.lz dexon-solidity-d0fa56a217f50458b128b0a570724cdac0a5ee1a.tar.xz dexon-solidity-d0fa56a217f50458b128b0a570724cdac0a5ee1a.tar.zst dexon-solidity-d0fa56a217f50458b128b0a570724cdac0a5ee1a.zip |
Merge pull request #2981 from ethereum/no-address-overload
Do not add members of address to contracts in experimental 0.5.0
-rw-r--r-- | Changelog.md | 7 | ||||
-rw-r--r-- | docs/types.rst | 3 | ||||
-rw-r--r-- | libsolidity/ast/Types.cpp | 7 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 58 |
4 files changed, 70 insertions, 5 deletions
diff --git a/Changelog.md b/Changelog.md index 8f97b0e8..ace9bc36 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,13 +1,14 @@ ### 0.4.18 (unreleased) Features: + * Code Generator: Always use all available gas for calls as experimental 0.5.0 feature + (previously, some amount was retained in order to work in pre-tangerine whistle + EVM versions) * Parser: Better error message for unexpected trailing comma in parameter lists. * Standard JSON: Support the ``outputSelection`` field for selective compilation of supplied sources. * Syntax Checker: Unary ``+`` is now a syntax error as experimental 0.5.0 feature. * Type Checker: Disallow non-pure constant state variables as experimental 0.5.0 feature. - * Code Generator: Always use all available gas for calls as experimental 0.5.0 feature - (previously, some amount was retained in order to work in pre-tangerine whistle - EVM versions) + * Type Checker: Do not add members of ``address`` to contracts as experimental 0.5.0 feature. Bugfixes: * Parser: Fix source location of VariableDeclarationStatement. diff --git a/docs/types.rst b/docs/types.rst index 5c291f35..ebc753a0 100644 --- a/docs/types.rst +++ b/docs/types.rst @@ -107,6 +107,9 @@ Operators: * ``<=``, ``<``, ``==``, ``!=``, ``>=`` and ``>`` +.. note:: + Starting with version 0.5.0 contracts do not derive from the address type, but can still be explicitly converted to address. + .. _members-of-addresses: Members of Addresses diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index a3cbe50a..ff5195ff 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1616,9 +1616,10 @@ string ContractType::canonicalName() const return m_contract.annotation().canonicalName; } -MemberList::MemberMap ContractType::nativeMembers(ContractDefinition const*) const +MemberList::MemberMap ContractType::nativeMembers(ContractDefinition const* _contract) const { MemberList::MemberMap members; + solAssert(_contract, ""); if (m_super) { // add the most derived of all functions which are visible in derived contracts @@ -1660,7 +1661,9 @@ MemberList::MemberMap ContractType::nativeMembers(ContractDefinition const*) con &it.second->declaration() )); } - addNonConflictingAddressMembers(members); + // In 0.5.0 address members are not populated into the contract. + if (!_contract->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050)) + addNonConflictingAddressMembers(members); return members; } diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 350d41f1..738e0a87 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -7100,6 +7100,64 @@ BOOST_AUTO_TEST_CASE(array_length_validation) CHECK_ERROR(text, TypeError, "Invalid array length, expected integer literal."); } +BOOST_AUTO_TEST_CASE(no_address_members_on_contract) +{ + char const* text = R"( + pragma experimental "v0.5.0"; + contract C { + function f() { + this.balance; + } + } + )"; + CHECK_ERROR(text, TypeError, "Member \"balance\" not found or not visible after argument-dependent lookup in contract"); + text = R"( + pragma experimental "v0.5.0"; + contract C { + function f() { + this.transfer; + } + } + )"; + CHECK_ERROR(text, TypeError, "Member \"transfer\" not found or not visible after argument-dependent lookup in contract"); + text = R"( + pragma experimental "v0.5.0"; + contract C { + function f() { + this.send; + } + } + )"; + CHECK_ERROR(text, TypeError, "Member \"send\" not found or not visible after argument-dependent lookup in contract"); + text = R"( + pragma experimental "v0.5.0"; + contract C { + function f() { + this.call; + } + } + )"; + CHECK_ERROR(text, TypeError, "Member \"call\" not found or not visible after argument-dependent lookup in contract"); + text = R"( + pragma experimental "v0.5.0"; + contract C { + function f() { + this.callcode; + } + } + )"; + CHECK_ERROR(text, TypeError, "Member \"callcode\" not found or not visible after argument-dependent lookup in contract"); + text = R"( + pragma experimental "v0.5.0"; + contract C { + function f() { + this.delegatecall; + } + } + )"; + CHECK_ERROR(text, TypeError, "Member \"delegatecall\" not found or not visible after argument-dependent lookup in contract"); +} + BOOST_AUTO_TEST_SUITE_END() } |