Skip to content

Commit

Permalink
builtins.warn: Require string argument
Browse files Browse the repository at this point in the history
... 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.
  • Loading branch information
roberth committed Apr 24, 2024
1 parent f8efb69 commit 582de3b
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 10 deletions.
12 changes: 4 additions & 8 deletions src/libexpr/primops.cc
Expand Up @@ -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;
Expand Down
6 changes: 4 additions & 2 deletions tests/functional/lang.sh
Expand Up @@ -33,8 +33,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"

Expand Down

0 comments on commit 582de3b

Please sign in to comment.