diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index ab1151a17..693570432 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -292,17 +292,21 @@ void TypeChecker::checkContractExternalTypeClashes(ContractDefinition const& _co if (f->isPartOfExternalInterface()) { auto functionType = make_shared(*f); - externalDeclarations[functionType->externalSignature()].push_back( - make_pair(f, functionType) - ); + // under non error circumstances this should be true + if (functionType->interfaceFunctionType()) + externalDeclarations[functionType->externalSignature()].push_back( + make_pair(f, functionType) + ); } for (VariableDeclaration const* v: contract->stateVariables()) if (v->isPartOfExternalInterface()) { auto functionType = make_shared(*v); - externalDeclarations[functionType->externalSignature()].push_back( - make_pair(v, functionType) - ); + // under non error circumstances this should be true + if (functionType->interfaceFunctionType()) + externalDeclarations[functionType->externalSignature()].push_back( + make_pair(v, functionType) + ); } } for (auto const& it: externalDeclarations) diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 2e9b56a15..79e5bb02d 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1593,6 +1593,10 @@ FunctionTypePointer FunctionType::interfaceFunctionType() const else return FunctionTypePointer(); } + auto variable = dynamic_cast(m_declaration); + if (variable && retParamTypes.empty()) + return FunctionTypePointer(); + return make_shared(paramTypes, retParamTypes, m_parameterNames, m_returnParameterNames, m_location, m_arbitraryParameters); } diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 4697e756f..7e030c7f1 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -1003,6 +1003,17 @@ BOOST_AUTO_TEST_CASE(base_class_state_variable_accessor) BOOST_CHECK(success(text)); } +BOOST_AUTO_TEST_CASE(struct_accessor_one_array_only) +{ + char const* sourceCode = R"( + contract test { + struct Data { uint[15] m_array; } + Data public data; + } + )"; + BOOST_CHECK(expectError(sourceCode) == Error::Type::TypeError); +} + BOOST_AUTO_TEST_CASE(base_class_state_variable_internal_member) { char const* text = "contract Parent {\n"