diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh index 631c0f396..5d1a0c4d6 100644 --- a/src/libexpr/eval-inline.hh +++ b/src/libexpr/eval-inline.hh @@ -146,7 +146,7 @@ inline void EvalState::forceList(Value & v, const PosIdx pos, std::string_view e [[gnu::always_inline]] inline CallDepth EvalState::addCallDepth(const PosIdx pos) { if (callDepth > settings.maxCallDepth) - error("stack overflow; max-call-depth exceeded").atPos(pos).debugThrow(); + error("stack overflow; max-call-depth exceeded").atPos(pos).debugThrow(); return CallDepth(callDepth); }; diff --git a/tests/functional/flakes/eval-cache.sh b/tests/functional/flakes/eval-cache.sh index 40a0db618..75a2c8cac 100755 --- a/tests/functional/flakes/eval-cache.sh +++ b/tests/functional/flakes/eval-cache.sh @@ -22,6 +22,11 @@ cat >"$flake1Dir/flake.nix" < \$out ''; }; + stack-depth = + let + f = x: if x == 0 then true else f (x - 1); + in + assert (f 100); self.drv; ifd = assert (import self.drv); self.drv; }; } @@ -33,6 +38,12 @@ git -C "$flake1Dir" commit -m "Init" expect 1 nix build "$flake1Dir#foo.bar" 2>&1 | grepQuiet 'error: breaks' expect 1 nix build "$flake1Dir#foo.bar" 2>&1 | grepQuiet 'error: breaks' +# Stack overflow error must not be cached +expect 1 nix build --max-call-depth 50 "$flake1Dir#stack-depth" 2>&1 \ + | grepQuiet 'error: stack overflow; max-call-depth exceeded' +# If the SO is cached, the following invocation will produce a cached failure; we expect it to succeed +nix build --no-link "$flake1Dir#stack-depth" + # Conditional error should not be cached expect 1 nix build "$flake1Dir#ifd" --option allow-import-from-derivation false 2>&1 \ | grepQuiet 'error: cannot build .* during evaluation because the option '\''allow-import-from-derivation'\'' is disabled'