From bb28c8a877c34a771e682d195e6641b81b2f25d9 Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Wed, 20 Mar 2019 11:32:33 +0100 Subject: [PATCH] Fixes wrong source location when reporting pragma solidity version conflicts. --- libsolidity/parsing/Parser.cpp | 10 +++++++--- libsolidity/parsing/Parser.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) 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();