You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.4 KiB
71 lines
2.4 KiB
commit e4043b84c49e1cf9bcf1e8320233343ecc34f8eb |
|
Author: Joseph Myers <joseph@codesourcery.com> |
|
Date: Tue Jun 27 17:12:13 2017 +0000 |
|
|
|
Fix strftime build with GCC 8. |
|
|
|
Building with current GCC mainline fails with: |
|
|
|
strftime_l.c: In function '__strftime_internal': |
|
strftime_l.c:719:4: error: macro expands to multiple statements [-Werror=multistatement-macros] |
|
digits = d > width ? d : width; \ |
|
^ |
|
strftime_l.c:1260:6: note: in expansion of macro 'DO_NUMBER' |
|
DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); |
|
^~~~~~~~~ |
|
strftime_l.c:1259:4: note: some parts of macro expansion are not guarded by this 'else' clause |
|
else |
|
^~~~ |
|
|
|
In fact this particular instance is harmless; the code looks like: |
|
|
|
if (modifier == L_('O')) |
|
goto bad_format; |
|
else |
|
DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE); |
|
|
|
and because of the goto, it doesn't matter that part of the expansion |
|
isn't under the "else" conditional. But it's also clearly bad style |
|
to rely on that. This patch changes DO_NUMBER and DO_NUMBER_SPACEPAD |
|
to use do { } while (0) to avoid such problems. |
|
|
|
Tested (full testsuite) for x86_64 (GCC 6), and with |
|
build-many-glibcs.py with GCC mainline, in conjunction with my libgcc |
|
patch <https://gcc.gnu.org/ml/gcc-patches/2017-06/msg02032.html>. |
|
|
|
* time/strftime_l.c (DO_NUMBER): Define using do { } while (0). |
|
(DO_NUMBER_SPACEPAD): Likewise. |
|
|
|
Index: b/time/strftime_l.c |
|
=================================================================== |
|
--- a/time/strftime_l.c |
|
+++ b/time/strftime_l.c |
|
@@ -715,12 +715,22 @@ __strftime_internal (CHAR_T *s, size_t m |
|
format_char = *f; |
|
switch (format_char) |
|
{ |
|
-#define DO_NUMBER(d, v) \ |
|
- digits = d > width ? d : width; \ |
|
- number_value = v; goto do_number |
|
-#define DO_NUMBER_SPACEPAD(d, v) \ |
|
- digits = d > width ? d : width; \ |
|
- number_value = v; goto do_number_spacepad |
|
+#define DO_NUMBER(d, v) \ |
|
+ do \ |
|
+ { \ |
|
+ digits = d > width ? d : width; \ |
|
+ number_value = v; \ |
|
+ goto do_number; \ |
|
+ } \ |
|
+ while (0) |
|
+#define DO_NUMBER_SPACEPAD(d, v) \ |
|
+ do \ |
|
+ { \ |
|
+ digits = d > width ? d : width; \ |
|
+ number_value = v; \ |
|
+ goto do_number_spacepad; \ |
|
+ } \ |
|
+ while (0) |
|
|
|
case L_('%'): |
|
if (modifier != 0)
|
|
|