aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Changelog.md2
-rw-r--r--libsolidity/parsing/Parser.cpp5
-rw-r--r--test/libsolidity/SolidityParser.cpp12
3 files changed, 18 insertions, 1 deletions
diff --git a/Changelog.md b/Changelog.md
index 670182af..49855369 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -5,6 +5,8 @@ Features:
* Type Checker: Warn on using literals as tight packing parameters in ``keccak256``, ``sha3``, ``sha256`` and ``ripemd160``.
Bugfixes:
+ * Parser: Crash fix related to parseTypeName.
+
### 0.4.16 (2017-08-24)
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp
index 4fc8fd13..ce8a9f01 100644
--- a/libsolidity/parsing/Parser.cpp
+++ b/libsolidity/parsing/Parser.cpp
@@ -1244,7 +1244,10 @@ ASTPointer<Expression> Parser::parseLeftHandSideExpression(
{
expectToken(Token::New);
ASTPointer<TypeName> typeName(parseTypeName(false));
- nodeFactory.setEndPositionFromNode(typeName);
+ if (typeName)
+ nodeFactory.setEndPositionFromNode(typeName);
+ else
+ nodeFactory.markEndPosition();
expression = nodeFactory.createNode<NewExpression>(typeName);
}
else
diff --git a/test/libsolidity/SolidityParser.cpp b/test/libsolidity/SolidityParser.cpp
index a39e0958..60ca03c9 100644
--- a/test/libsolidity/SolidityParser.cpp
+++ b/test/libsolidity/SolidityParser.cpp
@@ -1602,6 +1602,18 @@ BOOST_AUTO_TEST_CASE(interface)
BOOST_CHECK(successParse(text));
}
+BOOST_AUTO_TEST_CASE(newInvalidTypeName)
+{
+ char const* text = R"(
+ contract C {
+ function f() {
+ new var;
+ }
+ }
+ )";
+ CHECK_PARSE_ERROR(text, "Expected explicit type name");
+}
+
BOOST_AUTO_TEST_SUITE_END()
}