From 07cc84fadee7f1f86467a8dba435b2d5b28db268 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 13 Jun 2017 16:42:58 +0200 Subject: Fix a crash about a non-callable expression. --- Changelog.md | 1 + libsolidity/analysis/TypeChecker.cpp | 5 +---- test/libsolidity/SolidityNameAndTypeResolution.cpp | 15 ++++++++++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Changelog.md b/Changelog.md index 8f1fe045..5954865c 100644 --- a/Changelog.md +++ b/Changelog.md @@ -9,6 +9,7 @@ Features: * Inline Assembly: introduce ``keccak256`` as an opcode. ``sha3`` is still a valid alias. Bugfixes: + * Fixed crash concerning non-callable types. * Unused variable warnings no longer issued for variables used inside inline assembly. ### 0.4.11 (2017-05-03) diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index b1911ef0..50482b8f 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -1287,14 +1287,11 @@ bool TypeChecker::visit(FunctionCall const& _functionCall) membersRemovedForStructConstructor = structType.membersMissingInMemory(); _functionCall.annotation().isPure = isPure; } - else - { - functionType = dynamic_pointer_cast(expressionType); + else if (functionType = dynamic_pointer_cast(expressionType)) _functionCall.annotation().isPure = isPure && _functionCall.expression().annotation().isPure && functionType->isPure(); - } if (!functionType) { diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index ba2ade66..dddb5dde 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -5785,6 +5785,20 @@ BOOST_AUTO_TEST_CASE(no_unused_inline_asm) CHECK_SUCCESS_NO_WARNINGS(text); } +BOOST_AUTO_TEST_CASE(callable_crash) +{ + char const* text = R"( + contract C { + struct S { uint a; bool x; } + S public s; + function C() { + 3({a: 1, x: true}); + } + } + )"; + CHECK_ERROR(text, TypeError, "Type is not callable"); +} + BOOST_AUTO_TEST_CASE(returndatacopy_as_variable) { char const* text = R"( @@ -5802,7 +5816,6 @@ BOOST_AUTO_TEST_CASE(shadowing_warning_can_be_removed) } - BOOST_AUTO_TEST_SUITE_END() } -- cgit