aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--stdio-common/tstdiomisc.c62
-rw-r--r--stdlib/Makefile1
-rw-r--r--stdlib/tst-strtod6.c15
4 files changed, 83 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 1bdbdf3cb6..256ce451a2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2013-04-05 Thomas Schwinge <thomas@codesourcery.com>
+ * stdio-common/tstdiomisc.c (snanval, msnanval, lsnanval)
+ (lmsnanval): New variables.
+ (F): Add conversion tests.
+ * stdlib/tst-strtod6.c (do_test): Add issignaling tests.
+ * stdlib/Makefile ($(objpfx)tst-strtod6): Depend on $(link-libm).
+
* stdio-common/tstdiomisc.c (F): Properly collect individual
tests' results.
diff --git a/stdio-common/tstdiomisc.c b/stdio-common/tstdiomisc.c
index fa07aa5a89..5c046bbef3 100644
--- a/stdio-common/tstdiomisc.c
+++ b/stdio-common/tstdiomisc.c
@@ -47,8 +47,14 @@ t2 (void)
}
volatile double qnanval;
-volatile double infval;
volatile long double lqnanval;
+/* A sNaN is only guaranteed to be representable in variables with static (or
+ thread-local) storage duration. */
+static volatile double snanval = __builtin_nans("");
+static volatile double msnanval = -__builtin_nans("");
+static volatile long double lsnanval = __builtin_nansl("");
+static volatile long double lmsnanval = -__builtin_nansl("");
+volatile double infval;
volatile long double linfval;
@@ -74,6 +80,19 @@ F (void)
printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
buf);
+ snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
+ snanval, snanval, snanval, snanval,
+ snanval, snanval, snanval, snanval);
+ result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
+ printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
+
+ snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
+ msnanval, msnanval, msnanval, msnanval,
+ msnanval, msnanval, msnanval, msnanval);
+ result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
+ printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
+ buf);
+
infval = DBL_MAX * DBL_MAX;
snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
@@ -102,6 +121,19 @@ F (void)
wbuf);
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
+ snanval, snanval, snanval, snanval,
+ snanval, snanval, snanval, snanval);
+ result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
+ printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
+
+ swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
+ msnanval, msnanval, msnanval, msnanval,
+ msnanval, msnanval, msnanval, msnanval);
+ result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
+ printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
+ wbuf);
+
+ swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
infval, infval, infval, infval, infval, infval, infval, infval);
result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0;
printf ("expected L\"inf INF inf INF inf INF inf INF\", got L\"%S\"\n", wbuf);
@@ -128,6 +160,19 @@ F (void)
printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
buf);
+ snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
+ lsnanval, lsnanval, lsnanval, lsnanval,
+ lsnanval, lsnanval, lsnanval, lsnanval);
+ result |= strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
+ printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
+
+ snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
+ lmsnanval, lmsnanval, lmsnanval, lmsnanval,
+ lmsnanval, lmsnanval, lmsnanval, lmsnanval);
+ result |= strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
+ printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
+ buf);
+
linfval = LDBL_MAX * LDBL_MAX;
snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
@@ -160,6 +205,21 @@ F (void)
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
L"%La %LA %Le %LE %Lf %LF %Lg %LG",
+ lsnanval, lsnanval, lsnanval, lsnanval,
+ lsnanval, lsnanval, lsnanval, lsnanval);
+ result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
+ printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
+
+ swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
+ L"%La %LA %Le %LE %Lf %LF %Lg %LG",
+ lmsnanval, lmsnanval, lmsnanval, lmsnanval,
+ lmsnanval, lmsnanval, lmsnanval, lmsnanval);
+ result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
+ printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
+ wbuf);
+
+ swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
+ L"%La %LA %Le %LE %Lf %LF %Lg %LG",
linfval, linfval, linfval, linfval,
linfval, linfval, linfval, linfval);
result |= wcscmp (wbuf, L"inf INF inf INF inf INF inf INF") != 0;
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 6f98c71c64..27765d15b7 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -157,6 +157,7 @@ $(objpfx)bug-getcontext: $(link-libm)
$(objpfx)tst-strtod-round: $(link-libm)
$(objpfx)tst-tininess: $(link-libm)
$(objpfx)tst-strtod-underflow: $(link-libm)
+$(objpfx)tst-strtod6: $(link-libm)
tst-tls-atexit-lib.so-no-z-defs = yes
diff --git a/stdlib/tst-strtod6.c b/stdlib/tst-strtod6.c
index fdb104f9ca..1d87266a27 100644
--- a/stdlib/tst-strtod6.c
+++ b/stdlib/tst-strtod6.c
@@ -16,6 +16,11 @@ do_test (void)
puts ("strtod did not return NAN");
result = 1;
}
+ if (issignaling (d))
+ {
+ puts ("strtod returned a sNAN");
+ result = 1;
+ }
if (strcmp (endp, "something") != 0)
{
puts ("strtod set incorrect end pointer");
@@ -28,6 +33,11 @@ do_test (void)
puts ("strtof did not return NAN");
result = 1;
}
+ if (issignaling (f))
+ {
+ puts ("strtof returned a sNAN");
+ result = 1;
+ }
if (strcmp (endp, "something") != 0)
{
puts ("strtof set incorrect end pointer");
@@ -40,6 +50,11 @@ do_test (void)
puts ("strtold did not return NAN");
result = 1;
}
+ if (issignaling (ld))
+ {
+ puts ("strtold returned a sNAN");
+ result = 1;
+ }
if (strcmp (endp, "something") != 0)
{
puts ("strtold set incorrect end pointer");