Browse Source

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).
hjl/pr14995
Joseph Myers 9 years ago
parent
commit
ac782f9e9a
  1. 2
      ChangeLog
  2. 16
      elf/loadtest.c

2
ChangeLog

@ -1,5 +1,7 @@
2017-06-27 Joseph Myers <joseph@codesourcery.com>
* elf/loadtest.c (OUT): Define using do { } while (0).
* time/strftime_l.c (DO_NUMBER): Define using do { } while (0).
(DO_NUMBER_SPACEPAD): Likewise.

16
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

Loading…
Cancel
Save