This commit is contained in:
Eduard Fina 2023-09-14 16:18:59 +02:00 committed by GitHub
commit 6a9552ea16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 24 additions and 1 deletions

View File

@ -208,9 +208,18 @@ void SemVerMatchExpressionParser::parseMatchExpression()
range.components.push_back(parseMatchComponent()); range.components.push_back(parseMatchComponent());
if (currentToken() == Token::Sub) if (currentToken() == Token::Sub)
{ {
range.components[0].prefix = Token::GreaterThanOrEqual;
nextToken(); nextToken();
range.components.push_back(parseMatchComponent()); range.components.push_back(parseMatchComponent());
if (TokenTraits::isPragmaOp(range.components[0].prefix) || TokenTraits::isPragmaOp(range.components[1].prefix))
{
solThrow(
SemVerError,
"You cannot use operators (<, <=, >=, >, ^) with version ranges (-)."
);
}
range.components[0].prefix = Token::GreaterThanOrEqual;
range.components[1].prefix = Token::LessThanOrEqual; range.components[1].prefix = Token::LessThanOrEqual;
} }
else else

View File

@ -299,6 +299,7 @@ namespace TokenTraits
op == Token::Add || op == Token::Mul || op == Token::Equal || op == Token::NotEqual; } op == Token::Add || op == Token::Mul || op == Token::Equal || op == Token::NotEqual; }
constexpr bool isArithmeticOp(Token op) { return Token::Add <= op && op <= Token::Exp; } constexpr bool isArithmeticOp(Token op) { return Token::Add <= op && op <= Token::Exp; }
constexpr bool isCompareOp(Token op) { return Token::Equal <= op && op <= Token::GreaterThanOrEqual; } constexpr bool isCompareOp(Token op) { return Token::Equal <= op && op <= Token::GreaterThanOrEqual; }
constexpr bool isPragmaOp(Token op) { return (Token::LessThan <= op && op <= Token::GreaterThanOrEqual) || op == Token::BitXor; }
constexpr bool isBitOp(Token op) { return (Token::BitOr <= op && op <= Token::BitAnd) || op == Token::BitNot; } constexpr bool isBitOp(Token op) { return (Token::BitOr <= op && op <= Token::BitAnd) || op == Token::BitNot; }
constexpr bool isBooleanOp(Token op) { return (Token::Or <= op && op <= Token::And) || op == Token::Not; } constexpr bool isBooleanOp(Token op) { return (Token::Or <= op && op <= Token::And) || op == Token::Not; }

View File

@ -0,0 +1,3 @@
pragma solidity <0.8.17 - 0.8.20;
// ----
// ParserError 1684: (0-33): Invalid version pragma. You cannot use operators (<, <=, >=, >, ^) with version ranges (-).

View File

@ -0,0 +1,3 @@
pragma solidity 0.8.17 - >0.8.20;
// ----
// ParserError 1684: (0-33): Invalid version pragma. You cannot use operators (<, <=, >=, >, ^) with version ranges (-).

View File

@ -0,0 +1,3 @@
pragma solidity 0.8.14 || 0.8.17 - >0.8.20;
// ----
// ParserError 1684: (0-43): Invalid version pragma. You cannot use operators (<, <=, >=, >, ^) with version ranges (-).

View File

@ -0,0 +1,2 @@
pragma solidity 0.8.17 - 0.8.20;
// ----

View File

@ -0,0 +1,2 @@
pragma solidity <0.8.15 || 0.8.17 - 0.8.20;
// ----