diff --git a/src/libutil/error.cc b/src/libutil/error.cc index b50b1f3be..35e42823c 100644 --- a/src/libutil/error.cc +++ b/src/libutil/error.cc @@ -6,6 +6,7 @@ #include "nix/util/terminal.hh" #include "nix/util/position.hh" +#include #include #include #include "nix/util/serialise.hh" @@ -436,13 +437,19 @@ void panic(std::string_view msg) writeErr("\n\n" ANSI_RED "terminating due to unexpected unrecoverable internal error: " ANSI_NORMAL); writeErr(msg); writeErr("\n"); - abort(); + std::terminate(); } -void panic(const char * file, int line, const char * func) +void unreachable(std::source_location loc) { char buf[512]; - int n = snprintf(buf, sizeof(buf), "Unexpected condition in %s at %s:%d", func, file, line); + int n = snprintf( + buf, + sizeof(buf), + "Unexpected condition in %s at %s:%" PRIuLEAST32, + loc.function_name(), + loc.file_name(), + loc.line()); if (n < 0) panic("Unexpected condition and could not format error message"); panic(std::string_view(buf, std::min(static_cast(sizeof(buf)), n))); diff --git a/src/libutil/include/nix/util/error.hh b/src/libutil/include/nix/util/error.hh index bd21e02d3..e564ca5b9 100644 --- a/src/libutil/include/nix/util/error.hh +++ b/src/libutil/include/nix/util/error.hh @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -299,23 +300,16 @@ using NativeSysError = void throwExceptionSelfCheck(); /** - * Print a message and abort(). + * Print a message and std::terminate(). */ [[noreturn]] void panic(std::string_view msg); /** - * Print a basic error message with source position and abort(). - * Use the unreachable() macro to call this. - */ -[[noreturn]] -void panic(const char * file, int line, const char * func); - -/** - * Print a basic error message with source position and abort(). + * Print a basic error message with source position and std::terminate(). * * @note: This assumes that the logger is operational */ -#define unreachable() (::nix::panic(__FILE__, __LINE__, __func__)) +[[gnu::noinline, gnu::cold, noreturn]] void unreachable(std::source_location loc = std::source_location::current()); } // namespace nix