comparison dmd/lexer.c @ 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 eef8ac26c66c
children 25a32766ed57
comparison
equal deleted inserted replaced
695:a51fed3de34e 696:48f462341528
2423 t->float80value = real_t::parse((char *)stringbuffer.data, real_t::LongDouble); 2423 t->float80value = real_t::parse((char *)stringbuffer.data, real_t::LongDouble);
2424 #else 2424 #else
2425 t->float80value = strtold((char *)stringbuffer.data, NULL); 2425 t->float80value = strtold((char *)stringbuffer.data, NULL);
2426 #endif 2426 #endif
2427 errno = 0; 2427 errno = 0;
2428 float strtofres;
2429 double strtodres;
2428 switch (*p) 2430 switch (*p)
2429 { 2431 {
2430 case 'F': 2432 case 'F':
2431 case 'f': 2433 case 'f':
2432 #ifdef IN_GCC 2434 #ifdef IN_GCC
2433 real_t::parse((char *)stringbuffer.data, real_t::Float); 2435 real_t::parse((char *)stringbuffer.data, real_t::Float);
2434 #else 2436 #else
2435 strtof((char *)stringbuffer.data, NULL); 2437 strtofres = strtof((char *)stringbuffer.data, NULL);
2438 // LDC change: don't error on gradual underflow
2439 if (errno == ERANGE &&
2440 strtofres != 0 && strtofres != HUGE_VALF && strtofres != -HUGE_VALF)
2441 errno = 0;
2436 #endif 2442 #endif
2437 result = TOKfloat32v; 2443 result = TOKfloat32v;
2438 p++; 2444 p++;
2439 break; 2445 break;
2440 2446
2441 default: 2447 default:
2442 #ifdef IN_GCC 2448 #ifdef IN_GCC
2443 real_t::parse((char *)stringbuffer.data, real_t::Double); 2449 real_t::parse((char *)stringbuffer.data, real_t::Double);
2444 #else 2450 #else
2445 strtod((char *)stringbuffer.data, NULL); 2451 strtodres = strtod((char *)stringbuffer.data, NULL);
2452 // LDC change: don't error on gradual underflow
2453 if (errno == ERANGE &&
2454 strtodres != 0 && strtodres != HUGE_VAL && strtodres != -HUGE_VAL)
2455 errno = 0;
2446 #endif 2456 #endif
2447 result = TOKfloat64v; 2457 result = TOKfloat64v;
2448 break; 2458 break;
2449 2459
2450 case 'l': 2460 case 'l':