diff --git a/liblangutil/SemVerHandler.cpp b/liblangutil/SemVerHandler.cpp index 2358eec5ef0d..9f73b6395af0 100644 --- a/liblangutil/SemVerHandler.cpp +++ b/liblangutil/SemVerHandler.cpp @@ -240,6 +240,8 @@ SemVerMatchExpression::MatchComponent SemVerMatchExpressionParser::parseMatchCom component.prefix = Token::Assign; } + auto const partsStartPos = m_pos; + component.levelsPresent = 0; while (component.levelsPresent < 3) { @@ -250,6 +252,18 @@ SemVerMatchExpression::MatchComponent SemVerMatchExpressionParser::parseMatchCom else break; } + + // Validate that the parsed version parts are either a single string literal or multiple bare tokens, + // i.e. "1.2.3" or 1.2.3 but not 1."2.3", "1".2.3 or 1"."2.3. + auto const partsEndPos = m_pos; // Points *after* the last version part + for (auto i = partsStartPos; i < partsEndPos; ++i) + { + if (m_tokens[i] == Token::StringLiteral && partsStartPos != partsEndPos - 1) + { + solThrow(SemVerError, "String literals are only allowed as the only component in a version pragma."); + } + } + // TODO we do not support pre and build version qualifiers for now in match expressions // (but we do support them in the actual versions) return component; diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 27926721aa6f..ee77bca908aa 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -312,7 +312,7 @@ class Declaration: public ASTNode, public Scopable }; /** - * Pragma directive, only version requirements in the form `pragma solidity "^0.4.0";` are + * Pragma directive, only version requirements in the form `pragma solidity ^"0.4.0";` are * supported for now. */ class PragmaDirective: public ASTNode diff --git a/test/libsolidity/syntaxTests/pragma/broken_version_strings_digit.sol b/test/libsolidity/syntaxTests/pragma/broken_version_strings_digit.sol new file mode 100644 index 000000000000..5e7bf2522bb6 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/broken_version_strings_digit.sol @@ -0,0 +1,3 @@ +pragma solidity ^"0"."8"."2"; +// ---- +// ParserError 1684: (0-29): Invalid version pragma. String literals are only allowed as the only component in a version pragma. diff --git a/test/libsolidity/syntaxTests/pragma/broken_version_strings_dots.sol b/test/libsolidity/syntaxTests/pragma/broken_version_strings_dots.sol new file mode 100644 index 000000000000..d8519c1849cd --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/broken_version_strings_dots.sol @@ -0,0 +1,3 @@ +pragma solidity ^ 0 "." 8 "." 2; +// ---- +// ParserError 1684: (0-32): Invalid version pragma. String literals are only allowed as the only component in a version pragma. diff --git a/test/libsolidity/syntaxTests/pragma/broken_version_strings_part.sol b/test/libsolidity/syntaxTests/pragma/broken_version_strings_part.sol new file mode 100644 index 000000000000..82501b9abca6 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/broken_version_strings_part.sol @@ -0,0 +1,3 @@ +pragma solidity ^ 0."8.0"; +// ---- +// ParserError 1684: (0-26): Invalid version pragma. String literals are only allowed as the only component in a version pragma. diff --git a/test/libsolidity/syntaxTests/pragma/broken_version_strings_prefix.sol b/test/libsolidity/syntaxTests/pragma/broken_version_strings_prefix.sol new file mode 100644 index 000000000000..14b67794bd53 --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/broken_version_strings_prefix.sol @@ -0,0 +1,3 @@ +pragma solidity "^0.8.0"; +// ---- +// ParserError 1684: (0-25): Invalid version pragma. Expected the start of a version number but instead found character '^'. Version number is invalid or the pragma is not terminated with a semicolon. diff --git a/test/libsolidity/syntaxTests/pragma/version_component_string_mixed.sol b/test/libsolidity/syntaxTests/pragma/version_component_string_mixed.sol new file mode 100644 index 000000000000..806006ed2d1e --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/version_component_string_mixed.sol @@ -0,0 +1 @@ +pragma solidity >= 0.0 <= "123456"; diff --git a/test/libsolidity/syntaxTests/pragma/version_component_string_prefix.sol b/test/libsolidity/syntaxTests/pragma/version_component_string_prefix.sol new file mode 100644 index 000000000000..a7b12c4c51bc --- /dev/null +++ b/test/libsolidity/syntaxTests/pragma/version_component_string_prefix.sol @@ -0,0 +1 @@ +pragma solidity <= "123456";