about summary refs log tree commit diff
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");