aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsolidity/parsing/ParserBase.cpp15
-rw-r--r--libsolidity/parsing/Scanner.h7
-rw-r--r--libsolidity/parsing/Token.cpp3
3 files changed, 13 insertions, 12 deletions
diff --git a/libsolidity/parsing/ParserBase.cpp b/libsolidity/parsing/ParserBase.cpp
index 9148946c..71085a4d 100644
--- a/libsolidity/parsing/ParserBase.cpp
+++ b/libsolidity/parsing/ParserBase.cpp
@@ -49,10 +49,7 @@ void ParserBase::expectToken(Token::Value _value)
{
if (Token::isElementaryTypeName(tok)) //for the sake of accuracy in reporting
{
- unsigned firstSize;
- unsigned secondSize;
- tie(firstSize, secondSize) = m_scanner->currentTokenInfo();
- ElementaryTypeNameToken elemTypeName(tok, firstSize, secondSize);
+ ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
fatalParserError(
string("Expected token ") +
string(Token::name(_value)) +
@@ -80,10 +77,7 @@ Token::Value ParserBase::expectAssignmentOperator()
{
if (Token::isElementaryTypeName(op)) //for the sake of accuracy in reporting
{
- unsigned firstSize;
- unsigned secondSize;
- tie(firstSize, secondSize) = m_scanner->currentTokenInfo();
- ElementaryTypeNameToken elemTypeName(op, firstSize, secondSize);
+ ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
fatalParserError(
string("Expected assignment operator, got '") +
elemTypeName.toString() +
@@ -108,10 +102,7 @@ ASTPointer<ASTString> ParserBase::expectIdentifierToken()
{
if (Token::isElementaryTypeName(id)) //for the sake of accuracy in reporting
{
- unsigned firstSize;
- unsigned secondSize;
- tie(firstSize, secondSize) = m_scanner->currentTokenInfo();
- ElementaryTypeNameToken elemTypeName(id, firstSize, secondSize);
+ ElementaryTypeNameToken elemTypeName = m_scanner->currentElementaryTypeNameToken();
fatalParserError(
string("Expected identifier, got '") +
elemTypeName.toString() +
diff --git a/libsolidity/parsing/Scanner.h b/libsolidity/parsing/Scanner.h
index cffcec8e..ac9f18e8 100644
--- a/libsolidity/parsing/Scanner.h
+++ b/libsolidity/parsing/Scanner.h
@@ -119,6 +119,13 @@ public:
{
return m_currentToken.token;
}
+ ElementaryTypeNameToken currentElementaryTypeNameToken()
+ {
+ unsigned firstSize;
+ unsigned secondSize;
+ std::tie(firstSize, secondSize) = m_currentToken.extendedTokenInfo;
+ return ElementaryTypeNameToken(m_currentToken.token, firstSize, secondSize);
+ }
SourceLocation currentLocation() const { return m_currentToken.location; }
std::string const& currentLiteral() const { return m_currentToken.literal; }
diff --git a/libsolidity/parsing/Token.cpp b/libsolidity/parsing/Token.cpp
index 24877c70..097a6f54 100644
--- a/libsolidity/parsing/Token.cpp
+++ b/libsolidity/parsing/Token.cpp
@@ -132,6 +132,7 @@ tuple<Token::Value, unsigned int, unsigned int> Token::fromIdentifierOrKeyword(s
Token::Value keyword = keywordByName(baseType);
if (keyword == Token::Bytes)
{
+ solAssert(m != -1, "Invalid type M in fixed command. Should not reach here.");
if (0 < m && m <= 32 && positionX == _literal.end())
return make_tuple(Token::BytesM, m, 0);
}
@@ -139,6 +140,7 @@ tuple<Token::Value, unsigned int, unsigned int> Token::fromIdentifierOrKeyword(s
{
if (0 < m && m <= 256 && m % 8 == 0 && positionX == _literal.end())
{
+ solAssert(m != -1, "Invalid type M in fixed command. Should not reach here.");
if (keyword == Token::UInt)
return make_tuple(Token::UIntM, m, 0);
else
@@ -160,6 +162,7 @@ tuple<Token::Value, unsigned int, unsigned int> Token::fromIdentifierOrKeyword(s
m % 8 == 0 &&
n % 8 == 0
) {
+ solAssert(n != -1, "Invalid type N in fixed command. Should not reach here.");
if (keyword == Token::UFixed)
return make_tuple(Token::UFixedMxN, m, n);
else