From 2d490a0213ac390260b19fb1ba46daa378f5e780 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 14 Jul 2022 16:25:11 +0200 Subject: [PATCH] Pragma stdlib. --- libsolidity/analysis/SyntaxChecker.cpp | 15 +++++++++++++++ libsolidity/analysis/SyntaxChecker.h | 7 +++++-- libsolidity/ast/ASTAnnotations.h | 2 ++ libsolidity/interface/CompilerStack.cpp | 2 +- .../syntaxTests/stdlib/invalid_evm_version.sol | 4 ++++ 5 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 test/libsolidity/syntaxTests/stdlib/invalid_evm_version.sol diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp index 8b6cd37eb..8da82ef1e 100644 --- a/libsolidity/analysis/SyntaxChecker.cpp +++ b/libsolidity/analysis/SyntaxChecker.cpp @@ -72,6 +72,8 @@ void SyntaxChecker::endVisit(SourceUnit const& _sourceUnit) } if (!m_sourceUnit->annotation().useABICoderV2.set()) m_sourceUnit->annotation().useABICoderV2 = true; + if (!m_sourceUnit->annotation().useStdlib.set()) + m_sourceUnit->annotation().useStdlib = false; m_sourceUnit = nullptr; } @@ -176,6 +178,19 @@ bool SyntaxChecker::visit(PragmaDirective const& _pragma) solAssert(false); } } + else if (_pragma.literals()[0] == "stdlib") + { + solAssert(m_sourceUnit, ""); + if (m_evmVersion < EVMVersion::constantinople()) + m_errorReporter.syntaxError( + 6634_error, + _pragma.location(), + "\"pragma stdlib\" requires Constantinople EVM version at the minimum (selected EVM version is " + + m_evmVersion.name() + + ")." + ); + m_sourceUnit->annotation().useStdlib = true; + } else m_errorReporter.syntaxError(4936_error, _pragma.location(), "Unknown pragma \"" + _pragma.literals()[0] + "\""); diff --git a/libsolidity/analysis/SyntaxChecker.h b/libsolidity/analysis/SyntaxChecker.h index f221df09f..ce4175753 100644 --- a/libsolidity/analysis/SyntaxChecker.h +++ b/libsolidity/analysis/SyntaxChecker.h @@ -45,9 +45,10 @@ class SyntaxChecker: private ASTConstVisitor { public: /// @param _errorReporter provides the error logging functionality. - SyntaxChecker(langutil::ErrorReporter& _errorReporter, bool _useYulOptimizer): + SyntaxChecker(langutil::ErrorReporter& _errorReporter, bool _useYulOptimizer, langutil::EVMVersion _evmVersion): m_errorReporter(_errorReporter), - m_useYulOptimizer(_useYulOptimizer) + m_useYulOptimizer(_useYulOptimizer), + m_evmVersion(_evmVersion) {} bool checkSyntax(ASTNode const& _astRoot); @@ -101,6 +102,8 @@ private: bool m_useYulOptimizer = false; + langutil::EVMVersion m_evmVersion; + /// Flag that indicates whether a function modifier actually contains '_'. bool m_placeholderFound = false; diff --git a/libsolidity/ast/ASTAnnotations.h b/libsolidity/ast/ASTAnnotations.h index 2615e6af7..25ede2fc6 100644 --- a/libsolidity/ast/ASTAnnotations.h +++ b/libsolidity/ast/ASTAnnotations.h @@ -97,6 +97,8 @@ struct SourceUnitAnnotation: ASTAnnotation std::set experimentalFeatures; /// Using the new ABI coder. Set to `false` if using ABI coder v1. util::SetOnce useABICoderV2; + /// Using the new standard library mechanism. + util::SetOnce useStdlib; }; struct ScopableAnnotation diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index ff8fedba2..602e7dda6 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -444,7 +444,7 @@ bool CompilerStack::analyze() try { - SyntaxChecker syntaxChecker(m_errorReporter, m_optimiserSettings.runYulOptimiser); + SyntaxChecker syntaxChecker(m_errorReporter, m_optimiserSettings.runYulOptimiser, m_evmVersion); for (Source const* source: m_sourceOrder) if (source->ast && !syntaxChecker.checkSyntax(*source->ast)) noErrors = false; diff --git a/test/libsolidity/syntaxTests/stdlib/invalid_evm_version.sol b/test/libsolidity/syntaxTests/stdlib/invalid_evm_version.sol new file mode 100644 index 000000000..af32f2e07 --- /dev/null +++ b/test/libsolidity/syntaxTests/stdlib/invalid_evm_version.sol @@ -0,0 +1,4 @@ +pragma stdlib; +// ==== +// EVMVersion: