diff --git a/libsolidity/codegen/YulUtilFunctions.cpp b/libsolidity/codegen/YulUtilFunctions.cpp index 56d43e5f7..1ca4c6944 100644 --- a/libsolidity/codegen/YulUtilFunctions.cpp +++ b/libsolidity/codegen/YulUtilFunctions.cpp @@ -32,6 +32,9 @@ #include #include +#include + +#include using namespace std; using namespace solidity; @@ -3884,10 +3887,17 @@ string YulUtilFunctions::inlineArrayConversionFunction(InlineArrayType const& _f _to.identifier(); vector> memberSetValues; - unsigned stackItemIndex = 0; + unsigned stackItemIndex = std::accumulate( + _from.components().begin(), + _from.components().end(), + 0u, + [](unsigned sum, Type const* component) {return sum + component->sizeOnStack();} + ); - for (auto&& [index, type]: _from.components() | ranges::views::enumerate) + for (auto&& [index, type]: _from.components() | ranges::views::enumerate | ranges::views::reverse) { + stackItemIndex -= type->sizeOnStack(); + memberSetValues.emplace_back(); memberSetValues.back()["setMember"] = Whiskers(R"( let := () @@ -3899,8 +3909,6 @@ string YulUtilFunctions::inlineArrayConversionFunction(InlineArrayType const& _f ("conversionFunction", conversionFunction(*type, *_to.baseType())) ("writeToMemory", writeToMemoryFunction(*_to.baseType())) .render(); - - stackItemIndex += type->sizeOnStack(); } return m_functionCollector.createFunction(functionName, [&]() {