From 09276cb9d3589493176bc45b2075517c2087d75b Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 27 Sep 2017 14:11:44 +0100 Subject: Do not add members of address to contracts in experimental 0.5.0 --- Changelog.md | 7 +-- docs/types.rst | 3 ++ libsolidity/ast/Types.cpp | 7 ++- 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() } -- cgit