libexpr/primops: make break force its argument

previously, `builtins.break` didn't force its argument, resulting in
a value wrapped with `break` being opaque to most builtins if not
also wrapped with `seq`. see [lix-project/lix#1165] for more details
on what this can break.

this tiny fix just adds a call to `forceValue` inside `prim_break`,
but unfortunately this "breaks" a few existing tests because it
changes the call stack; those tests' golden outputs have been adjusted
without modifying their intended purpose.

Fixes #1165

[lix-project/lix#1165]: https://git.lix.systems/lix-project/lix/issues/1165

Change-Id: I5fe4ee3ff28b38aaf924125b8978130812e58fef
This commit is contained in:
blokyk
2026-03-21 18:38:43 +01:00
parent af2ef44e76
commit 66d702d28d
5 changed files with 128 additions and 23 deletions
@@ -87,18 +87,22 @@ If we :st past the frame in the backtrace with the meow in it, the meow should n
nix-repl> :quit
error:
… while calling the 'trace' builtin
at $TEST_DATA/stack_vars.nix:2:7:
1| let
2| a = builtins.trace "before inner break" (
| ^
3| let meow' = 3; in builtins.break { msg = "hello"; }
… while evaluating the file '$TEST_DATA/stack_vars.nix':
… while calling the 'break' builtin
at $TEST_DATA/stack_vars.nix:3:23:
2| a = builtins.trace "before inner break" (
3| let meow' = 3; in builtins.break { msg = "hello"; }
| ^
… while evaluating b
at $TEST_DATA/stack_vars.nix:9:3:
8| in
9| b
| ^
10|
… while calling the 'trace' builtin
at $TEST_DATA/stack_vars.nix:5:7:
4| );
5| b = builtins.trace "before outer break" (
| ^
6| let meow = 2; in builtins.break a
(stack trace truncated; use '--show-trace' to show the full trace)
error: breakpoint reached