From a812b6c6e628f878c485a1b78e3fc7ee90352c2c Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Fri, 21 Nov 2025 23:51:07 +0100 Subject: [PATCH] libexpr: add list index to deepSeq error traces When deepSeq encounters an error while evaluating a list element, the error trace now includes the list index, making it easier to locate the problematic element. --- src/libexpr/eval.cc | 9 ++++++- .../lang/eval-fail-deepseq-list-attr.err.exp | 25 +++++++++++++++++++ .../lang/eval-fail-deepseq-list-attr.nix | 10 ++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 tests/functional/lang/eval-fail-deepseq-list-attr.err.exp create mode 100644 tests/functional/lang/eval-fail-deepseq-list-attr.nix diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 837e674cb..0a6b199bf 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -2216,8 +2216,15 @@ void EvalState::forceValueDeep(Value & v) } else if (v.isList()) { + size_t index = 0; for (auto v2 : v.listView()) - recurse(*v2); + try { + recurse(*v2); + index++; + } catch (Error & e) { + state.addErrorTrace(e, "while evaluating list element at index %1%", index); + throw; + } } }(v); } diff --git a/tests/functional/lang/eval-fail-deepseq-list-attr.err.exp b/tests/functional/lang/eval-fail-deepseq-list-attr.err.exp new file mode 100644 index 000000000..9abd937ba --- /dev/null +++ b/tests/functional/lang/eval-fail-deepseq-list-attr.err.exp @@ -0,0 +1,25 @@ +error: + … while calling the 'deepSeq' builtin + at /pwd/lang/eval-fail-deepseq-list-attr.nix:3:1: + 2| + 3| builtins.deepSeq [ + | ^ + 4| 1 + + … while evaluating list element at index 1 + + … while evaluating the attribute 'b' + at /pwd/lang/eval-fail-deepseq-list-attr.nix:7:5: + 6| a = 2; + 7| b = throw "error in attr in list element"; + | ^ + 8| } + + … while calling the 'throw' builtin + at /pwd/lang/eval-fail-deepseq-list-attr.nix:7:9: + 6| a = 2; + 7| b = throw "error in attr in list element"; + | ^ + 8| } + + error: error in attr in list element diff --git a/tests/functional/lang/eval-fail-deepseq-list-attr.nix b/tests/functional/lang/eval-fail-deepseq-list-attr.nix new file mode 100644 index 000000000..5ffd8c196 --- /dev/null +++ b/tests/functional/lang/eval-fail-deepseq-list-attr.nix @@ -0,0 +1,10 @@ +# Test that deepSeq reports list index and attribute name in error traces. + +builtins.deepSeq [ + 1 + { + a = 2; + b = throw "error in attr in list element"; + } + 3 +] "unexpected success"