diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp index 79ff447bc..ba02c048c 100644 --- a/libsolidity/parsing/Parser.cpp +++ b/libsolidity/parsing/Parser.cpp @@ -65,6 +65,8 @@ public: return make_shared(m_location, std::forward(_args)...); } + SourceLocation const& location() const noexcept { return m_location; } + private: Parser const& m_parser; SourceLocation m_location; @@ -108,14 +110,15 @@ ASTPointer Parser::parse(shared_ptr const& _scanner) } } -void Parser::parsePragmaVersion(vector const& tokens, vector const& literals) +void Parser::parsePragmaVersion(SourceLocation const& _location, vector const& _tokens, vector const& _literals) { - SemVerMatchExpressionParser parser(tokens, literals); + SemVerMatchExpressionParser parser(_tokens, _literals); auto matchExpression = parser.parse(); static SemVerVersion const currentVersion{string(VersionString)}; // FIXME: only match for major version incompatibility if (!matchExpression.matches(currentVersion)) - fatalParserError( + m_errorReporter.fatalParserError( + _location, "Source file requires different compiler version (current compiler is " + string(VersionString) + " - note that nightly builds are considered to be " "strictly less than the released version" @@ -154,6 +157,7 @@ ASTPointer Parser::parsePragmaDirective() if (literals.size() >= 2 && literals[0] == "solidity") { parsePragmaVersion( + nodeFactory.location(), vector(tokens.begin() + 1, tokens.end()), vector(literals.begin() + 1, literals.end()) ); diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h index 00e3f7519..2468c86ea 100644 --- a/libsolidity/parsing/Parser.h +++ b/libsolidity/parsing/Parser.h @@ -73,7 +73,7 @@ private: ///@{ ///@name Parsing functions for the AST nodes - void parsePragmaVersion(std::vector const& tokens, std::vector const& literals); + void parsePragmaVersion(langutil::SourceLocation const& _location, std::vector const& _tokens, std::vector const& _literals); ASTPointer parsePragmaDirective(); ASTPointer parseImportDirective(); ContractDefinition::ContractKind parseContractKind();