From 840df80dac25cab6ef211a876fa6a44d991aa00e Mon Sep 17 00:00:00 2001 From: Djordje Mijovic Date: Tue, 23 Feb 2021 11:05:07 +0100 Subject: [PATCH] Check if all types in bytes.concat are fixed bytes or byte array. --- libsolidity/analysis/TypeChecker.cpp | 32 ++++++++++++++++++++++++++++ libsolidity/analysis/TypeChecker.h | 6 ++++++ 2 files changed, 38 insertions(+) diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 9cd6cb2f5..c3309600b 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -2027,6 +2027,32 @@ void TypeChecker::typeCheckABIEncodeFunctions( } } +void TypeChecker::typeCheckBytesConcatFunction( + FunctionCall const& _functionCall, + FunctionType const* _functionType +) +{ + solAssert(_functionType, ""); + solAssert(_functionType->kind() == FunctionType::Kind::BytesConcat, ""); + solAssert(_functionCall.names().empty(), ""); + + typeCheckFunctionGeneralChecks(_functionCall, _functionType); + + for (shared_ptr const& argument: _functionCall.arguments()) + if ( + Type const* argumentType = type(*argument); + !argumentType->isImplicitlyConvertibleTo(*TypeProvider::fixedBytes(32)) && + !argumentType->isImplicitlyConvertibleTo(*TypeProvider::bytesMemory()) + ) + m_errorReporter.typeError( + 8015_error, + argument->location(), + "Invalid type for argument in the bytes.concat function call. " + "bytes or fixed bytes type is required, but " + + argumentType->toString(true) + " provided." + ); +} + void TypeChecker::typeCheckFunctionGeneralChecks( FunctionCall const& _functionCall, FunctionTypePointer _functionType @@ -2433,6 +2459,12 @@ bool TypeChecker::visit(FunctionCall const& _functionCall) case FunctionType::Kind::MetaType: returnTypes = typeCheckMetaTypeFunctionAndRetrieveReturnType(_functionCall); break; + case FunctionType::Kind::BytesConcat: + { + typeCheckBytesConcatFunction(_functionCall, functionType); + returnTypes = functionType->returnParameterTypes(); + break; + } default: { typeCheckFunctionCall(_functionCall, functionType); diff --git a/libsolidity/analysis/TypeChecker.h b/libsolidity/analysis/TypeChecker.h index e2e1fa2b2..cc8da6f7f 100644 --- a/libsolidity/analysis/TypeChecker.h +++ b/libsolidity/analysis/TypeChecker.h @@ -111,6 +111,12 @@ private: FunctionTypePointer _functionType ); + /// Performs general checks and checks specific to bytes concat function call + void typeCheckBytesConcatFunction( + FunctionCall const& _functionCall, + FunctionType const* _functionType + ); + void endVisit(InheritanceSpecifier const& _inheritance) override; void endVisit(ModifierDefinition const& _modifier) override; bool visit(FunctionDefinition const& _function) override;