From b6183edd1890b8416992b37e576848e47387616f Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 2 Feb 2021 16:31:36 +0100 Subject: [PATCH] fixup! Syntax for custom errors. --- libsolidity/analysis/SyntaxChecker.cpp | 11 +++++++++++ libsolidity/analysis/SyntaxChecker.h | 3 +++ .../syntaxTests/errors/error_reserved_name.sol | 1 + .../syntaxTests/errors/panic_reserved_name.sol | 1 + 4 files changed, 16 insertions(+) diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index c85791449..e79ce6ac7 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -192,6 +192,17 @@ void SyntaxChecker::endVisit(ModifierDefinition const& _modifier) m_placeholderFound = false; } +bool SyntaxChecker::visit(ErrorDefinition const& _error) +{ + if (_error.name() == "Error" || _error.name() == "Panic") + m_errorReporter.syntaxError( + 1855_error, + _error.location(), + "The built-in errors \"Error\" and \"Panic\" cannot be re-defined." + ); + return true; +} + void SyntaxChecker::checkSingleStatementVariableDeclaration(ASTNode const& _statement) { auto varDecl = dynamic_cast(&_statement); diff --git a/libsolidity/analysis/SyntaxChecker.h b/libsolidity/analysis/SyntaxChecker.h index ca36ed992..c522c8a10 100644 --- a/libsolidity/analysis/SyntaxChecker.h +++ b/libsolidity/analysis/SyntaxChecker.h @@ -40,6 +40,7 @@ namespace solidity::frontend * - issues deprecation warning for throw * - whether the msize instruction is used and the Yul optimizer is enabled at the same time. * - selection of the ABI coder through pragmas. + * - whether user-defined errors are called Error or Panic. */ class SyntaxChecker: private ASTConstVisitor { @@ -61,6 +62,8 @@ private: bool visit(ModifierDefinition const& _modifier) override; void endVisit(ModifierDefinition const& _modifier) override; + bool visit(ErrorDefinition const& _error) override; + /// Reports an error if _statement is a VariableDeclarationStatement. /// Used by if/while/for to check for single statement variable declarations /// without a block. diff --git a/test/libsolidity/syntaxTests/errors/error_reserved_name.sol b/test/libsolidity/syntaxTests/errors/error_reserved_name.sol index a4a67ef7f..19f8c46f5 100644 --- a/test/libsolidity/syntaxTests/errors/error_reserved_name.sol +++ b/test/libsolidity/syntaxTests/errors/error_reserved_name.sol @@ -1,3 +1,4 @@ // TODO do we want to disallow this at all? error Error(uint); // ---- +// SyntaxError 1855: (44-62): The built-in errors "Error" and "Panic" cannot be re-defined. diff --git a/test/libsolidity/syntaxTests/errors/panic_reserved_name.sol b/test/libsolidity/syntaxTests/errors/panic_reserved_name.sol index c3fd84b43..f269c931a 100644 --- a/test/libsolidity/syntaxTests/errors/panic_reserved_name.sol +++ b/test/libsolidity/syntaxTests/errors/panic_reserved_name.sol @@ -2,3 +2,4 @@ // TODO I Think the best way would be to have Error in the global scope. error Panic(bytes2); // ---- +// SyntaxError 1855: (131-151): The built-in errors "Error" and "Panic" cannot be re-defined.