https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115526
--- Comment #4 from Andreas K. Huettel <dilfridge at gentoo dot org> ---
Here's what cvise came up with as minimal test case.
1) compile command:
alpha-unknown-linux-gnu-gcc -c -fno-strict-overflow -Wsign-compare -mieee
-DNDEBUG -mieee -pipe -O2 -mcpu=ev4 -fwrapv -std=c11 \
-Wextra -Wno-unused-parameter -Wno-missing-field-initializers
-Wstrict-prototypes -Werror=implicit-function-declaration \
-fvisibility=hidden -fPIC -DPy_BUILD_CORE -o test $1
2) interestingness test:
/home/huettel/alpha-bug/compile.sh dtoa.i 2>&1 | grep 'Error: duplicate
!tlsgd!'
3) output:
======================
struct _ts {
struct _dtoa_state *interp
};
struct Bigint {
int k
} *_Py_dg_strtod_bs;
struct _dtoa_state {
struct Bigint p5s;
struct Bigint *freelist[]
};
extern _Thread_local struct _ts _Py_tss_tstate;
typedef struct Bigint Bigint;
int pow5mult_k;
long _Py_dg_strtod_ndigits;
void PyMem_Free();
void Bfree(Bigint *v) {
if (v)
if (v->k)
PyMem_Free();
else {
struct _dtoa_state *interp = _Py_tss_tstate.interp;
interp->freelist[v->k] = v;
}
}
static Bigint *pow5mult(Bigint *b) {
for (;;) {
if (pow5mult_k & 1) {
Bfree(b);
if (b == 0)
return 0;
}
if (!(pow5mult_k >>= 1))
break;
}
}
void _Py_dg_strtod() {
if (_Py_dg_strtod_ndigits)
pow5mult(_Py_dg_strtod_bs);
}
======================
4) double-check:
huettel@crossdev ~/alpha-bug $ ./compile.sh dtoa.i
dtoa.i:3:1: warning: no semicolon at end of struct or union
3 | };
| ^
dtoa.i:6:1: warning: no semicolon at end of struct or union
6 | } *_Py_dg_strtod_bs;
| ^
dtoa.i:10:1: warning: no semicolon at end of struct or union
10 | };
| ^
dtoa.i:15:1: warning: function declaration isn’t a prototype
[-Wstrict-prototypes]
15 | void PyMem_Free();
| ^~~~
dtoa.i:36:6: warning: function declaration isn’t a prototype
[-Wstrict-prototypes]
36 | void _Py_dg_strtod() {
| ^~~~~~~~~~~~~
{standard input}: Assembler messages:
{standard input}:140: Error: duplicate !tlsgd!6