diff --git a/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp index 589fe6787db7..cb4705f0d189 100644 --- a/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp +++ b/libsolidity/experimental/codegen/IRGeneratorForStatements.cpp @@ -299,6 +299,7 @@ bool IRGeneratorForStatements::visit(ElementaryTypeNameExpression const&) void IRGeneratorForStatements::endVisit(FunctionCall const& _functionCall) { Type functionType = type(_functionCall.expression()); + solUnimplementedAssert(m_expressionDeclaration.count(&_functionCall.expression()) != 0, "No support for calling functions pointers yet."); auto declaration = m_expressionDeclaration.at(&_functionCall.expression()); if (auto builtin = std::get_if(&declaration)) { @@ -322,7 +323,10 @@ void IRGeneratorForStatements::endVisit(FunctionCall const& _functionCall) functionType = m_context.env->resolveRecursive(functionType); m_context.enqueueFunctionDefinition(functionDefinition, functionType); // TODO: account for return stack size - m_code << "let " << IRNames::localVariable(_functionCall) << " := " << IRNames::function(*m_context.env, *functionDefinition, functionType) << "("; + solAssert(!functionDefinition->returnParameterList()); + if (functionDefinition->experimentalReturnExpression()) + m_code << "let " << IRNames::localVariable(_functionCall) << " := "; + m_code << IRNames::function(*m_context.env, *functionDefinition, functionType) << "("; auto const& arguments = _functionCall.arguments(); if (arguments.size() > 1) for (auto arg: arguments | ranges::views::drop_last(1)) diff --git a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol index 753cf42faf8f..d3a6ce2e5865 100644 --- a/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol +++ b/test/libsolidity/syntaxTests/experimental/builtin/builtin_type_definition.sol @@ -33,6 +33,7 @@ contract C { // EVMVersion: >=constantinople // compileViaYul: true // ---- +// UnimplementedFeatureError: No support for calling functions pointers yet. // Warning 2264: (0-29): Experimental features are turned on. Do not use experimental features on live deployments. // Info 4164: (31-61): Inferred type: void // Info 4164: (63-93): Inferred type: bool