From 8f570a3184ceb3342846f30b9decbb6f5799b9fc Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 11 Nov 2020 18:41:38 +0100 Subject: [PATCH] Fix calldata index access. --- .../codegen/ir/IRGeneratorForStatements.cpp | 19 +++++++++---------- .../calldata_array_function_types.sol | 2 ++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index a24e3c0dd..603d31381 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -1998,28 +1998,27 @@ void IRGeneratorForStatements::endVisit(IndexAccess const& _indexAccess) } case DataLocation::CallData: { - IRVariable var(m_context.newYulVariable(), *arrayType.baseType()); - define(var) << - m_utils.calldataArrayIndexAccessFunction(arrayType) << - "(" << - IRVariable(_indexAccess.baseExpression()).commaSeparatedList() << - ", " << - expressionAsType(*_indexAccess.indexExpression(), *TypeProvider::uint256()) << + string const indexAccessFunctionCall = + m_utils.calldataArrayIndexAccessFunction(arrayType) + + "(" + + IRVariable(_indexAccess.baseExpression()).commaSeparatedList() + + ", " + + expressionAsType(*_indexAccess.indexExpression(), *TypeProvider::uint256()) + ")\n"; if (arrayType.isByteArray()) define(_indexAccess) << m_utils.cleanupFunction(*arrayType.baseType()) << "(calldataload(" << - var.name() << + indexAccessFunctionCall << "))\n"; else if (arrayType.baseType()->isValueType()) define(_indexAccess) << m_utils.readFromCalldata(*arrayType.baseType()) << "(" << - var.commaSeparatedList() << + indexAccessFunctionCall << ")\n"; else - define(_indexAccess, var); + define(_indexAccess) << indexAccessFunctionCall; break; } } diff --git a/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_function_types.sol b/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_function_types.sol index c9ccc88a8..26045f60d 100644 --- a/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_function_types.sol +++ b/test/libsolidity/semanticTests/abiEncoderV2/calldata_array_function_types.sol @@ -25,6 +25,8 @@ contract C { return reenc ? this.f_reenc(a) : this.f(a); } } +// ==== +// compileViaYul: also // ---- // g(bool): false -> 23, 37, 71 // g(bool): true -> 23, 37, 71