builtins.warn: Require string argument

... so that we may perhaps later extend the interface.
Note that Nixpkgs' lib.warn already requires a string coercible
argument, so this is reasonable. Also note that string coercible
values aren't all strings, but in practice, for warn, they are.
This commit is contained in:
Robert Hensing 2024-04-24 10:56:32 +02:00
parent 923cbea2af
commit da82d67022
2 changed files with 8 additions and 10 deletions

View File

@ -1045,16 +1045,12 @@ static RegisterPrimOp primop_trace({
static void prim_warn(EvalState & state, const PosIdx pos, Value * * args, Value & v)
{
state.forceValue(*args[0], pos);
// We only accept a string argument for now. The use case for pretty printing a value is covered by `trace`.
// By rejecting non-strings we allow future versions to add more features without breaking existing code.
auto msgStr = state.forceString(*args[0], pos, "while evaluating the first argument; the message passed to builtins.warn");
{
BaseError msg(args[0]->type() == nString
? std::string(args[0]->string_view())
: ({
std::stringstream s;
s << ValuePrinter(state, *args[0]);
s.str();
}));
BaseError msg(std::string{msgStr});
msg.atPos(state.positions[pos]);
auto info = msg.info();
info.level = lvlWarn;

View File

@ -38,8 +38,10 @@ nix-instantiate --eval -E 'let x = { repeating = x; tracing = builtins.trace x t
nix-instantiate --eval -E 'builtins.warn "Hello" 123' 2>&1 | grepQuiet 'warning: Hello'
nix-instantiate --eval -E 'builtins.addErrorContext "while doing ${"something"} interesting" (builtins.warn "Hello" 123)' 2>/dev/null | grepQuiet 123
nix-instantiate --eval -E 'let x = builtins.warn { x = x; } true; in x' \
2>&1 | grepQuiet -E 'warning: { x = «potential infinite recursion»; }'
# warn does not accept non-strings for now
expectStderr 1 nix-instantiate --eval -E 'let x = builtins.warn { x = x; } true; in x' \
| grepQuiet "expected a string but found a set"
expectStderr 1 nix-instantiate --eval --abort-on-warn -E 'builtins.warn "Hello" 123' | grepQuiet Hello
NIX_ABORT_ON_WARN=1 expectStderr 1 nix-instantiate --eval -E 'builtins.addErrorContext "while doing ${"something"} interesting" (builtins.warn "Hello" 123)' | grepQuiet "while doing something interesting"