aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Changelog.md7
-rw-r--r--docs/types.rst3
-rw-r--r--libsolidity/ast/Types.cpp7
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp58
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()
}