Browse Source

compiler: NORETURN

Rusty Russell 15 years ago
parent
commit
6e1cdb3d8b
3 changed files with 22 additions and 0 deletions
  1. 18 0
      ccan/compiler/compiler.h
  2. 1 0
      config.h
  3. 3 0
      tools/configurator/configurator.c

+ 18 - 0
ccan/compiler/compiler.h

@@ -20,6 +20,24 @@
 #define COLD
 #define COLD
 #endif
 #endif
 
 
+#if HAVE_ATTRIBUTE_NORETURN
+/**
+ * NORETURN - a function does not return
+ *
+ * Used to mark a function which exits; useful for suppressing warnings.
+ *
+ * Example:
+ * static void NORETURN fail(const char *reason)
+ * {
+ *	fprintf(stderr, "Error: %s (%s)\n", reason, strerror(errno));
+ *	exit(1);
+ * }
+ */
+#define NORETURN __attribute__((noreturn))
+#else
+#define NORETURN
+#endif
+
 #if HAVE_ATTRIBUTE_PRINTF
 #if HAVE_ATTRIBUTE_PRINTF
 /**
 /**
  * PRINTF_FMT - a function takes printf-style arguments
  * PRINTF_FMT - a function takes printf-style arguments

+ 1 - 0
config.h

@@ -6,6 +6,7 @@
 #define HAVE_ATTRIBUTE_COLD 1
 #define HAVE_ATTRIBUTE_COLD 1
 #define HAVE_ATTRIBUTE_CONST 1
 #define HAVE_ATTRIBUTE_CONST 1
 #define HAVE_ATTRIBUTE_MAY_ALIAS 1
 #define HAVE_ATTRIBUTE_MAY_ALIAS 1
+#define HAVE_ATTRIBUTE_NORETURN 1
 #define HAVE_ATTRIBUTE_PRINTF 1
 #define HAVE_ATTRIBUTE_PRINTF 1
 #define HAVE_ATTRIBUTE_UNUSED 1
 #define HAVE_ATTRIBUTE_UNUSED 1
 #define HAVE_ATTRIBUTE_USED 1
 #define HAVE_ATTRIBUTE_USED 1

+ 3 - 0
tools/configurator/configurator.c

@@ -44,6 +44,9 @@ static struct test tests[] = {
 	  "static int __attribute__((const)) func(int x) { return x; }" },
 	  "static int __attribute__((const)) func(int x) { return x; }" },
 	{ "HAVE_ATTRIBUTE_MAY_ALIAS", OUTSIDE_MAIN, NULL,
 	{ "HAVE_ATTRIBUTE_MAY_ALIAS", OUTSIDE_MAIN, NULL,
 	  "typedef short __attribute__((__may_alias__)) short_a;" },
 	  "typedef short __attribute__((__may_alias__)) short_a;" },
+	{ "HAVE_ATTRIBUTE_NORETURN", DEFINES_FUNC, NULL,
+	  "#include <stdlib.h>\n"
+	  "static void __attribute__((noreturn)) func(int x) { exit(x); }" },
 	{ "HAVE_ATTRIBUTE_PRINTF", DEFINES_FUNC, NULL,
 	{ "HAVE_ATTRIBUTE_PRINTF", DEFINES_FUNC, NULL,
 	  "static void __attribute__((format(__printf__, 1, 2))) func(const char *fmt, ...) { }" },
 	  "static void __attribute__((format(__printf__, 1, 2))) func(const char *fmt, ...) { }" },
 	{ "HAVE_ATTRIBUTE_UNUSED", OUTSIDE_MAIN, NULL,
 	{ "HAVE_ATTRIBUTE_UNUSED", OUTSIDE_MAIN, NULL,