mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
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.
This commit is contained in:
parent
f33614e1f7
commit
e544698ad3
@ -10,6 +10,7 @@ Features:
|
|||||||
* Inline Assembly: Storage variable access using ``_slot`` and ``_offset`` suffixes.
|
* Inline Assembly: Storage variable access using ``_slot`` and ``_offset`` suffixes.
|
||||||
* Inline Assembly: Disallow blocks with unbalanced stack.
|
* Inline Assembly: Disallow blocks with unbalanced stack.
|
||||||
* Static analyzer: Warn about statements without effects.
|
* Static analyzer: Warn about statements without effects.
|
||||||
|
* Syntax checker: issue deprecation warning for unary '+'
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
* Assembly output: Implement missing AssemblyItem types.
|
* Assembly output: Implement missing AssemblyItem types.
|
||||||
|
@ -32,6 +32,16 @@ bool SyntaxChecker::checkSyntax(ASTNode const& _astRoot)
|
|||||||
return Error::containsOnlyWarnings(m_errors);
|
return Error::containsOnlyWarnings(m_errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SyntaxChecker::warning(SourceLocation const& _location, string const& _description)
|
||||||
|
{
|
||||||
|
auto err = make_shared<Error>(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)
|
void SyntaxChecker::syntaxError(SourceLocation const& _location, std::string const& _description)
|
||||||
{
|
{
|
||||||
auto err = make_shared<Error>(Error::Type::SyntaxError);
|
auto err = make_shared<Error>(Error::Type::SyntaxError);
|
||||||
@ -148,6 +158,15 @@ bool SyntaxChecker::visit(Break const& _breakStatement)
|
|||||||
return true;
|
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&)
|
bool SyntaxChecker::visit(PlaceholderStatement const&)
|
||||||
{
|
{
|
||||||
m_placeholderFound = true;
|
m_placeholderFound = true;
|
||||||
|
@ -32,6 +32,7 @@ namespace solidity
|
|||||||
* The module that performs syntax analysis on the AST:
|
* The module that performs syntax analysis on the AST:
|
||||||
* - whether continue/break is in a for/while loop.
|
* - whether continue/break is in a for/while loop.
|
||||||
* - whether a modifier contains at least one '_'
|
* - whether a modifier contains at least one '_'
|
||||||
|
* - issues deprecation warnings for unary '+'
|
||||||
*/
|
*/
|
||||||
class SyntaxChecker: private ASTConstVisitor
|
class SyntaxChecker: private ASTConstVisitor
|
||||||
{
|
{
|
||||||
@ -43,6 +44,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
/// Adds a new error to the list of errors.
|
/// 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);
|
void syntaxError(SourceLocation const& _location, std::string const& _description);
|
||||||
|
|
||||||
virtual bool visit(SourceUnit const& _sourceUnit) override;
|
virtual bool visit(SourceUnit const& _sourceUnit) override;
|
||||||
@ -60,6 +62,8 @@ private:
|
|||||||
virtual bool visit(Continue const& _continueStatement) override;
|
virtual bool visit(Continue const& _continueStatement) override;
|
||||||
virtual bool visit(Break const& _breakStatement) override;
|
virtual bool visit(Break const& _breakStatement) override;
|
||||||
|
|
||||||
|
virtual bool visit(UnaryOperation const& _operation) override;
|
||||||
|
|
||||||
virtual bool visit(PlaceholderStatement const& _placeholderStatement) override;
|
virtual bool visit(PlaceholderStatement const& _placeholderStatement) override;
|
||||||
|
|
||||||
ErrorList& m_errors;
|
ErrorList& m_errors;
|
||||||
|
@ -3938,12 +3938,21 @@ BOOST_AUTO_TEST_CASE(rational_unary_operation)
|
|||||||
char const* text = R"(
|
char const* text = R"(
|
||||||
contract test {
|
contract test {
|
||||||
function f() {
|
function f() {
|
||||||
ufixed8x16 a = +3.25;
|
ufixed8x16 a = 3.25;
|
||||||
fixed8x16 b = -3.25;
|
fixed8x16 b = -3.25;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
CHECK_SUCCESS(text);
|
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)
|
BOOST_AUTO_TEST_CASE(leading_zero_rationals_convert)
|
||||||
|
Loading…
Reference in New Issue
Block a user