From 75a3a707a243ccb6135c7931bb32ac7b44551082 Mon Sep 17 00:00:00 2001 From: Federico Bond Date: Sun, 11 Feb 2018 19:44:23 -0300 Subject: [PATCH] Fix segfault with undeclared array types --- libsolidity/analysis/ReferencesResolver.cpp | 5 +++++ test/libsolidity/SolidityNameAndTypeResolution.cpp | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp index 30b06615e..451d6c93c 100644 --- a/libsolidity/analysis/ReferencesResolver.cpp +++ b/libsolidity/analysis/ReferencesResolver.cpp @@ -153,6 +153,11 @@ void ReferencesResolver::endVisit(Mapping const& _typeName) void ReferencesResolver::endVisit(ArrayTypeName const& _typeName) { TypePointer baseType = _typeName.baseType().annotation().type; + if (!baseType) + { + solAssert(!m_errorReporter.errors().empty(), ""); + return; + } if (baseType->storageBytes() == 0) fatalTypeError(_typeName.baseType().location(), "Illegal base type of storage size zero for array."); if (Expression const* length = _typeName.length()) diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index e8405281f..ee6a06338 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -2196,6 +2196,16 @@ BOOST_AUTO_TEST_CASE(array_copy_with_different_types_dynamic_static) CHECK_ERROR(text, TypeError, "Type uint256[] storage ref is not implicitly convertible to expected type uint256[80] storage ref."); } +BOOST_AUTO_TEST_CASE(array_of_undeclared_type) +{ + char const* text = R"( + contract c { + a[] public foo; + } + )"; + CHECK_ERROR(text, DeclarationError, "Identifier not found or not unique."); +} + BOOST_AUTO_TEST_CASE(storage_variable_initialization_with_incorrect_type_int) { char const* text = R"(