etnaviv: fix a null pointer dereference
[mesa.git] / src / util / macros.h
index fb0d154370a2347e000d200c017ded341a8467a4..f5f099bb594443f25233b195e04bd148eefeeab6 100644 (file)
@@ -27,6 +27,7 @@
 #include <assert.h>
 
 #include "c99_compat.h"
+#include "c11_compat.h"
 
 /* Compute the size of an array */
 #ifndef ARRAY_SIZE
@@ -230,13 +231,30 @@ do {                       \
 #  endif
 #endif
 
+/**
+ * UNUSED marks variables (or sometimes functions) that have to be defined,
+ * but are sometimes (or always) unused beyond that. A common case is for
+ * a function parameter to be used in some build configurations but not others.
+ * Another case is fallback vfuncs that don't do anything with their params.
+ *
+ * Note that this should not be used for identifiers used in `assert()`;
+ * see ASSERTED below.
+ */
 #ifdef HAVE_FUNC_ATTRIBUTE_UNUSED
 #define UNUSED __attribute__((unused))
 #else
 #define UNUSED
 #endif
 
-#define MAYBE_UNUSED UNUSED
+/**
+ * Use ASSERTED to indicate that an identifier is unused outside of an `assert()`,
+ * so that assert-free builds don't get "unused variable" warnings.
+ */
+#ifdef NDEBUG
+#define ASSERTED UNUSED
+#else
+#define ASSERTED
+#endif
 
 #ifdef HAVE_FUNC_ATTRIBUTE_WARN_UNUSED_RESULT
 #define MUST_CHECK __attribute__((warn_unused_result))
@@ -261,7 +279,7 @@ do {                       \
  */
 #define ASSERT_BITFIELD_SIZE(STRUCT, FIELD, MAXVAL) \
    do { \
-      MAYBE_UNUSED STRUCT s;                \
+      ASSERTED STRUCT s; \
       s.FIELD = (MAXVAL); \
       assert((int) s.FIELD == (MAXVAL) && "Insufficient bitfield size!"); \
    } while (0)