+/* CC0 (Public domain) - see LICENSE file for details */
#ifndef CCAN_COMPILER_H
#define CCAN_COMPILER_H
#include "config.h"
* fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno));
* }
*/
-#define COLD __attribute__((cold))
+#define COLD __attribute__((__cold__))
#else
#define COLD
#endif
* exit(1);
* }
*/
-#define NORETURN __attribute__((noreturn))
+#define NORETURN __attribute__((__noreturn__))
#else
#define NORETURN
#endif
#endif
#endif
-#ifndef IDEMPOTENT
+#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
* counter += add;
* }
*/
-#define UNNEEDED __attribute__((unused))
+#define UNNEEDED __attribute__((__unused__))
#endif
#ifndef 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
* return 0;
* }
*/
-#define UNUSED __attribute__((unused))
+#define UNUSED __attribute__((__unused__))
#endif
#else
#ifndef UNNEEDED
* 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