diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index b8ed0a6aad5..ba52e813ba6 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1987,11 +1987,15 @@ void ExprOpUpdate::eval(EvalState & state, Env & env, Value & v) UpdateQueue q; evalForUpdate(state, env, q); - v.mkAttrs(&Bindings::emptyBindings); + Value vTmp; + vTmp.mkAttrs(&Bindings::emptyBindings); + for (auto & rhs : std::views::reverse(q)) { /* Remember that queue is sorted rightmost attrset first. */ - eval(state, /*v=*/v, /*v1=*/v, /*v2=*/rhs); + eval(state, /*v=*/vTmp, /*v1=*/vTmp, /*v2=*/rhs); } + + v = vTmp; } void Expr::evalForUpdate(EvalState & state, Env & env, UpdateQueue & q, std::string_view errorCtx)