Allow this.f.selector to be pure.

This commit is contained in:
chriseth
2018-02-13 11:00:59 +01:00
parent 729c6a95f8
commit 5916cf1e0a
6 changed files with 89 additions and 9 deletions
@@ -6904,15 +6904,7 @@ BOOST_AUTO_TEST_CASE(function_types_sig)
CHECK_ERROR(text, TypeError, "Member \"selector\" not found");
text = R"(
contract C {
function f() view external returns (bytes4) {
return this.f.selector;
}
}
)";
CHECK_SUCCESS_NO_WARNINGS(text);
text = R"(
contract C {
function f() view external returns (bytes4) {
function f() pure external returns (bytes4) {
return this.f.selector;
}
}
+46
View File
@@ -326,6 +326,52 @@ BOOST_AUTO_TEST_CASE(function_types)
CHECK_SUCCESS_NO_WARNINGS(text);
}
BOOST_AUTO_TEST_CASE(selector)
{
string text = R"(
contract C {
function f() payable public {
}
function g() pure public returns (bytes4) {
return this.f.selector;
}
}
)";
CHECK_SUCCESS_NO_WARNINGS(text);
}
BOOST_AUTO_TEST_CASE(selector_complex)
{
string text = R"(
contract C {
function f(C c) pure public returns (C) {
return c;
}
function g() pure public returns (bytes4) {
// By passing `this`, we read from the state, even if f itself is pure.
return f(this).f.selector;
}
}
)";
CHECK_ERROR(text, TypeError, "reads from the environment or state and thus requires \"view\"");
}
BOOST_AUTO_TEST_CASE(selector_complex2)
{
string text = R"(
contract C {
function f() payable public returns (C) {
return this;
}
function g() pure public returns (bytes4) {
C x = C(0x123);
return x.f.selector;
}
}
)";
CHECK_SUCCESS_NO_WARNINGS(text);
}
BOOST_AUTO_TEST_CASE(creation)
{
string text = R"(