[tz] [PROPOSED 1/5] Use C23 [[noreturn]] if available

Paul Eggert eggert at cs.ucla.edu
Mon Nov 21 18:36:39 UTC 2022


* private.h (ATTRIBUTE_NORETURN): Rename from _Noreturn, which
C23 says is obsolescent, and use C23-style [[noreturn]] if available.
All uses of _Noreturn changed.
---
 date.c    |  2 +-
 private.h | 15 +++++++++++----
 zdump.c   |  2 +-
 zic.c     |  8 ++++----
 4 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/date.c b/date.c
index 13194629..11c5e5fe 100644
--- a/date.c
+++ b/date.c
@@ -42,7 +42,7 @@ static void		display(const char *, time_t);
 static void		dogmt(void);
 static void		errensure(void);
 static void		timeout(FILE *, const char *, const struct tm *);
-static _Noreturn void	usage(void);
+static ATTRIBUTE_NORETURN void usage(void);
 
 int
 main(const int argc, char *argv[])
diff --git a/private.h b/private.h
index 84facded..fa46094b 100644
--- a/private.h
+++ b/private.h
@@ -446,11 +446,18 @@ typedef unsigned long uintmax_t;
 # endif
 #endif
 
-#if !defined _Noreturn && __STDC_VERSION__ < 201112
-# if 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
-#  define _Noreturn __attribute__((noreturn))
+#ifdef __has_c_attribute
+# if __has_c_attribute(noreturn)
+#  define ATTRIBUTE_NORETURN [[noreturn]]
+# endif
+#endif
+#ifndef ATTRIBUTE_NORETURN
+# if 201112 <= __STDC_VERSION__
+#  define ATTRIBUTE_NORETURN _Noreturn
+# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__)
+#  define ATTRIBUTE_NORETURN __attribute__((noreturn))
 # else
-#  define _Noreturn
+#  define ATTRIBUTE_NORETURN /* empty */
 # endif
 #endif
 
diff --git a/zdump.c b/zdump.c
index de1e1116..99723ac0 100644
--- a/zdump.c
+++ b/zdump.c
@@ -125,7 +125,7 @@ is_alpha(char a)
 	}
 }
 
-static _Noreturn void
+static ATTRIBUTE_NORETURN void
 size_overflow(void)
 {
   fprintf(stderr, _("%s: size overflow\n"), progname);
diff --git a/zic.c b/zic.c
index 7a7a5094..bd0cf4cd 100644
--- a/zic.c
+++ b/zic.c
@@ -459,14 +459,14 @@ static char		roll[TZ_MAX_LEAPS];
 ** Memory allocation.
 */
 
-static _Noreturn void
+static ATTRIBUTE_NORETURN void
 memory_exhausted(const char *msg)
 {
 	fprintf(stderr, _("%s: Memory exhausted: %s\n"), progname, msg);
 	exit(EXIT_FAILURE);
 }
 
-static _Noreturn void
+static ATTRIBUTE_NORETURN void
 size_overflow(void)
 {
   memory_exhausted(_("size overflow"));
@@ -666,7 +666,7 @@ close_file(FILE *stream, char const *dir, char const *name,
   }
 }
 
-static _Noreturn void
+static ATTRIBUTE_NORETURN void
 usage(FILE *stream, int status)
 {
   fprintf(stream,
@@ -3725,7 +3725,7 @@ getfields(char *cp, char **array, int arrayelts)
 	return nsubs;
 }
 
-static _Noreturn void
+static ATTRIBUTE_NORETURN void
 time_overflow(void)
 {
   error(_("time overflow"));
-- 
2.37.2



More information about the tz mailing list