1*4882a593SmuzhiyunFrom 509c5974398952618abdd17f39117b88e3f50057 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Paul Eggert <eggert@cs.ucla.edu>
3*4882a593SmuzhiyunDate: Thu, 1 Dec 2022 10:28:04 -0800
4*4882a593SmuzhiyunSubject: [PATCH] Fix C23-related conformance bug
5*4882a593SmuzhiyunMIME-Version: 1.0
6*4882a593SmuzhiyunContent-Type: text/plain; charset=UTF-8
7*4882a593SmuzhiyunContent-Transfer-Encoding: 8bit
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunProblem reported by Houge Langley for ‘gcc -std=gnu99’ in:
10*4882a593Smuzhiyunhttps://bugs.gentoo.org/show_bug.cgi?id=883719
11*4882a593Smuzhiyun* NEWS: Mention this.
12*4882a593Smuzhiyun* date.c, localtime.c, private.h, zdump.c, zic.c:
13*4882a593SmuzhiyunUse ATTRIBUTE_* at the start of function declarations,
14*4882a593Smuzhiyunnot later (such as after the keyword ‘static’).
15*4882a593SmuzhiyunThis is required for strict conformance to C23.
16*4882a593Smuzhiyun
17*4882a593SmuzhiyunUpstream-Status: Backport [https://github.com/eggert/tz/commit/9cfe9507fcc22cd4a0c4da486ea1c7f0de6b075f]
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunNEWS change skipped to avoid conflicts.
20*4882a593Smuzhiyun
21*4882a593SmuzhiyunSigned-off-by: Martin Jansa <Martin.Jansa@gmail.com>
22*4882a593Smuzhiyun---
23*4882a593Smuzhiyun date.c      |  2 +-
24*4882a593Smuzhiyun localtime.c |  4 ++--
25*4882a593Smuzhiyun private.h   |  6 +++---
26*4882a593Smuzhiyun zdump.c     | 12 ++++++------
27*4882a593Smuzhiyun zic.c       | 34 +++++++++++++++++-----------------
28*4882a593Smuzhiyun 5 files changed, 29 insertions(+), 29 deletions(-)
29*4882a593Smuzhiyun
30*4882a593Smuzhiyundiff --git a/date.c b/date.c
31*4882a593Smuzhiyunindex 11c5e5fe..97df6ab0 100644
32*4882a593Smuzhiyun--- a/date.c
33*4882a593Smuzhiyun+++ b/date.c
34*4882a593Smuzhiyun@@ -42,7 +42,7 @@ static void		display(const char *, time_t);
35*4882a593Smuzhiyun static void		dogmt(void);
36*4882a593Smuzhiyun static void		errensure(void);
37*4882a593Smuzhiyun static void		timeout(FILE *, const char *, const struct tm *);
38*4882a593Smuzhiyun-static ATTRIBUTE_NORETURN void usage(void);
39*4882a593Smuzhiyun+ATTRIBUTE_NORETURN static void usage(void);
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun int
42*4882a593Smuzhiyun main(const int argc, char *argv[])
43*4882a593Smuzhiyundiff --git a/localtime.c b/localtime.c
44*4882a593Smuzhiyunindex 1d22d351..3bf1b911 100644
45*4882a593Smuzhiyun--- a/localtime.c
46*4882a593Smuzhiyun+++ b/localtime.c
47*4882a593Smuzhiyun@@ -838,7 +838,7 @@ is_digit(char c)
48*4882a593Smuzhiyun ** Return a pointer to that character.
49*4882a593Smuzhiyun */
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE const char *
52*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static const char *
53*4882a593Smuzhiyun getzname(register const char *strp)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	register char	c;
56*4882a593Smuzhiyun@@ -859,7 +859,7 @@ getzname(register const char *strp)
57*4882a593Smuzhiyun ** We don't do any checking here; checking is done later in common-case code.
58*4882a593Smuzhiyun */
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE const char *
61*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static const char *
62*4882a593Smuzhiyun getqzname(register const char *strp, const int delim)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	register int	c;
65*4882a593Smuzhiyundiff --git a/private.h b/private.h
66*4882a593Smuzhiyunindex 7a73eff7..ae522986 100644
67*4882a593Smuzhiyun--- a/private.h
68*4882a593Smuzhiyun+++ b/private.h
69*4882a593Smuzhiyun@@ -628,7 +628,7 @@ char *asctime(struct tm const *);
70*4882a593Smuzhiyun char *asctime_r(struct tm const *restrict, char *restrict);
71*4882a593Smuzhiyun char *ctime(time_t const *);
72*4882a593Smuzhiyun char *ctime_r(time_t const *, char *);
73*4882a593Smuzhiyun-double difftime(time_t, time_t) ATTRIBUTE_UNSEQUENCED;
74*4882a593Smuzhiyun+ATTRIBUTE_UNSEQUENCED double difftime(time_t, time_t);
75*4882a593Smuzhiyun size_t strftime(char *restrict, size_t, char const *restrict,
76*4882a593Smuzhiyun 		struct tm const *restrict);
77*4882a593Smuzhiyun # if HAVE_STRFTIME_L
78*4882a593Smuzhiyun@@ -740,10 +740,10 @@ timezone_t tzalloc(char const *);
79*4882a593Smuzhiyun void tzfree(timezone_t);
80*4882a593Smuzhiyun # ifdef STD_INSPIRED
81*4882a593Smuzhiyun #  if TZ_TIME_T || !defined posix2time_z
82*4882a593Smuzhiyun-time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_REPRODUCIBLE;
83*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE time_t posix2time_z(timezone_t, time_t);
84*4882a593Smuzhiyun #  endif
85*4882a593Smuzhiyun #  if TZ_TIME_T || !defined time2posix_z
86*4882a593Smuzhiyun-time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_REPRODUCIBLE;
87*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE time_t time2posix_z(timezone_t, time_t);
88*4882a593Smuzhiyun #  endif
89*4882a593Smuzhiyun # endif
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyundiff --git a/zdump.c b/zdump.c
92*4882a593Smuzhiyunindex 7acb3e2d..3e482ba3 100644
93*4882a593Smuzhiyun--- a/zdump.c
94*4882a593Smuzhiyun+++ b/zdump.c
95*4882a593Smuzhiyun@@ -89,7 +89,7 @@ static bool	warned;
96*4882a593Smuzhiyun static bool	errout;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun static char const *abbr(struct tm const *);
99*4882a593Smuzhiyun-static intmax_t	delta(struct tm *, struct tm *) ATTRIBUTE_REPRODUCIBLE;
100*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static intmax_t delta(struct tm *, struct tm *);
101*4882a593Smuzhiyun static void dumptime(struct tm const *);
102*4882a593Smuzhiyun static time_t hunt(timezone_t, time_t, time_t, bool);
103*4882a593Smuzhiyun static void show(timezone_t, char *, time_t, bool);
104*4882a593Smuzhiyun@@ -97,7 +97,7 @@ static void showextrema(timezone_t, char *, time_t, struct tm *, time_t);
105*4882a593Smuzhiyun static void showtrans(char const *, struct tm const *, time_t, char const *,
106*4882a593Smuzhiyun 		      char const *);
107*4882a593Smuzhiyun static const char *tformat(void);
108*4882a593Smuzhiyun-static time_t yeartot(intmax_t) ATTRIBUTE_REPRODUCIBLE;
109*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static time_t yeartot(intmax_t);
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /* Is C an ASCII digit?  */
112*4882a593Smuzhiyun static bool
113*4882a593Smuzhiyun@@ -125,7 +125,7 @@ is_alpha(char a)
114*4882a593Smuzhiyun 	}
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun-static ATTRIBUTE_NORETURN void
118*4882a593Smuzhiyun+ATTRIBUTE_NORETURN static void
119*4882a593Smuzhiyun size_overflow(void)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun   fprintf(stderr, _("%s: size overflow\n"), progname);
122*4882a593Smuzhiyun@@ -134,7 +134,7 @@ size_overflow(void)
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun /* Return A + B, exiting if the result would overflow either ptrdiff_t
125*4882a593Smuzhiyun    or size_t.  */
126*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE ptrdiff_t
127*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
128*4882a593Smuzhiyun sumsize(size_t a, size_t b)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun #ifdef ckd_add
131*4882a593Smuzhiyun@@ -151,7 +151,7 @@ sumsize(size_t a, size_t b)
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun /* Return a pointer to a newly allocated buffer of size SIZE, exiting
134*4882a593Smuzhiyun    on failure.  SIZE should be nonzero.  */
135*4882a593Smuzhiyun-static void * ATTRIBUTE_MALLOC
136*4882a593Smuzhiyun+ATTRIBUTE_MALLOC static void *
137*4882a593Smuzhiyun xmalloc(size_t size)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun   void *p = malloc(size);
140*4882a593Smuzhiyun@@ -920,7 +920,7 @@ showextrema(timezone_t tz, char *zone, time_t lo, struct tm *lotmp, time_t hi)
141*4882a593Smuzhiyun # include <stdarg.h>
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun /* A substitute for snprintf that is good enough for zdump.  */
144*4882a593Smuzhiyun-static int ATTRIBUTE_FORMAT((printf, 3, 4))
145*4882a593Smuzhiyun+ATTRIBUTE_FORMAT((printf, 3, 4)) static int
146*4882a593Smuzhiyun my_snprintf(char *s, size_t size, char const *format, ...)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun   int n;
149*4882a593Smuzhiyundiff --git a/zic.c b/zic.c
150*4882a593Smuzhiyunindex 892414af..f143fcef 100644
151*4882a593Smuzhiyun--- a/zic.c
152*4882a593Smuzhiyun+++ b/zic.c
153*4882a593Smuzhiyun@@ -459,20 +459,20 @@ static char		roll[TZ_MAX_LEAPS];
154*4882a593Smuzhiyun ** Memory allocation.
155*4882a593Smuzhiyun */
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun-static ATTRIBUTE_NORETURN void
158*4882a593Smuzhiyun+ATTRIBUTE_NORETURN static void
159*4882a593Smuzhiyun memory_exhausted(const char *msg)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun 	fprintf(stderr, _("%s: Memory exhausted: %s\n"), progname, msg);
162*4882a593Smuzhiyun 	exit(EXIT_FAILURE);
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun-static ATTRIBUTE_NORETURN void
166*4882a593Smuzhiyun+ATTRIBUTE_NORETURN static void
167*4882a593Smuzhiyun size_overflow(void)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun   memory_exhausted(_("size overflow"));
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE ptrdiff_t
173*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
174*4882a593Smuzhiyun size_sum(size_t a, size_t b)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun #ifdef ckd_add
177*4882a593Smuzhiyun@@ -487,7 +487,7 @@ size_sum(size_t a, size_t b)
178*4882a593Smuzhiyun   size_overflow();
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE ptrdiff_t
182*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
183*4882a593Smuzhiyun size_product(ptrdiff_t nitems, ptrdiff_t itemsize)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun #ifdef ckd_mul
186*4882a593Smuzhiyun@@ -502,7 +502,7 @@ size_product(ptrdiff_t nitems, ptrdiff_t itemsize)
187*4882a593Smuzhiyun   size_overflow();
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE ptrdiff_t
191*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
192*4882a593Smuzhiyun align_to(ptrdiff_t size, ptrdiff_t alignment)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun   ptrdiff_t lo_bits = alignment - 1, sum = size_sum(size, lo_bits);
195*4882a593Smuzhiyun@@ -526,7 +526,7 @@ memcheck(void *ptr)
196*4882a593Smuzhiyun 	return ptr;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun-static void * ATTRIBUTE_MALLOC
200*4882a593Smuzhiyun+ATTRIBUTE_MALLOC static void *
201*4882a593Smuzhiyun emalloc(size_t size)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun   return memcheck(malloc(size));
204*4882a593Smuzhiyun@@ -538,7 +538,7 @@ erealloc(void *ptr, size_t size)
205*4882a593Smuzhiyun   return memcheck(realloc(ptr, size));
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun-static char * ATTRIBUTE_MALLOC
209*4882a593Smuzhiyun+ATTRIBUTE_MALLOC static char *
210*4882a593Smuzhiyun estrdup(char const *str)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun   return memcheck(strdup(str));
213*4882a593Smuzhiyun@@ -608,7 +608,7 @@ eat(int fnum, lineno num)
214*4882a593Smuzhiyun 	eats(fnum, num, 0, -1);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun-static void ATTRIBUTE_FORMAT((printf, 1, 0))
218*4882a593Smuzhiyun+ATTRIBUTE_FORMAT((printf, 1, 0)) static void
219*4882a593Smuzhiyun verror(const char *const string, va_list args)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun 	/*
222*4882a593Smuzhiyun@@ -626,7 +626,7 @@ verror(const char *const string, va_list args)
223*4882a593Smuzhiyun 	fprintf(stderr, "\n");
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun-static void ATTRIBUTE_FORMAT((printf, 1, 2))
227*4882a593Smuzhiyun+ATTRIBUTE_FORMAT((printf, 1, 2)) static void
228*4882a593Smuzhiyun error(const char *const string, ...)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun 	va_list args;
231*4882a593Smuzhiyun@@ -636,7 +636,7 @@ error(const char *const string, ...)
232*4882a593Smuzhiyun 	errors = true;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun-static void ATTRIBUTE_FORMAT((printf, 1, 2))
236*4882a593Smuzhiyun+ATTRIBUTE_FORMAT((printf, 1, 2)) static void
237*4882a593Smuzhiyun warning(const char *const string, ...)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun 	va_list args;
240*4882a593Smuzhiyun@@ -666,7 +666,7 @@ close_file(FILE *stream, char const *dir, char const *name,
241*4882a593Smuzhiyun   }
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun-static ATTRIBUTE_NORETURN void
245*4882a593Smuzhiyun+ATTRIBUTE_NORETURN static void
246*4882a593Smuzhiyun usage(FILE *stream, int status)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun   fprintf(stream,
249*4882a593Smuzhiyun@@ -3597,7 +3597,7 @@ lowerit(char a)
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun /* case-insensitive equality */
253*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE bool
254*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static bool
255*4882a593Smuzhiyun ciequal(register const char *ap, register const char *bp)
256*4882a593Smuzhiyun {
257*4882a593Smuzhiyun 	while (lowerit(*ap) == lowerit(*bp++))
258*4882a593Smuzhiyun@@ -3606,7 +3606,7 @@ ciequal(register const char *ap, register const char *bp)
259*4882a593Smuzhiyun 	return false;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE bool
263*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static bool
264*4882a593Smuzhiyun itsabbr(register const char *abbr, register const char *word)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	if (lowerit(*abbr) != lowerit(*word))
267*4882a593Smuzhiyun@@ -3622,7 +3622,7 @@ itsabbr(register const char *abbr, register const char *word)
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun /* Return true if ABBR is an initial prefix of WORD, ignoring ASCII case.  */
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE bool
272*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static bool
273*4882a593Smuzhiyun ciprefix(char const *abbr, char const *word)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun   do
276*4882a593Smuzhiyun@@ -3725,14 +3725,14 @@ getfields(char *cp, char **array, int arrayelts)
277*4882a593Smuzhiyun 	return nsubs;
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun-static ATTRIBUTE_NORETURN void
281*4882a593Smuzhiyun+ATTRIBUTE_NORETURN static void
282*4882a593Smuzhiyun time_overflow(void)
283*4882a593Smuzhiyun {
284*4882a593Smuzhiyun   error(_("time overflow"));
285*4882a593Smuzhiyun   exit(EXIT_FAILURE);
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE zic_t
289*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static zic_t
290*4882a593Smuzhiyun oadd(zic_t t1, zic_t t2)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun #ifdef ckd_add
293*4882a593Smuzhiyun@@ -3746,7 +3746,7 @@ oadd(zic_t t1, zic_t t2)
294*4882a593Smuzhiyun   time_overflow();
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun-static ATTRIBUTE_REPRODUCIBLE zic_t
298*4882a593Smuzhiyun+ATTRIBUTE_REPRODUCIBLE static zic_t
299*4882a593Smuzhiyun tadd(zic_t t1, zic_t t2)
300*4882a593Smuzhiyun {
301*4882a593Smuzhiyun #ifdef ckd_add
302