From 82e27dcad9e384ae68b51cb3fd4c1d9b443b1993 Mon Sep 17 00:00:00 2001 From: Eduard Date: Thu, 16 Feb 2023 17:11:27 +0100 Subject: [PATCH 1/3] Fixed Prefixing Version with Range --- liblangutil/SemVerHandler.cpp | 15 +++++++++++++++ liblangutil/SemVerHandler.h | 1 + liblangutil/Token.h | 1 + 3 files changed, 17 insertions(+) diff --git a/liblangutil/SemVerHandler.cpp b/liblangutil/SemVerHandler.cpp index 6e85e2609..1d57e4dd5 100644 --- a/liblangutil/SemVerHandler.cpp +++ b/liblangutil/SemVerHandler.cpp @@ -208,6 +208,13 @@ void SemVerMatchExpressionParser::parseMatchExpression() range.components.push_back(parseMatchComponent()); if (currentToken() == Token::Sub) { + if(containPrefixingToken()) { + solThrow( + SemVerError, + "You cannot use operators (<, <=, >=, >, ^) with verison ranges (-)." + ); + } + range.components[0].prefix = Token::GreaterThanOrEqual; nextToken(); range.components.push_back(parseMatchComponent()); @@ -324,3 +331,11 @@ void SemVerMatchExpressionParser::nextToken() ++m_pos; m_posInside = 0; } + +bool SemVerMatchExpressionParser::containPrefixingToken() const +{ + if (std::find_if(m_tokens.begin(), m_tokens.end(), TokenTraits::isPragmaOp) != m_tokens.end()) + return true; + else + return false; +} diff --git a/liblangutil/SemVerHandler.h b/liblangutil/SemVerHandler.h index cf344502e..26ddead6a 100644 --- a/liblangutil/SemVerHandler.h +++ b/liblangutil/SemVerHandler.h @@ -102,6 +102,7 @@ private: char nextChar(); Token currentToken() const; void nextToken(); + bool containPrefixingToken() const; std::vector m_tokens; std::vector m_literals; diff --git a/liblangutil/Token.h b/liblangutil/Token.h index c4907aeac..2ff4156f2 100644 --- a/liblangutil/Token.h +++ b/liblangutil/Token.h @@ -297,6 +297,7 @@ namespace TokenTraits 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 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 isBooleanOp(Token op) { return (Token::Or <= op && op <= Token::And) || op == Token::Not; } From 3a4a504c4288b220cd9da1939e00bd81028f3832 Mon Sep 17 00:00:00 2001 From: Eduard Date: Thu, 16 Feb 2023 17:27:08 +0100 Subject: [PATCH 2/3] Fixed spelling and coding style errors --- liblangutil/SemVerHandler.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/liblangutil/SemVerHandler.cpp b/liblangutil/SemVerHandler.cpp index 1d57e4dd5..83f526113 100644 --- a/liblangutil/SemVerHandler.cpp +++ b/liblangutil/SemVerHandler.cpp @@ -208,10 +208,11 @@ void SemVerMatchExpressionParser::parseMatchExpression() range.components.push_back(parseMatchComponent()); if (currentToken() == Token::Sub) { - if(containPrefixingToken()) { + if (containPrefixingToken()) + { solThrow( SemVerError, - "You cannot use operators (<, <=, >=, >, ^) with verison ranges (-)." + "You cannot use operators (<, <=, >=, >, ^) with version ranges (-)." ); } From ed7123c8df35b7caf1d8b4f66ce9179708350c01 Mon Sep 17 00:00:00 2001 From: Eduard Date: Tue, 21 Feb 2023 20:20:11 +0100 Subject: [PATCH 3/3] Looking pragma operators per range and not per tokens. Add 3 invalid tests and 2 valid tests --- liblangutil/SemVerHandler.cpp | 15 ++++----------- liblangutil/SemVerHandler.h | 1 - .../pragma/invalid_range_operator_range_first.sol | 3 +++ .../invalid_range_operator_range_second.sol | 3 +++ .../invalid_range_operator_range_two_ranges.sol | 3 +++ .../syntaxTests/pragma/valid_range_operator.sol | 2 ++ .../pragma/valid_range_operator_two_ranges.sol | 2 ++ 7 files changed, 17 insertions(+), 12 deletions(-) create mode 100644 test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_first.sol create mode 100644 test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_second.sol create mode 100644 test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_two_ranges.sol create mode 100644 test/libsolidity/syntaxTests/pragma/valid_range_operator.sol create mode 100644 test/libsolidity/syntaxTests/pragma/valid_range_operator_two_ranges.sol diff --git a/liblangutil/SemVerHandler.cpp b/liblangutil/SemVerHandler.cpp index 83f526113..44014e50f 100644 --- a/liblangutil/SemVerHandler.cpp +++ b/liblangutil/SemVerHandler.cpp @@ -208,7 +208,10 @@ void SemVerMatchExpressionParser::parseMatchExpression() range.components.push_back(parseMatchComponent()); if (currentToken() == Token::Sub) { - if (containPrefixingToken()) + nextToken(); + range.components.push_back(parseMatchComponent()); + + if (TokenTraits::isPragmaOp(range.components[0].prefix) || TokenTraits::isPragmaOp(range.components[1].prefix)) { solThrow( SemVerError, @@ -217,8 +220,6 @@ void SemVerMatchExpressionParser::parseMatchExpression() } range.components[0].prefix = Token::GreaterThanOrEqual; - nextToken(); - range.components.push_back(parseMatchComponent()); range.components[1].prefix = Token::LessThanOrEqual; } else @@ -332,11 +333,3 @@ void SemVerMatchExpressionParser::nextToken() ++m_pos; m_posInside = 0; } - -bool SemVerMatchExpressionParser::containPrefixingToken() const -{ - if (std::find_if(m_tokens.begin(), m_tokens.end(), TokenTraits::isPragmaOp) != m_tokens.end()) - return true; - else - return false; -} diff --git a/liblangutil/SemVerHandler.h b/liblangutil/SemVerHandler.h index 26ddead6a..cf344502e 100644 --- a/liblangutil/SemVerHandler.h +++ b/liblangutil/SemVerHandler.h @@ -102,7 +102,6 @@ private: char nextChar(); Token currentToken() const; void nextToken(); - bool containPrefixingToken() const; std::vector m_tokens; std::vector m_literals; diff --git a/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_first.sol b/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_first.sol new file mode 100644 index 000000000..35bd89afa --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_first.sol @@ -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 (-). \ No newline at end of file diff --git a/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_second.sol b/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_second.sol new file mode 100644 index 000000000..5bb8995c6 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_second.sol @@ -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 (-). \ No newline at end of file diff --git a/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_two_ranges.sol b/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_two_ranges.sol new file mode 100644 index 000000000..67533547f --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/invalid_range_operator_range_two_ranges.sol @@ -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 (-). diff --git a/test/libsolidity/syntaxTests/pragma/valid_range_operator.sol b/test/libsolidity/syntaxTests/pragma/valid_range_operator.sol new file mode 100644 index 000000000..594d6d32b --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/valid_range_operator.sol @@ -0,0 +1,2 @@ +pragma solidity 0.8.17 - 0.8.20; +// ---- diff --git a/test/libsolidity/syntaxTests/pragma/valid_range_operator_two_ranges.sol b/test/libsolidity/syntaxTests/pragma/valid_range_operator_two_ranges.sol new file mode 100644 index 000000000..22b7fa356 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/valid_range_operator_two_ranges.sol @@ -0,0 +1,2 @@ +pragma solidity <0.8.15 || 0.8.17 - 0.8.20; +// ----