Merge pull request #3425 from jevogel/3301

Deprecate the var keyword in SyntaxChecker
This commit is contained in:
chriseth 2018-02-13 08:40:41 +01:00 committed by GitHub
commit 729c6a95f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 17 deletions

View File

@ -9,6 +9,7 @@ Features:
* Inline Assembly: Support some restricted tokens (return, byte, address) as identifiers in Julia mode. * Inline Assembly: Support some restricted tokens (return, byte, address) as identifiers in Julia mode.
* SMT Checker: If-else branch conditions are taken into account in the SMT encoding of the program * SMT Checker: If-else branch conditions are taken into account in the SMT encoding of the program
variables. variables.
* Syntax Checker: Deprecate the ``var`` keyword (and mark it an error as experimental 0.5.0 feature).
* Type Checker: Issue warning for using ``public`` visibility for interface functions. * Type Checker: Issue warning for using ``public`` visibility for interface functions.
Bugfixes: Bugfixes:

View File

@ -224,3 +224,17 @@ bool SyntaxChecker::visit(FunctionTypeName const& _node)
return true; return true;
} }
bool SyntaxChecker::visit(VariableDeclaration const& _declaration)
{
bool const v050 = m_sourceUnit->annotation().experimentalFeatures.count(ExperimentalFeature::V050);
if (!_declaration.typeName())
{
if (v050)
m_errorReporter.syntaxError(_declaration.location(), "Use of the \"var\" keyword is deprecated.");
else
m_errorReporter.warning(_declaration.location(), "Use of the \"var\" keyword is deprecated.");
}
return true;
}

View File

@ -69,6 +69,8 @@ private:
virtual bool visit(FunctionDefinition const& _function) override; virtual bool visit(FunctionDefinition const& _function) override;
virtual bool visit(FunctionTypeName const& _node) override; virtual bool visit(FunctionTypeName const& _node) override;
virtual bool visit(VariableDeclaration const& _declaration) override;
ErrorReporter& m_errorReporter; ErrorReporter& m_errorReporter;
/// Flag that indicates whether a function modifier actually contains '_'. /// Flag that indicates whether a function modifier actually contains '_'.

View File

@ -1844,7 +1844,10 @@ BOOST_AUTO_TEST_CASE(warn_var_from_zero)
} }
} }
)"; )";
CHECK_WARNING(sourceCode, "uint8, which can hold values between 0 and 255"); CHECK_WARNING_ALLOW_MULTI(sourceCode, (std::vector<std::string>{
"uint8, which can hold values between 0 and 255",
"Use of the \"var\" keyword is deprecated."
}));
sourceCode = R"( sourceCode = R"(
contract test { contract test {
function f() pure public { function f() pure public {
@ -1853,7 +1856,10 @@ BOOST_AUTO_TEST_CASE(warn_var_from_zero)
} }
} }
)"; )";
CHECK_WARNING(sourceCode, "uint256, which can hold values between 0 and 115792089237316195423570985008687907853269984665640564039457584007913129639935"); CHECK_WARNING_ALLOW_MULTI(sourceCode, (std::vector<std::string>{
"uint256, which can hold values between 0 and 115792089237316195423570985008687907853269984665640564039457584007913129639935",
"Use of the \"var\" keyword is deprecated."
}));
sourceCode = R"( sourceCode = R"(
contract test { contract test {
function f() pure public { function f() pure public {
@ -1862,7 +1868,10 @@ BOOST_AUTO_TEST_CASE(warn_var_from_zero)
} }
} }
)"; )";
CHECK_WARNING(sourceCode, "int8, which can hold values between -128 and 127"); CHECK_WARNING_ALLOW_MULTI(sourceCode, (std::vector<std::string>{
"int8, which can hold values between -128 and 127",
"Use of the \"var\" keyword is deprecated."
}));
sourceCode = R"( sourceCode = R"(
contract test { contract test {
function f() pure public { function f() pure public {
@ -1870,7 +1879,10 @@ BOOST_AUTO_TEST_CASE(warn_var_from_zero)
} }
} }
)"; )";
CHECK_WARNING(sourceCode, "uint8, which can hold"); CHECK_WARNING_ALLOW_MULTI(sourceCode, (std::vector<std::string>{
"uint8, which can hold",
"Use of the \"var\" keyword is deprecated."
}));
} }
BOOST_AUTO_TEST_CASE(enum_member_access) BOOST_AUTO_TEST_CASE(enum_member_access)
@ -4887,8 +4899,7 @@ BOOST_AUTO_TEST_CASE(warn_about_callcode)
char const* text = R"( char const* text = R"(
contract test { contract test {
function f() pure public { function f() pure public {
var x = address(0x12).callcode; address(0x12).callcode;
x;
} }
} }
)"; )";
@ -4897,8 +4908,7 @@ BOOST_AUTO_TEST_CASE(warn_about_callcode)
pragma experimental "v0.5.0"; pragma experimental "v0.5.0";
contract test { contract test {
function f() pure public { function f() pure public {
var x = address(0x12).callcode; address(0x12).callcode;
x;
} }
} }
)"; )";
@ -6918,7 +6928,7 @@ BOOST_AUTO_TEST_CASE(function_types_sig)
} }
} }
)"; )";
CHECK_SUCCESS_NO_WARNINGS(text); CHECK_WARNING(text, "Use of the \"var\" keyword is deprecated.");
text = R"( text = R"(
contract C { contract C {
function h() pure external { function h() pure external {
@ -6941,7 +6951,7 @@ BOOST_AUTO_TEST_CASE(function_types_sig)
} }
} }
)"; )";
CHECK_SUCCESS_NO_WARNINGS(text); CHECK_WARNING(text, "Use of the \"var\" keyword is deprecated.");
} }
BOOST_AUTO_TEST_CASE(using_this_in_constructor) BOOST_AUTO_TEST_CASE(using_this_in_constructor)
@ -7349,7 +7359,7 @@ BOOST_AUTO_TEST_CASE(warn_about_sha3)
char const* text = R"( char const* text = R"(
contract test { contract test {
function f() pure public { function f() pure public {
var x = sha3(uint8(1)); bytes32 x = sha3(uint8(1));
x; x;
} }
} }

View File

@ -136,10 +136,12 @@ BOOST_AUTO_TEST_CASE(environment_access)
} }
for (string const& x: pure) for (string const& x: pure)
{ {
CHECK_WARNING( CHECK_WARNING_ALLOW_MULTI(
"contract C { function f() view public { var x = " + x + "; x; } }", "contract C { function f() view public { var x = " + x + "; x; } }",
"restricted to pure" (std::vector<std::string>{
); "Function state mutability can be restricted to pure",
"Use of the \"var\" keyword is deprecated."
}));
} }
} }
@ -282,9 +284,9 @@ BOOST_AUTO_TEST_CASE(builtin_functions)
require(this.call()); require(this.call());
} }
function g() pure public { function g() pure public {
var x = keccak256("abc"); bytes32 x = keccak256("abc");
var y = sha256("abc"); bytes32 y = sha256("abc");
var z = ecrecover(1, 2, 3, 4); address z = ecrecover(1, 2, 3, 4);
require(true); require(true);
assert(true); assert(true);
x; y; z; x; y; z;