diff --git a/doc/manual/expressions/builtins.xml b/doc/manual/expressions/builtins.xml
index cefc8b78e..0fb5261b3 100644
--- a/doc/manual/expressions/builtins.xml
+++ b/doc/manual/expressions/builtins.xml
@@ -861,6 +861,14 @@ x: x + 456
+ builtins.isPath
+ e
+
+ Return true if
+ e evaluates to a path, and
+ false otherwise.
+
+
isNull
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 6b0c55e72..39073725e 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -315,6 +315,12 @@ static void prim_isBool(EvalState & state, const Pos & pos, Value * * args, Valu
mkBool(v, args[0]->type == tBool);
}
+/* Determine whether the argument is a path. */
+static void prim_isPath(EvalState & state, const Pos & pos, Value * * args, Value & v)
+{
+ state.forceValue(*args[0]);
+ mkBool(v, args[0]->type == tPath);
+}
struct CompareValues
{
@@ -2169,6 +2175,7 @@ void EvalState::createBaseEnv()
addPrimOp("__isInt", 1, prim_isInt);
addPrimOp("__isFloat", 1, prim_isFloat);
addPrimOp("__isBool", 1, prim_isBool);
+ addPrimOp("__isPath", 1, prim_isPath);
addPrimOp("__genericClosure", 1, prim_genericClosure);
addPrimOp("abort", 1, prim_abort);
addPrimOp("__addErrorContext", 2, prim_addErrorContext);
diff --git a/tests/lang/eval-okay-types.nix b/tests/lang/eval-okay-types.nix
index a34775f5e..9b58be5d1 100644
--- a/tests/lang/eval-okay-types.nix
+++ b/tests/lang/eval-okay-types.nix
@@ -20,6 +20,8 @@ with builtins;
(isFloat (1 - 2.0))
(isBool (true && false))
(isBool null)
+ (isPath /nix/store)
+ (isPath ./.)
(isAttrs { x = 123; })
(isAttrs null)
(typeOf (3 * 4))