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"