summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/diag.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/diag.h b/src/diag.h
index 3bea9b2..bc741cf 100644
--- a/src/diag.h
+++ b/src/diag.h
@@ -12,6 +12,7 @@
#include "bfstd.h"
#include <stdarg.h>
+#include <stddef.h>
/**
* A source code location.
@@ -126,6 +127,37 @@ void bfs_abortf(const struct bfs_loc *loc, const char *format, ...);
# define bfs_eassert bfs_everify
#endif
+/** @internal Wrapper for unreachable(). */
+#ifdef unreachable
+# define bfs_unreachable_ unreachable
+#elif __has_builtin(__builtin_unreachable)
+# define bfs_unreachable_ __builtin_unreachable
+#else
+_noreturn
+static inline void bfs_unreachable_(void) {
+}
+#endif
+
+/**
+ * Abort in debug builds; unreachable in release builds.
+ */
+#ifdef NDEBUG
+# define bfs_unreachable(...) bfs_unreachable_()
+#else
+# define bfs_unreachable bfs_abort
+#endif
+
+/**
+ * Assert in debug builds; assume in release builds.
+ */
+#ifdef NDEBUG
+# define bfs_assume(...) bfs_assume_(__VA_ARGS__, )
+# define bfs_assume_(cond, ...) \
+ ((cond) ? (void)0 : bfs_unreachable_())
+#else
+# define bfs_assume bfs_assert
+#endif
+
struct bfs_ctx;
struct bfs_expr;