From ac782f9e9ab0a39a3054e4c97653fafa8ea47a62 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 27 Jun 2017 17:52:42 +0000 Subject: [PATCH] Fix elf/loadtest.c build with GCC 8. Building the testsuite with current GCC mainline fails with: loadtest.c: In function 'main': loadtest.c:76:3: error: macro expands to multiple statements [-Werror=multistatement-macros] for (map = MAPS; map != NULL; map = map->l_next) \ ^ loadtest.c:165:2: note: in expansion of macro 'OUT' OUT; ^~~ loadtest.c:164:7: note: some parts of macro expansion are not guarded by this 'if' clause if (debug) ^~ This seems like a genuine bug, although fairly harmless; it means the fflush call in the OUT macro is unconditional instead of being inside the conditional as presumably intended. This patch makes this macro use do { } while (0) to avoid the problem. Tested for x86_64 (testsuite), and with build-many-glibcs.py for aarch64-linux-gnu with GCC mainline. * elf/loadtest.c (OUT): Define using do { } while (0). --- ChangeLog | 2 ++ elf/loadtest.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6ed7f08529..ce383693fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2017-06-27 Joseph Myers + * elf/loadtest.c (OUT): Define using do { } while (0). + * time/strftime_l.c (DO_NUMBER): Define using do { } while (0). (DO_NUMBER_SPACEPAD): Likewise. diff --git a/elf/loadtest.c b/elf/loadtest.c index 727469b496..b5eab5e93c 100644 --- a/elf/loadtest.c +++ b/elf/loadtest.c @@ -72,12 +72,16 @@ static const struct #define MAPS ((struct link_map *) _r_debug.r_map) -#define OUT \ - for (map = MAPS; map != NULL; map = map->l_next) \ - if (map->l_type == lt_loaded) \ - printf ("name = \"%s\", direct_opencount = %d\n", \ - map->l_name, (int) map->l_direct_opencount); \ - fflush (stdout) +#define OUT \ + do \ + { \ + for (map = MAPS; map != NULL; map = map->l_next) \ + if (map->l_type == lt_loaded) \ + printf ("name = \"%s\", direct_opencount = %d\n", \ + map->l_name, (int) map->l_direct_opencount); \ + fflush (stdout); \ + } \ + while (0) int