/* Tail call optimizations would convert func() into the moral equivalent of: | |
double acc = 0.0; | |
for (int i = 0; i <= n; i++) | |
acc += d; | |
return acc; | |
which mishandles the case where 'd' is -0. They also initialised 'acc' | |
to a zero int rather than a zero double. */ | |
double func (double d, int n) | |
{ | |
if (n == 0) | |
return d; | |
else | |
return d + func (d, n - 1); | |
} | |
int main () | |
{ | |
if (__builtin_copysign (1.0, func (0.0 / -5.0, 10)) != -1.0) | |
abort (); | |
exit (0); | |
} |