From e544698ad3a2101e3d910d0761571d4fa20144e8 Mon Sep 17 00:00:00 2001 From: Rhett Aultman Date: Fri, 28 Apr 2017 17:43:19 -0700 Subject: [PATCH 1/2] Deprecate use of unary '+' The unary '+' serves no meaningful purpose in Solidity and it makes it possible to produce typos with dagerous implications (e.g. 'a =+5 '), so we are deprecating it. The SyntaxChecker currently issues warnings on the unary '+' but will still compile it for now. --- Changelog.md | 1 + libsolidity/analysis/SyntaxChecker.cpp | 19 +++++++++++++++++++ libsolidity/analysis/SyntaxChecker.h | 4 ++++ .../SolidityNameAndTypeResolution.cpp | 11 ++++++++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index cd54aadbd0d5..c95cab5a746f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -10,6 +10,7 @@ Features: * Inline Assembly: Storage variable access using ``_slot`` and ``_offset`` suffixes. * Inline Assembly: Disallow blocks with unbalanced stack. * Static analyzer: Warn about statements without effects. + * Syntax checker: issue deprecation warning for unary '+' Bugfixes: * Assembly output: Implement missing AssemblyItem types. diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index 890141335a49..308733df63ed 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -32,6 +32,16 @@ bool SyntaxChecker::checkSyntax(ASTNode const& _astRoot) return Error::containsOnlyWarnings(m_errors); } +void SyntaxChecker::warning(SourceLocation const& _location, string const& _description) +{ + auto err = make_shared(Error::Type::Warning); + *err << + errinfo_sourceLocation(_location) << + errinfo_comment(_description); + + m_errors.push_back(err); +} + void SyntaxChecker::syntaxError(SourceLocation const& _location, std::string const& _description) { auto err = make_shared(Error::Type::SyntaxError); @@ -148,6 +158,15 @@ bool SyntaxChecker::visit(Break const& _breakStatement) return true; } +bool SyntaxChecker::visit(UnaryOperation const& _operation) +{ + if (_operation.getOperator() == Token::Add) + { + warning(_operation.location(), "Use of unary + is deprecated"); + } + return true; +} + bool SyntaxChecker::visit(PlaceholderStatement const&) { m_placeholderFound = true; diff --git a/libsolidity/analysis/SyntaxChecker.h b/libsolidity/analysis/SyntaxChecker.h index 308e128b535a..8d7dcdd32c63 100644 --- a/libsolidity/analysis/SyntaxChecker.h +++ b/libsolidity/analysis/SyntaxChecker.h @@ -32,6 +32,7 @@ namespace solidity * The module that performs syntax analysis on the AST: * - whether continue/break is in a for/while loop. * - whether a modifier contains at least one '_' + * - issues deprecation warnings for unary '+' */ class SyntaxChecker: private ASTConstVisitor { @@ -43,6 +44,7 @@ class SyntaxChecker: private ASTConstVisitor private: /// Adds a new error to the list of errors. + void warning(SourceLocation const& _location, std::string const& _description); void syntaxError(SourceLocation const& _location, std::string const& _description); virtual bool visit(SourceUnit const& _sourceUnit) override; @@ -60,6 +62,8 @@ class SyntaxChecker: private ASTConstVisitor virtual bool visit(Continue const& _continueStatement) override; virtual bool visit(Break const& _breakStatement) override; + virtual bool visit(UnaryOperation const& _operation) override; + virtual bool visit(PlaceholderStatement const& _placeholderStatement) override; ErrorList& m_errors; diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index f88f600a734b..8e80e0061bfb 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -3938,12 +3938,21 @@ BOOST_AUTO_TEST_CASE(rational_unary_operation) char const* text = R"( contract test { function f() { - ufixed8x16 a = +3.25; + ufixed8x16 a = 3.25; fixed8x16 b = -3.25; } } )"; CHECK_SUCCESS(text); + text = R"( + contract test { + function f() { + ufixed8x16 a = +3.25; + fixed8x16 b = -3.25; + } + } + )"; + CHECK_WARNING(text,"Use of unary + is deprecated"); } BOOST_AUTO_TEST_CASE(leading_zero_rationals_convert) From 96870686a9aba46a14d659c8c1cd107a9071857f Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 2 May 2017 15:48:58 +0200 Subject: [PATCH 2/2] Style and stricter tests. --- libsolidity/analysis/SyntaxChecker.cpp | 4 +--- test/libsolidity/SolidityNameAndTypeResolution.cpp | 10 +++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index 308733df63ed..94e82a8780af 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -161,9 +161,7 @@ bool SyntaxChecker::visit(Break const& _breakStatement) bool SyntaxChecker::visit(UnaryOperation const& _operation) { if (_operation.getOperator() == Token::Add) - { - warning(_operation.location(), "Use of unary + is deprecated"); - } + warning(_operation.location(), "Use of unary + is deprecated."); return true; } diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 8e80e0061bfb..90d0e728fc5b 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -3943,7 +3943,7 @@ BOOST_AUTO_TEST_CASE(rational_unary_operation) } } )"; - CHECK_SUCCESS(text); + CHECK_SUCCESS_NO_WARNINGS(text); text = R"( contract test { function f() { @@ -3953,6 +3953,14 @@ BOOST_AUTO_TEST_CASE(rational_unary_operation) } )"; CHECK_WARNING(text,"Use of unary + is deprecated"); + text = R"( + contract test { + function f(uint x) { + uint y = +x; + } + } + )"; + CHECK_WARNING(text,"Use of unary + is deprecated"); } BOOST_AUTO_TEST_CASE(leading_zero_rationals_convert)