mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-10 05:03:06 +03:00
GCC 9 has a bug (PR90731) whereby __typeof does not correctly copy exception specifiers[1]. Surprisingly, this can be quieted by declaring "#pragma system_header", or if the headers are installed in a system directory. Work around this by using the pragma for any gcc version between 9.0 and 9.2 to ensure tests continue to compile. [1] Example error from g++ 9.2.1: In file included from ../include/sys/cdefs.h:3, from ../include/features.h:465, from ../bits/libc-header-start.h:33, from ../math/math.h:27, from ../include/math.h:7, from test-math-isinff.cc:21: ../libio/bits/stdio-ldbl.h:25:20: error: declaration of ‘int sprintf(char*, const char*, ...)’ has a different exception specifier 25 | __LDBL_REDIR_DECL (sprintf) | ^~~~~~~ ../misc/sys/cdefs.h:461:26: note: in definition of macro ‘__LDBL_REDIR_DECL’ 461 | extern __typeof (name) name __asm (__ASMNAME ("__" #name "ieee128")); | ^~~~ In file included from ../include/stdio.h:5, from test-math-isinff.cc:22: ../libio/stdio.h:334:12: note: from previous declaration ‘int sprintf(char*, const char*, ...) throw ()’ 334 | extern int sprintf (char *__restrict __s, | ^~~~~~~ Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
33 lines
908 B
C
33 lines
908 B
C
#ifndef _PRINTF_H
|
|
|
|
/* Workaround PR90731 with GCC 9 when using ldbl redirects in C++. */
|
|
#include <bits/floatn.h>
|
|
#if defined __cplusplus && __LONG_DOUBLE_USES_FLOAT128 == 1
|
|
# if __GNUC_PREREQ (9, 0) && !__GNUC_PREREQ (9, 3)
|
|
# pragma GCC system_header
|
|
# endif
|
|
#endif
|
|
|
|
#include <stdio-common/printf.h>
|
|
|
|
# ifndef _ISOMAC
|
|
|
|
#include <bits/types/locale_t.h>
|
|
|
|
/* Now define the internal interfaces. */
|
|
extern int __printf_fphex (FILE *, const struct printf_info *,
|
|
const void *const *) attribute_hidden;
|
|
extern int __printf_fp (FILE *, const struct printf_info *,
|
|
const void *const *);
|
|
libc_hidden_proto (__printf_fp)
|
|
extern int __printf_fp_l (FILE *, locale_t, const struct printf_info *,
|
|
const void *const *);
|
|
libc_hidden_proto (__printf_fp_l)
|
|
|
|
extern unsigned int __guess_grouping (unsigned int intdig_max,
|
|
const char *grouping)
|
|
attribute_hidden;
|
|
|
|
# endif /* !_ISOMAC */
|
|
#endif
|