------- Comment #33 from pcarlini at suse dot de  2007-05-14 16:54 -------
(In reply to comment #32)
> /* Define to 1 if you have the `finitef' function. */
> /* #undef _GLIBCXX_HAVE_FINITEF */
> /* Define to 1 if you have the `_finitef' function. */
> /* #undef _GLIBCXX_HAVE__FINITEF */
> /* Define to 1 if you have the `finite' function. */
> /* #undef _GLIBCXX_HAVE_FINITE */
> /* Define to 1 if you have the `_finite' function. */
> /* #undef _GLIBCXX_HAVE__FINITE */
> /* Define to 1 if you have the `isinf' function. */
> /* #undef _GLIBCXX_HAVE_ISINF */
> /* Define to 1 if you have the `_isinf' function. */
> /* #undef _GLIBCXX_HAVE__ISINF */

Ok, all undefined, it's possible.

> Thus, the test that should be performed in
> _ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKPi should be:
> 
>       if (fabs(__d) > numeric_limits<float>::max())
>         errno = ERANGE;

Only *if* _GLIBCXX_HAVE_STRTOF is not defined, however.

> Disassembly of that method shows that the test has been
> optimized away.
> This is not actually surprising, because _GLIBCXX_HAVE_STRTOF
> has been set, and hence strtof has been used, and
> __d remained uninitalized.

Ok, therefore _GLIBCXX_HAVE_STRTOF is set and no further test is needed before
the final one. In this case __d isn't optimized out, simply the pre-processor
selects:

      float __f = strtof(__s, &__sanity);

instead of

      double __d = strtod(__s, &__sanity);
      float __f = static_cast<float>(__d);

Now, the strange thing is that, before these two last patches (in 4_2-branch in
other terms), errno doesn't turn out to be == ERANGE for your target: strtof
should have set it...


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31836

Reply via email to