diff --git a/src/libexpr/eval-cache.cc b/src/libexpr/eval-cache.cc index a23d4eb80..4e44e68cf 100644 --- a/src/libexpr/eval-cache.cc +++ b/src/libexpr/eval-cache.cc @@ -618,21 +618,21 @@ string_t AttrCursor::getStringWithContext() if (auto s = std::get_if(&cachedValue->second)) { bool valid = true; for (auto & c : s->second) { - const StorePath & path = std::visit(overloaded { - [&](const NixStringContextElem::DrvDeep & d) -> const StorePath & { - return d.drvPath; + const StorePath * path = std::visit(overloaded { + [&](const NixStringContextElem::DrvDeep & d) -> const StorePath * { + return &d.drvPath; }, - [&](const NixStringContextElem::Built & b) -> const StorePath & { - return b.drvPath->getBaseStorePath(); + [&](const NixStringContextElem::Built & b) -> const StorePath * { + return &b.drvPath->getBaseStorePath(); }, - [&](const NixStringContextElem::Opaque & o) -> const StorePath & { - return o.path; + [&](const NixStringContextElem::Opaque & o) -> const StorePath * { + return &o.path; }, - [&](const NixStringContextElem::Path & p) -> const StorePath & { - abort(); // FIXME + [&](const NixStringContextElem::Path & p) -> const StorePath * { + return nullptr; }, }, c.raw); - if (!root->state.store->isValidPath(path)) { + if (!path || !root->state.store->isValidPath(*path)) { valid = false; break; } diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 2c2950471..85c044c2f 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -2512,7 +2512,9 @@ std::pair EvalState::coerceToSingleDerivedP return std::move(b); }, [&](NixStringContextElem::Path && p) -> SingleDerivedPath { - abort(); // FIXME + error( + "string '%s' has no context", + s).withTrace(pos, errorCtx).debugThrow(); }, }, ((NixStringContextElem &&) *context.begin()).raw); return { diff --git a/src/libexpr/primops/context.cc b/src/libexpr/primops/context.cc index d8fd03737..28153c778 100644 --- a/src/libexpr/primops/context.cc +++ b/src/libexpr/primops/context.cc @@ -150,8 +150,9 @@ static void prim_addDrvOutputDependencies(EvalState & state, const PosIdx pos, V return std::move(c); }, [&](const NixStringContextElem::Path & p) -> NixStringContextElem::DrvDeep { - // FIXME: don't know what to do here. - abort(); + state.error( + "`addDrvOutputDependencies` does not work on a string without context" + ).atPos(pos).debugThrow(); }, }, context.begin()->raw) }), }; diff --git a/src/nix/app.cc b/src/nix/app.cc index 568c54572..0ba231c41 100644 --- a/src/nix/app.cc +++ b/src/nix/app.cc @@ -93,7 +93,7 @@ UnresolvedApp InstallableValue::toApp(EvalState & state) }; }, [&](const NixStringContextElem::Path & p) -> DerivedPath { - abort(); // FIXME + throw Error("'program' attribute of an 'app' output cannot have no context"); }, }, c.raw)); }