* private.h (ATTRIBUTE_REPRODUCIBLE): Rename from ATTRIBUTE_PURE, and use C23 style [[reproducible]] if available. All uses changed. --- localtime.c | 4 ++-- private.h | 19 +++++++++++++++---- zdump.c | 6 +++--- zic.c | 16 ++++++++-------- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/localtime.c b/localtime.c index 4dd9d259..1d22d351 100644 --- a/localtime.c +++ b/localtime.c @@ -838,7 +838,7 @@ is_digit(char c) ** Return a pointer to that character. */ -static ATTRIBUTE_PURE const char * +static ATTRIBUTE_REPRODUCIBLE const char * getzname(register const char *strp) { register char c; @@ -859,7 +859,7 @@ getzname(register const char *strp) ** We don't do any checking here; checking is done later in common-case code. */ -static ATTRIBUTE_PURE const char * +static ATTRIBUTE_REPRODUCIBLE const char * getqzname(register const char *strp, const int delim) { register int c; diff --git a/private.h b/private.h index b9803427..643068a7 100644 --- a/private.h +++ b/private.h @@ -428,12 +428,10 @@ typedef unsigned long uintmax_t; #if 3 <= __GNUC__ # define ATTRIBUTE_CONST __attribute__((const)) # define ATTRIBUTE_MALLOC __attribute__((malloc)) -# define ATTRIBUTE_PURE __attribute__((pure)) # define ATTRIBUTE_FORMAT(spec) __attribute__((format spec)) #else # define ATTRIBUTE_CONST /* empty */ # define ATTRIBUTE_MALLOC /* empty */ -# define ATTRIBUTE_PURE /* empty */ # define ATTRIBUTE_FORMAT(spec) /* empty */ #endif @@ -472,6 +470,19 @@ typedef unsigned long uintmax_t; # endif #endif +#if HAVE_HAS_C_ATTRIBUTE +# if __has_c_attribute(reproducible) +# define ATTRIBUTE_REPRODUCIBLE [[reproducible]] +# endif +#endif +#ifndef ATTRIBUTE_REPRODUCIBLE +# if 3 <= __GNUC__ +# define ATTRIBUTE_REPRODUCIBLE __attribute__((pure)) +# else +# define ATTRIBUTE_REPRODUCIBLE /* empty */ +# endif +#endif + #if __STDC_VERSION__ < 199901 && !defined restrict # define restrict /* empty */ #endif @@ -705,10 +716,10 @@ timezone_t tzalloc(char const *); void tzfree(timezone_t); # ifdef STD_INSPIRED # if TZ_TIME_T || !defined posix2time_z -time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_PURE; +time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_REPRODUCIBLE; # endif # if TZ_TIME_T || !defined time2posix_z -time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE; +time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_REPRODUCIBLE; # endif # endif #endif diff --git a/zdump.c b/zdump.c index 99723ac0..47141655 100644 --- a/zdump.c +++ b/zdump.c @@ -89,7 +89,7 @@ static bool warned; static bool errout; static char const *abbr(struct tm const *); -static intmax_t delta(struct tm *, struct tm *) ATTRIBUTE_PURE; +static intmax_t delta(struct tm *, struct tm *) ATTRIBUTE_REPRODUCIBLE; static void dumptime(struct tm const *); static time_t hunt(timezone_t, time_t, time_t, bool); static void show(timezone_t, char *, time_t, bool); @@ -97,7 +97,7 @@ static void showextrema(timezone_t, char *, time_t, struct tm *, time_t); static void showtrans(char const *, struct tm const *, time_t, char const *, char const *); static const char *tformat(void); -static time_t yeartot(intmax_t) ATTRIBUTE_PURE; +static time_t yeartot(intmax_t) ATTRIBUTE_REPRODUCIBLE; /* Is C an ASCII digit? */ static bool @@ -134,7 +134,7 @@ size_overflow(void) /* Return A + B, exiting if the result would overflow either ptrdiff_t or size_t. */ -static ATTRIBUTE_PURE ptrdiff_t +static ATTRIBUTE_REPRODUCIBLE ptrdiff_t sumsize(size_t a, size_t b) { #ifdef ckd_add diff --git a/zic.c b/zic.c index bd0cf4cd..4af0ca27 100644 --- a/zic.c +++ b/zic.c @@ -472,7 +472,7 @@ size_overflow(void) memory_exhausted(_("size overflow")); } -static ATTRIBUTE_PURE ptrdiff_t +static ATTRIBUTE_REPRODUCIBLE ptrdiff_t size_sum(size_t a, size_t b) { #ifdef ckd_add @@ -487,7 +487,7 @@ size_sum(size_t a, size_t b) size_overflow(); } -static ATTRIBUTE_PURE ptrdiff_t +static ATTRIBUTE_REPRODUCIBLE ptrdiff_t size_product(ptrdiff_t nitems, ptrdiff_t itemsize) { #ifdef ckd_mul @@ -502,7 +502,7 @@ size_product(ptrdiff_t nitems, ptrdiff_t itemsize) size_overflow(); } -static ATTRIBUTE_PURE ptrdiff_t +static ATTRIBUTE_REPRODUCIBLE ptrdiff_t align_to(ptrdiff_t size, ptrdiff_t alignment) { ptrdiff_t lo_bits = alignment - 1, sum = size_sum(size, lo_bits); @@ -3597,7 +3597,7 @@ lowerit(char a) } /* case-insensitive equality */ -static ATTRIBUTE_PURE bool +static ATTRIBUTE_REPRODUCIBLE bool ciequal(register const char *ap, register const char *bp) { while (lowerit(*ap) == lowerit(*bp++)) @@ -3606,7 +3606,7 @@ ciequal(register const char *ap, register const char *bp) return false; } -static ATTRIBUTE_PURE bool +static ATTRIBUTE_REPRODUCIBLE bool itsabbr(register const char *abbr, register const char *word) { if (lowerit(*abbr) != lowerit(*word)) @@ -3622,7 +3622,7 @@ itsabbr(register const char *abbr, register const char *word) /* Return true if ABBR is an initial prefix of WORD, ignoring ASCII case. */ -static ATTRIBUTE_PURE bool +static ATTRIBUTE_REPRODUCIBLE bool ciprefix(char const *abbr, char const *word) { do @@ -3732,7 +3732,7 @@ time_overflow(void) exit(EXIT_FAILURE); } -static ATTRIBUTE_PURE zic_t +static ATTRIBUTE_REPRODUCIBLE zic_t oadd(zic_t t1, zic_t t2) { #ifdef ckd_add @@ -3746,7 +3746,7 @@ oadd(zic_t t1, zic_t t2) time_overflow(); } -static ATTRIBUTE_PURE zic_t +static ATTRIBUTE_REPRODUCIBLE zic_t tadd(zic_t t1, zic_t t2) { #ifdef ckd_add -- 2.37.2