diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index 22c939d8f..2757e197e 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -929,6 +929,20 @@ void IRGeneratorForStatements::endVisit(FunctionCall const& _functionCall) "(" << IRVariable(arg).commaSeparatedList() << ")"; + else if (auto functionType = dynamic_cast(paramTypes[i])) + { + solAssert( + IRVariable(arg).type() == *functionType && + functionType->kind() == FunctionType::Kind::External && + !functionType->bound(), + "" + ); + define(indexedArgs.emplace_back(m_context.newYulVariable(), *TypeProvider::fixedBytes(32))) << + m_utils.combineExternalFunctionIdFunction() << + "(" << + IRVariable(arg).commaSeparatedList() << + ")\n"; + } else indexedArgs.emplace_back(convert(arg, *paramTypes[i])); } diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index 2c73acec1..efabb2bb5 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -2463,21 +2463,26 @@ BOOST_AUTO_TEST_CASE(event_indexed_function) } } )"; - compileAndRun(sourceCode); - callContractFunction("f()"); - BOOST_REQUIRE_EQUAL(numLogs(), 1); - BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress); - BOOST_CHECK(logData(0) == bytes()); - BOOST_REQUIRE_EQUAL(numLogTopics(0), 2); - bytes functionHash = util::keccak256("f()").asBytes(); - bytes address = m_contractAddress.asBytes(); - bytes selector = bytes(functionHash.cbegin(), functionHash.cbegin() + 4); - bytes padding = bytes(8, 0); - bytes functionABI = address + selector + padding; + ALSO_VIA_YUL( + DISABLE_EWASM_TESTRUN() - BOOST_CHECK_EQUAL(logTopic(0, 1).hex(), util::toHex(functionABI)); - BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Test(function)"))); + compileAndRun(sourceCode); + callContractFunction("f()"); + BOOST_REQUIRE_EQUAL(numLogs(), 1); + BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress); + BOOST_CHECK(logData(0) == bytes()); + BOOST_REQUIRE_EQUAL(numLogTopics(0), 2); + + bytes functionHash = util::keccak256("f()").asBytes(); + bytes address = m_contractAddress.asBytes(); + bytes selector = bytes(functionHash.cbegin(), functionHash.cbegin() + 4); + bytes padding = bytes(8, 0); + bytes functionABI = address + selector + padding; + + BOOST_CHECK_EQUAL(logTopic(0, 1).hex(), util::toHex(functionABI)); + BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Test(function)"))); + ) } BOOST_AUTO_TEST_CASE(empty_name_input_parameter_with_named_one)