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;