From 78dca8153f802f271b4f2aeca33d967a075e485e Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@gmail.com>
Date: Wed, 16 Nov 2011 17:01:02 -0500
Subject: Add a dmnsn_unreachable() macro.

Also rename inline.h to compiler.h.
---
 libdimension/dimension/compiler.h | 52 +++++++++++++++++++++++++++++++++++++++
 libdimension/dimension/error.h    | 20 ++++++++++++---
 libdimension/dimension/inline.h   | 49 ------------------------------------
 3 files changed, 69 insertions(+), 52 deletions(-)
 create mode 100644 libdimension/dimension/compiler.h
 delete mode 100644 libdimension/dimension/inline.h

(limited to 'libdimension/dimension')

diff --git a/libdimension/dimension/compiler.h b/libdimension/dimension/compiler.h
new file mode 100644
index 0000000..5ce8ce8
--- /dev/null
+++ b/libdimension/dimension/compiler.h
@@ -0,0 +1,52 @@
+/*************************************************************************
+ * Copyright (C) 2009-2010 Tavian Barnes <tavianator@tavianator.com>     *
+ *                                                                       *
+ * This file is part of The Dimension Library.                           *
+ *                                                                       *
+ * The Dimension Library is free software; you can redistribute it and/  *
+ * or modify it under the terms of the GNU Lesser General Public License *
+ * as published by the Free Software Foundation; either version 3 of the *
+ * License, or (at your option) any later version.                       *
+ *                                                                       *
+ * The Dimension Library is distributed in the hope that it will be      *
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty   *
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
+ * Lesser General Public License for more details.                       *
+ *                                                                       *
+ * You should have received a copy of the GNU Lesser General Public      *
+ * License along with this program.  If not, see                         *
+ * <http://www.gnu.org/licenses/>.                                       *
+ *************************************************************************/
+
+/**
+ * @file
+ * Compiler abstractions.
+ */
+
+/**
+ * @def DMNSN_INLINE
+ * A portable inline specifier. Expands to the correct method of declaring
+ * inline functions for the version of C you are using.
+ */
+#ifndef DMNSN_INLINE
+  #ifdef __cplusplus
+    /* C++ inline semantics */
+    #define DMNSN_INLINE inline
+  #elif __STDC_VERSION__ >= 199901L
+    /* C99 inline semantics */
+    #define DMNSN_INLINE inline
+  #elif defined(__GNUC__)
+    /* GCC inline semantics */
+    #define DMNSN_INLINE __extension__ extern __inline__
+  #else
+    /* Unknown C - mark functions static and hope the compiler is smart enough
+       to inline them */
+    #define DMNSN_INLINE static
+  #endif
+#endif
+
+#ifdef __GNUC__
+  #define DMNSN_UNREACHABLE() __builtin_unreachable();
+#else
+  #define DMNSN_UNREACHABLE()
+#endif
diff --git a/libdimension/dimension/error.h b/libdimension/dimension/error.h
index ae8ba01..894899a 100644
--- a/libdimension/dimension/error.h
+++ b/libdimension/dimension/error.h
@@ -39,8 +39,11 @@
  * Report an error.
  * @param[in] str       A string to print explaining the error.
  */
-#define dmnsn_error(str)                                        \
-  dmnsn_report_error(true, DMNSN_FUNC, __FILE__, __LINE__, str)
+#define dmnsn_error(str)                                                \
+  do {                                                                  \
+    dmnsn_report_error(true, DMNSN_FUNC, __FILE__, __LINE__, str);      \
+    DMNSN_UNREACHABLE();                                                \
+  } while (0)
 
 /**
  * @def dmnsn_assert
@@ -54,11 +57,22 @@
   #define dmnsn_assert(expr, str)                 \
     do {                                          \
       if (!(expr)) {                              \
-        dmnsn_error((str));  \
+        dmnsn_error((str));                       \
       }                                           \
     } while (0)
 #endif
 
+/**
+ * @def dmnsn_unreachable
+ * Express that a line of code is unreachable.
+ * @param[in] str  A string to print if the line is reached.
+ */
+#ifdef NDEBUG
+  #define dmnsn_unreachable(str) DMNSN_UNREACHABLE()
+#else
+  #define dmnsn_unreachable(str) dmnsn_error((str))
+#endif
+
 /**
  * @internal
  * Called by dmnsn_warning() and dmnsn_error(); don't call directly.
diff --git a/libdimension/dimension/inline.h b/libdimension/dimension/inline.h
deleted file mode 100644
index e17c60e..0000000
--- a/libdimension/dimension/inline.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*************************************************************************
- * Copyright (C) 2009-2010 Tavian Barnes <tavianator@tavianator.com>     *
- *                                                                       *
- * This file is part of The Dimension Library.                           *
- *                                                                       *
- * The Dimension Library is free software; you can redistribute it and/  *
- * or modify it under the terms of the GNU Lesser General Public License *
- * as published by the Free Software Foundation; either version 3 of the *
- * License, or (at your option) any later version.                       *
- *                                                                       *
- * The Dimension Library is distributed in the hope that it will be      *
- * useful, but WITHOUT ANY WARRANTY; without even the implied warranty   *
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
- * Lesser General Public License for more details.                       *
- *                                                                       *
- * You should have received a copy of the GNU Lesser General Public      *
- * License along with this program.  If not, see                         *
- * <http://www.gnu.org/licenses/>.                                       *
- *************************************************************************/
-
-/**
- * @file
- * Inline function support. Handle inlines nicely without cheating and making
- * them static.  The DMNSN_INLINE macro is set appropriately for the version of
- * C you're using, and non-inline versions are emitted in exactly one
- * translation unit when necessary.
- */
-
-/**
- * @def DMNSN_INLINE
- * A portable inline specifier. Expands to the correct method of declaring
- * inline functions for the version of C you are using.
- */
-#ifndef DMNSN_INLINE
-  #ifdef __cplusplus
-    /* C++ inline semantics */
-    #define DMNSN_INLINE inline
-  #elif __STDC_VERSION__ >= 199901L
-    /* C99 inline semantics */
-    #define DMNSN_INLINE inline
-  #elif defined(__GNUC__)
-    /* GCC inline semantics */
-    #define DMNSN_INLINE __extension__ extern __inline__
-  #else
-    /* Unknown C - mark functions static and hope the compiler is smart enough
-       to inline them */
-    #define DMNSN_INLINE static
-  #endif
-#endif
-- 
cgit v1.2.3