Mercurial > projects > ldc
changeset 696:48f462341528
Fix issues with gradual underflow and strtof, strtod on Mac.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Mon, 13 Oct 2008 14:01:18 +0200 |
parents | a51fed3de34e |
children | 25a32766ed57 |
files | dmd/lexer.c |
diffstat | 1 files changed, 12 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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;