+/* CC0 (Public domain) - see LICENSE file for details */
#ifndef CCAN_COMPILER_H
#define CCAN_COMPILER_H
#include "config.h"
+#ifndef COLD
#if HAVE_ATTRIBUTE_COLD
/**
* COLD - a function is unlikely to be called.
* fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno));
* }
*/
-#define COLD __attribute__((cold))
+#define COLD __attribute__((__cold__))
#else
#define COLD
#endif
+#endif
+#ifndef NORETURN
#if HAVE_ATTRIBUTE_NORETURN
/**
* NORETURN - a function does not return
* exit(1);
* }
*/
-#define NORETURN __attribute__((noreturn))
+#define NORETURN __attribute__((__noreturn__))
#else
#define NORETURN
#endif
+#endif
+#ifndef PRINTF_FMT
#if HAVE_ATTRIBUTE_PRINTF
/**
* PRINTF_FMT - a function takes printf-style arguments
#else
#define PRINTF_FMT(nfmt, narg)
#endif
+#endif
+#ifndef CONST_FUNCTION
#if HAVE_ATTRIBUTE_CONST
/**
- * IDEMPOTENT - a function's return depends only on its argument
+ * CONST_FUNCTION - a function's return depends only on its argument
*
* This allows the compiler to assume that the function will return the exact
* same value for the exact same arguments. This implies that the function
* must not use global variables, or dereference pointer arguments.
*/
-#define IDEMPOTENT __attribute__((const))
+#define CONST_FUNCTION __attribute__((__const__))
#else
-#define IDEMPOTENT
+#define CONST_FUNCTION
+#endif
+
+#ifndef PURE_FUNCTION
+#if HAVE_ATTRIBUTE_PURE
+/**
+ * PURE_FUNCTION - a function is pure
+ *
+ * A pure function is one that has no side effects other than it's return value
+ * and uses no inputs other than it's arguments and global variables.
+ */
+#define PURE_FUNCTION __attribute__((__pure__))
+#else
+#define PURE_FUNCTION
+#endif
+#endif
#endif
#if HAVE_ATTRIBUTE_UNUSED
+#ifndef UNNEEDED
/**
* UNNEEDED - a variable/function may not be needed
*
* counter += add;
* }
*/
-#define UNNEEDED __attribute__((unused))
+#define UNNEEDED __attribute__((__unused__))
+#endif
+#ifndef NEEDED
#if HAVE_ATTRIBUTE_USED
/**
* NEEDED - a variable/function is needed
* printf("Counter is %i\n", counter);
* }
*/
-#define NEEDED __attribute__((used))
+#define NEEDED __attribute__((__used__))
#else
/* Before used, unused functions and vars were always emitted. */
-#define NEEDED __attribute__((unused))
+#define NEEDED __attribute__((__unused__))
+#endif
#endif
+#ifndef UNUSED
/**
* UNUSED - a parameter is unused
*
* return 0;
* }
*/
-#define UNUSED __attribute__((unused))
+#define UNUSED __attribute__((__unused__))
+#endif
#else
+#ifndef UNNEEDED
#define UNNEEDED
+#endif
+#ifndef NEEDED
#define NEEDED
+#endif
+#ifndef UNUSED
#define UNUSED
#endif
+#endif
+#ifndef IS_COMPILE_CONSTANT
#if HAVE_BUILTIN_CONSTANT_P
/**
* IS_COMPILE_CONSTANT - does the compiler know the value of this expression?
/* If we don't know, assume it's not. */
#define IS_COMPILE_CONSTANT(expr) 0
#endif
+#endif
+#ifndef WARN_UNUSED_RESULT
#if HAVE_WARN_UNUSED_RESULT
/**
* WARN_UNUSED_RESULT - warn if a function return value is unused.
* return realloc(buf, (*size) *= 2);
* }
*/
-#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+#define WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
#else
#define WARN_UNUSED_RESULT
#endif
+#endif
#endif /* CCAN_COMPILER_H */