From edd52f0553c2a955e75485ba6d0d9bf5d8d80030 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 29 Jun 2015 20:05:41 +0200 Subject: [PATCH] Memory arrays cannot be resized. --- libsolidity/AST.cpp | 7 +++++-- test/libsolidity/SolidityNameAndTypeResolution.cpp | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index 2b73aab5e..cb935183f 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -936,8 +936,11 @@ void MemberAccess::checkTypeRequirements(TypePointers const* _argumentTypes) else if (type.getCategory() == Type::Category::Array) { auto const& arrayType(dynamic_cast(type)); - m_isLValue = (*m_memberName == "length" && - arrayType.location() != DataLocation::CallData && arrayType.isDynamicallySized()); + m_isLValue = ( + *m_memberName == "length" && + arrayType.location() == DataLocation::Storage && + arrayType.isDynamicallySized() + ); } else m_isLValue = false; diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index f24930ba5..df976eaea 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -2026,6 +2026,19 @@ BOOST_AUTO_TEST_CASE(dynamic_return_types_not_possible) BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError); } +BOOST_AUTO_TEST_CASE(memory_arrays_not_resizeable) +{ + char const* sourceCode = R"( + contract C { + function f() { + uint[] memory x; + x.length = 2; + } + } + )"; + BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError); +} + BOOST_AUTO_TEST_SUITE_END() }