From 2608c56d324ef63fcb85502a763ed184f0ad8def Mon Sep 17 00:00:00 2001 From: hrkrshnn Date: Fri, 12 Feb 2021 19:42:44 +0100 Subject: [PATCH] Make an assert less strict Even though one can convert from, say, a pure function to a function without a state mutability specified, in ABIFunctions.cpp, there was an assert that checked if the types were exactly equal. This assert had to be loosened up. --- libsolidity/codegen/ABIFunctions.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libsolidity/codegen/ABIFunctions.cpp b/libsolidity/codegen/ABIFunctions.cpp index d2512881a..9a339987a 100644 --- a/libsolidity/codegen/ABIFunctions.cpp +++ b/libsolidity/codegen/ABIFunctions.cpp @@ -1028,8 +1028,12 @@ string ABIFunctions::abiEncodingFunctionFunctionType( EncodingOptions const& _options ) { - solAssert(_from.kind() == FunctionType::Kind::External, ""); - solAssert(_from == _to, ""); + solAssert( + _from.kind() == FunctionType::Kind::External && + _from.isImplicitlyConvertibleTo(_to) && + _from.sizeOnStack() == _to.sizeOnStack(), + "Invalid function type conversion requested" + ); string functionName = "abi_encode_" + @@ -1042,11 +1046,13 @@ string ABIFunctions::abiEncodingFunctionFunctionType( return createFunction(functionName, [&]() { return Whiskers(R"( function (addr, function_id, pos) { + addr, function_id := (addr, function_id) mstore(pos, (addr, function_id)) } )") ("functionName", functionName) ("combineExtFun", m_utils.combineExternalFunctionIdFunction()) + ("convert", m_utils.conversionFunction(_from, _to)) .render(); }); else