# HG changeset patch # User Christian Kamm # Date 1223899278 -7200 # Node ID 48f462341528a5acb10ba2814700715f8d98b26c # Parent a51fed3de34ebbaeb51af11b1586d7fa2602cbd8 Fix issues with gradual underflow and strtof, strtod on Mac. diff -r a51fed3de34e -r 48f462341528 dmd/lexer.c --- a/dmd/lexer.c Mon Oct 13 11:13:20 2008 +0200 +++ b/dmd/lexer.c Mon Oct 13 14:01:18 2008 +0200 @@ -2425,6 +2425,8 @@ t->float80value = strtold((char *)stringbuffer.data, NULL); #endif errno = 0; + float strtofres; + double strtodres; switch (*p) { case 'F': @@ -2432,7 +2434,11 @@ #ifdef IN_GCC real_t::parse((char *)stringbuffer.data, real_t::Float); #else - strtof((char *)stringbuffer.data, NULL); + strtofres = strtof((char *)stringbuffer.data, NULL); + // LDC change: don't error on gradual underflow + if (errno == ERANGE && + strtofres != 0 && strtofres != HUGE_VALF && strtofres != -HUGE_VALF) + errno = 0; #endif result = TOKfloat32v; p++; @@ -2442,7 +2448,11 @@ #ifdef IN_GCC real_t::parse((char *)stringbuffer.data, real_t::Double); #else - strtod((char *)stringbuffer.data, NULL); + strtodres = strtod((char *)stringbuffer.data, NULL); + // LDC change: don't error on gradual underflow + if (errno == ERANGE && + strtodres != 0 && strtodres != HUGE_VAL && strtodres != -HUGE_VAL) + errno = 0; #endif result = TOKfloat64v; break;