changeset 17927:b941bb9e9efb

printf, isinf, etc.: noncanonical != NaN Do not require that isinf, printf, etc. treat noncanonical values as NaNs. Instead, require only that they do not crash. Problem reported by Joseph Myers in: https://sourceware.org/ml/libc-alpha/2015-02/msg00244.html * doc/posix-functions/dprintf.texi (dprintf): * doc/posix-functions/fprintf.texi (fprintf): * doc/posix-functions/isfinite.texi (isfinite): * doc/posix-functions/isinf.texi (isinf): * doc/posix-functions/isnan.texi (isnan): * doc/posix-functions/printf.texi (printf): * doc/posix-functions/snprintf.texi (snprintf): * doc/posix-functions/sprintf.texi (sprintf): * doc/posix-functions/vdprintf.texi (vdprintf): * doc/posix-functions/vfprintf.texi (vfprintf): * doc/posix-functions/vprintf.texi (vprintf): * doc/posix-functions/vsnprintf.texi (vsnprintf): * doc/posix-functions/vsprintf.texi (vsprintf): Document this. * m4/isfinite.m4 (gl_ISFINITEL_WORKS): * m4/isinf.m4 (gl_ISINFL_WORKS): * m4/isnanl.m4 (gl_FUNC_ISNANL_WORKS): * m4/printf.m4 (gl_PRINTF_INFINITE_LONG_DOUBLE): * tests/test-isfinite.c (test_isfinitel): * tests/test-isinf.c (test_isinfl): * tests/test-isnan.c (test_long_double): * tests/test-isnanl.h (main): * tests/test-snprintf-posix.h (test_function): * tests/test-sprintf-posix.h (test_function): * tests/test-vasnprintf-posix.c (test_function): * tests/test-vasprintf-posix.c (test_function): o Test only that noncanonical values do not cause crashes, not that they are treated as NaNs. In some cases this means a larger output buffer is needed.
author Paul Eggert <eggert@cs.ucla.edu>
date Fri, 20 Feb 2015 18:09:47 -0800
parents d4306001742a
children dd6f9e7b674a
files ChangeLog doc/posix-functions/dprintf.texi doc/posix-functions/fprintf.texi doc/posix-functions/isfinite.texi doc/posix-functions/isinf.texi doc/posix-functions/isnan.texi doc/posix-functions/printf.texi doc/posix-functions/snprintf.texi doc/posix-functions/sprintf.texi doc/posix-functions/vdprintf.texi doc/posix-functions/vfprintf.texi doc/posix-functions/vprintf.texi doc/posix-functions/vsnprintf.texi doc/posix-functions/vsprintf.texi m4/isfinite.m4 m4/isinf.m4 m4/isnanl.m4 m4/printf.m4 tests/test-isfinite.c tests/test-isinf.c tests/test-isnan.c tests/test-isnanl.h tests/test-snprintf-posix.h tests/test-sprintf-posix.h tests/test-vasnprintf-posix.c tests/test-vasprintf-posix.c
diffstat 26 files changed, 399 insertions(+), 1232 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2015-02-20  Paul Eggert  <eggert@cs.ucla.edu>
+
+	printf, isinf, etc.: noncanonical != NaN
+	Do not require that isinf, printf, etc. treat noncanonical
+	values as NaNs.  Instead, require only that they do not crash.
+	Problem reported by Joseph Myers in:
+	https://sourceware.org/ml/libc-alpha/2015-02/msg00244.html
+	* doc/posix-functions/dprintf.texi (dprintf):
+	* doc/posix-functions/fprintf.texi (fprintf):
+	* doc/posix-functions/isfinite.texi (isfinite):
+	* doc/posix-functions/isinf.texi (isinf):
+	* doc/posix-functions/isnan.texi (isnan):
+	* doc/posix-functions/printf.texi (printf):
+	* doc/posix-functions/snprintf.texi (snprintf):
+	* doc/posix-functions/sprintf.texi (sprintf):
+	* doc/posix-functions/vdprintf.texi (vdprintf):
+	* doc/posix-functions/vfprintf.texi (vfprintf):
+	* doc/posix-functions/vprintf.texi (vprintf):
+	* doc/posix-functions/vsnprintf.texi (vsnprintf):
+	* doc/posix-functions/vsprintf.texi (vsprintf):
+	Document this.
+	* m4/isfinite.m4 (gl_ISFINITEL_WORKS):
+	* m4/isinf.m4 (gl_ISINFL_WORKS):
+	* m4/isnanl.m4 (gl_FUNC_ISNANL_WORKS):
+	* m4/printf.m4 (gl_PRINTF_INFINITE_LONG_DOUBLE):
+	* tests/test-isfinite.c (test_isfinitel):
+	* tests/test-isinf.c (test_isinfl):
+	* tests/test-isnan.c (test_long_double):
+	* tests/test-isnanl.h (main):
+	* tests/test-snprintf-posix.h (test_function):
+	* tests/test-sprintf-posix.h (test_function):
+	* tests/test-vasnprintf-posix.c (test_function):
+	* tests/test-vasprintf-posix.c (test_function):
+o	Test only that noncanonical values do not cause crashes, not that
+	they are treated as NaNs.  In some cases this means a larger
+	output buffer is needed.
+
 2015-02-20  Jaroslav Skarvada  <jskarvad@redhat.com>
 
 	fts: remove redundant close() (trivial)
--- a/doc/posix-functions/dprintf.texi
+++ b/doc/posix-functions/dprintf.texi
@@ -17,10 +17,6 @@
 Portability problems fixed by Gnulib module @code{dprintf-posix}:
 @itemize
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6.
@@ -33,6 +29,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/fprintf.texi
+++ b/doc/posix-functions/fprintf.texi
@@ -20,10 +20,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -91,6 +87,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/isfinite.texi
+++ b/doc/posix-functions/isfinite.texi
@@ -15,12 +15,6 @@
 This macro incorrectly yields true for some @samp{double} arguments, on some
 platforms:
 Linux/ia64 (signalling NaNs).
-@item
-This macro incorrectly yields true for some @samp{long double} arguments, on
-some platforms:
-x86 (pseudo-zeroes, unnormalized numbers, pseudo-denormals),
-x86_64 (pseudo-denormals),
-ia64 (pseudo-NaN, pseudo-Infinity, pseudo-zeroes, unnormalized numbers, pseudo-denormals).
 @end itemize
 
 Portability problems not fixed by Gnulib:
@@ -28,4 +22,8 @@
 @item
 It is implementation-dependent whether @code{isfinite} raises an
 exception given a signaling NaN operand.
+@item
+This macro returns an unspecified result when given noncanonical values
+such as unnormalized numbers, pseudo-denormals, pseudo-NaNs,
+pseudo-Infinities, and pseudo-zeroes.
 @end itemize
--- a/doc/posix-functions/isinf.texi
+++ b/doc/posix-functions/isinf.texi
@@ -11,12 +11,12 @@
 @item
 This macro is missing on some platforms:
 AIX 5.1, IRIX 6.5, OSF/1 5.1, Solaris 11 2011-11.
-@item
-This macro incorrectly yields true for some @samp{long double} arguments, on
-some platforms:
-OpenBSD 4.9/x86 (pseudo-Infinity).
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
+@item
+This macro returns an unspecified result when given noncanonical values
+such as unnormalized numbers, pseudo-denormals, pseudo-NaNs,
+pseudo-Infinities, and pseudo-zeroes.
 @end itemize
--- a/doc/posix-functions/isnan.texi
+++ b/doc/posix-functions/isnan.texi
@@ -19,17 +19,12 @@
 IRIX 6.5, OSF/1 5.1 with gcc, Solaris 11 2011-11.
 @item
 On IRIX 6.5 with @code{cc}, @code{isnan} does not recognize some NaNs.
-@item
-On NetBSD/i386 and glibc/ia64, @code{isnan} does not recognize some
-forms of NaNs, such as pseudo-NaNs, pseudo-Infinities, and
-unnormalized numbers.
-@item
-On i686 and @var{x}86-64, @code{__builtin_isnanl} (and thus
-@code{isnan} implementations based on it) in GCC 4.0 and later does
-not recognize pseudo-denormals as NaNs, and similarly for
-pseudo-zeroes, unnormalized numbers, and pseudo-denormals on ia64.
 @end itemize
 
 Portability problems not fixed by Gnulib:
 @itemize
+@item
+This macro returns an unspecified result when given noncanonical values
+such as unnormalized numbers, pseudo-denormals, pseudo-NaNs,
+pseudo-Infinities, and pseudo-zeroes.
 @end itemize
--- a/doc/posix-functions/printf.texi
+++ b/doc/posix-functions/printf.texi
@@ -20,10 +20,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -91,6 +87,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/snprintf.texi
+++ b/doc/posix-functions/snprintf.texi
@@ -39,10 +39,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -99,6 +95,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/sprintf.texi
+++ b/doc/posix-functions/sprintf.texi
@@ -20,10 +20,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -74,6 +70,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/vdprintf.texi
+++ b/doc/posix-functions/vdprintf.texi
@@ -24,10 +24,6 @@
 printf of @samp{long double} numbers is unsupported on some platforms:
 BeOS.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, BeOS.
@@ -47,6 +43,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/vfprintf.texi
+++ b/doc/posix-functions/vfprintf.texi
@@ -20,10 +20,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -91,6 +87,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/vprintf.texi
+++ b/doc/posix-functions/vprintf.texi
@@ -20,10 +20,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -91,6 +87,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/vsnprintf.texi
+++ b/doc/posix-functions/vsnprintf.texi
@@ -39,10 +39,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -96,6 +92,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/doc/posix-functions/vsprintf.texi
+++ b/doc/posix-functions/vsprintf.texi
@@ -20,10 +20,6 @@
 incorrect result on some platforms:
 AIX 5.2, OSF/1 5.1, Solaris 11 2011-11, mingw, MSVC 9.
 @item
-printf of @samp{long double} numbers outside the IEEE 754 range produces
-no meaningful results on some platforms:
-glibc and others, on x86, x86_64, IA-64 CPUs.
-@item
 This function does not support the @samp{a} and @samp{A} directives on some
 platforms:
 glibc-2.3.6, Mac OS X 10.5, NetBSD 5.0, OpenBSD 4.0, AIX 5.2, HP-UX 11,
@@ -74,6 +70,10 @@
 Portability problems not fixed by Gnulib:
 @itemize
 @item
+Formatting noncanonical @samp{long double} numbers produces
+nonmeaningful results on some platforms:
+glibc and others, on x86, x86_64, IA-64 CPUs.
+@item
 When formatting an integer with grouping flag, this function inserts thousands
 separators even in the "C" locale on some platforms:
 NetBSD 5.1.
--- a/m4/isfinite.m4
+++ b/m4/isfinite.m4
@@ -1,4 +1,4 @@
-# isfinite.m4 serial 14
+# isfinite.m4 serial 15
 dnl Copyright (C) 2007-2015 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -34,13 +34,8 @@
   AC_SUBST([ISFINITE_LIBM])
 ])
 
-dnl Test whether isfinite() on 'long double' recognizes all numbers which are
-dnl neither finite nor infinite. This test fails e.g. on i686, x86_64, ia64,
-dnl because of
-dnl - pseudo-denormals on x86_64,
-dnl - pseudo-zeroes, unnormalized numbers, and pseudo-denormals on i686,
-dnl - pseudo-NaN, pseudo-Infinity, pseudo-zeroes, unnormalized numbers, and
-dnl   pseudo-denormals on ia64.
+dnl Test whether isfinite() on 'long double' recognizes all canonical values
+dnl which are neither finite nor infinite.
 AC_DEFUN([gl_ISFINITEL_WORKS],
 [
   AC_REQUIRE([AC_PROG_CC])
@@ -114,52 +109,41 @@
     if (isfinite (x.value))
       result |= 2;
   }
-  /* The isfinite macro should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* isfinite should return something even for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (isfinite (x.value))
+    if (isfinite (x.value) && !isfinite (x.value))
       result |= 4;
   }
   { /* Pseudo-Infinity.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (isfinite (x.value))
+    if (isfinite (x.value) && !isfinite (x.value))
       result |= 8;
   }
   { /* Pseudo-Zero.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (isfinite (x.value))
+    if (isfinite (x.value) && !isfinite (x.value))
       result |= 16;
   }
   { /* Unnormalized number.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (isfinite (x.value))
+    if (isfinite (x.value) && !isfinite (x.value))
       result |= 32;
   }
   { /* Pseudo-Denormal.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (isfinite (x.value))
+    if (isfinite (x.value) && !isfinite (x.value))
       result |= 64;
   }
 #endif
 
   return result;
 }]])], [gl_cv_func_isfinitel_works=yes], [gl_cv_func_isfinitel_works=no],
-      [case "$host_cpu" in
-                               # Guess no on ia64, x86_64, i386.
-         ia64 | x86_64 | i*86) gl_cv_func_isfinitel_works="guessing no";;
-         *)                    gl_cv_func_isfinitel_works="guessing yes";;
-       esac
-      ])
+      [gl_cv_func_isfinitel_works="guessing yes"])
     ])
 ])
--- a/m4/isinf.m4
+++ b/m4/isinf.m4
@@ -1,4 +1,4 @@
-# isinf.m4 serial 10
+# isinf.m4 serial 11
 dnl Copyright (C) 2007-2015 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -37,13 +37,8 @@
 
 dnl Test whether isinf() works:
 dnl 1) Whether it correctly returns false for LDBL_MAX.
-dnl 2) Whether on 'long double' recognizes all numbers which are neither
-dnl    finite nor infinite. This test fails on OpenBSD/x86, but could also
-dnl    fail e.g. on i686, x86_64, ia64, because of
-dnl    - pseudo-denormals on x86_64,
-dnl    - pseudo-zeroes, unnormalized numbers, and pseudo-denormals on i686,
-dnl    - pseudo-NaN, pseudo-Infinity, pseudo-zeroes, unnormalized numbers, and
-dnl      pseudo-denormals on ia64.
+dnl 2) Whether on 'long double' recognizes all canonical values which are
+dnl    infinite.
 AC_DEFUN([gl_ISINFL_WORKS],
 [
   AC_REQUIRE([AC_PROG_CC])
@@ -121,55 +116,41 @@
     if (isinf (x.value))
       result |= 2;
   }
-  /* The isinf macro should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* isinf should return something even for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (isinf (x.value))
+    if (isinf (x.value) && !isinf (x.value))
       result |= 4;
   }
   { /* Pseudo-Infinity.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (isinf (x.value))
+    if (isinf (x.value) && !isinf (x.value))
       result |= 8;
   }
   { /* Pseudo-Zero.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (isinf (x.value))
+    if (isinf (x.value) && !isinf (x.value))
       result |= 16;
   }
   { /* Unnormalized number.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (isinf (x.value))
+    if (isinf (x.value) && !isinf (x.value))
       result |= 32;
   }
   { /* Pseudo-Denormal.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (isinf (x.value))
+    if (isinf (x.value) && !isinf (x.value))
       result |= 64;
   }
 #endif
 
   return result;
 }]])], [gl_cv_func_isinfl_works=yes], [gl_cv_func_isinfl_works=no],
-      [
-       case "$host" in
-           # Guess no on OpenBSD ia64, x86_64, i386.
-         ia64-*-openbsd* | x86_64-*-openbsd* | i*86-*-openbsd*)
-            gl_cv_func_isinfl_works="guessing no";;
-         *)
-            gl_cv_func_isinfl_works="guessing yes";;
-       esac
-      ])
+      [gl_cv_func_isinfl_works="guessing yes"])
     ])
 ])
--- a/m4/isnanl.m4
+++ b/m4/isnanl.m4
@@ -1,4 +1,4 @@
-# isnanl.m4 serial 18
+# isnanl.m4 serial 19
 dnl Copyright (C) 2007-2015 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -108,11 +108,8 @@
     ])
 ])
 
-dnl Test whether isnanl() recognizes all numbers which are neither finite nor
-dnl infinite. This test fails e.g. on NetBSD/i386 and on glibc/ia64.
-dnl Also, the GCC >= 4.0 built-in __builtin_isnanl does not pass the tests
-dnl - for pseudo-denormals on i686 and x86_64,
-dnl - for pseudo-zeroes, unnormalized numbers, and pseudo-denormals on ia64.
+dnl Test whether isnanl() recognizes all canonical numbers which are neither
+dnl finite nor infinite.
 AC_DEFUN([gl_FUNC_ISNANL_WORKS],
 [
   AC_REQUIRE([AC_PROG_CC])
@@ -197,41 +194,35 @@
     if (!isnanl (x.value))
       result |= 2;
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* isnanl should return something even for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (!isnanl (x.value))
+    if (isnanl (x.value) && !isnanl (x.value))
       result |= 4;
   }
   { /* Pseudo-Infinity.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (!isnanl (x.value))
+    if (isnanl (x.value) && !isnanl (x.value))
       result |= 8;
   }
   { /* Pseudo-Zero.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (!isnanl (x.value))
+    if (isnanl (x.value) && !isnanl (x.value))
       result |= 16;
   }
   { /* Unnormalized number.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (!isnanl (x.value))
+    if (isnanl (x.value) && !isnanl (x.value))
       result |= 32;
   }
   { /* Pseudo-Denormal.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (!isnanl (x.value))
+    if (isnanl (x.value) && !isnanl (x.value))
       result |= 64;
   }
 #endif
@@ -240,16 +231,6 @@
 }]])],
         [gl_cv_func_isnanl_works=yes],
         [gl_cv_func_isnanl_works=no],
-        [case "$host_cpu" in
-                                 # Guess no on ia64, x86_64, i386.
-           ia64 | x86_64 | i*86) gl_cv_func_isnanl_works="guessing no";;
-           *)
-             case "$host_os" in
-               netbsd*) gl_cv_func_isnanl_works="guessing no";;
-               *)       gl_cv_func_isnanl_works="guessing yes";;
-             esac
-             ;;
-         esac
-        ])
+        [gl_cv_func_isnanl_works="guessing yes"])
     ])
 ])
--- a/m4/printf.m4
+++ b/m4/printf.m4
@@ -1,4 +1,4 @@
-# printf.m4 serial 51
+# printf.m4 serial 52
 dnl Copyright (C) 2003, 2007-2015 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -365,66 +365,51 @@
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lf", x.value) <= 0)
       result |= 4;
-    if (sprintf (buf, "%Le", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Le", x.value) <= 0)
       result |= 4;
-    if (sprintf (buf, "%Lg", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lg", x.value) <= 0)
       result |= 4;
   }
   { /* Pseudo-Infinity.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lf", x.value) <= 0)
       result |= 8;
-    if (sprintf (buf, "%Le", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Le", x.value) <= 0)
       result |= 8;
-    if (sprintf (buf, "%Lg", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lg", x.value) <= 0)
       result |= 8;
   }
   { /* Pseudo-Zero.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lf", x.value) <= 0)
       result |= 16;
-    if (sprintf (buf, "%Le", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Le", x.value) <= 0)
       result |= 16;
-    if (sprintf (buf, "%Lg", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lg", x.value) <= 0)
       result |= 16;
   }
   { /* Unnormalized number.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lf", x.value) <= 0)
       result |= 32;
-    if (sprintf (buf, "%Le", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Le", x.value) <= 0)
       result |= 32;
-    if (sprintf (buf, "%Lg", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lg", x.value) <= 0)
       result |= 32;
   }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    if (sprintf (buf, "%Lf", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lf", x.value) <= 0)
       result |= 64;
-    if (sprintf (buf, "%Le", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Le", x.value) <= 0)
       result |= 64;
-    if (sprintf (buf, "%Lg", x.value) < 0
-        || !strisnan (buf, 0, strlen (buf)))
+    if (sprintf (buf, "%Lg", x.value) <= 0)
       result |= 64;
   }
 #endif
--- a/tests/test-isfinite.c
+++ b/tests/test-isfinite.c
@@ -199,37 +199,31 @@
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
     ASSERT (!isfinite (x.value));
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* isfinite should return something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    ASSERT (!isfinite (x.value));
+    ASSERT (isfinite (x.value) || !isfinite (x.value));
   }
   { /* Pseudo-Infinity.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    ASSERT (!isfinite (x.value));
+    ASSERT (isfinite (x.value) || !isfinite (x.value));
   }
   { /* Pseudo-Zero.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    ASSERT (!isfinite (x.value));
+    ASSERT (isfinite (x.value) || !isfinite (x.value));
   }
   { /* Unnormalized number.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    ASSERT (!isfinite (x.value));
+    ASSERT (isfinite (x.value) || !isfinite (x.value));
   }
   { /* Pseudo-Denormal.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    ASSERT (!isfinite (x.value));
+    ASSERT (isfinite (x.value) || !isfinite (x.value));
   }
 #endif
 
--- a/tests/test-isinf.c
+++ b/tests/test-isinf.c
@@ -205,37 +205,31 @@
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
     ASSERT (!isinf (x.value));
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* isinf should return something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    ASSERT (!isinf (x.value));
+    ASSERT (isinf (x.value) || !isinf (x.value));
   }
   { /* Pseudo-Infinity.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    ASSERT (!isinf (x.value));
+    ASSERT (isinf (x.value) || !isinf (x.value));
   }
   { /* Pseudo-Zero.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    ASSERT (!isinf (x.value));
+    ASSERT (isinf (x.value) || !isinf (x.value));
   }
   { /* Unnormalized number.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    ASSERT (!isinf (x.value));
+    ASSERT (isinf (x.value) || !isinf (x.value));
   }
   { /* Pseudo-Denormal.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    ASSERT (!isinf (x.value));
+    ASSERT (isinf (x.value) || !isinf (x.value));
   }
 #endif
 
--- a/tests/test-isnan.c
+++ b/tests/test-isnan.c
@@ -186,37 +186,31 @@
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
     ASSERT (isnan (x.value));
   }
-  /* The isnan function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* isnan should return something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    ASSERT (isnan (x.value));
+    ASSERT (isnan (x.value) || !isnan (x.value));
   }
   { /* Pseudo-Infinity.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    ASSERT (isnan (x.value));
+    ASSERT (isnan (x.value) || !isnan (x.value));
   }
   { /* Pseudo-Zero.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    ASSERT (isnan (x.value));
+    ASSERT (isnan (x.value) || !isnan (x.value));
   }
   { /* Unnormalized number.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    ASSERT (isnan (x.value));
+    ASSERT (isnan (x.value) || !isnan (x.value));
   }
   { /* Pseudo-Denormal.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    ASSERT (isnan (x.value));
+    ASSERT (isnan (x.value) || !isnan (x.value));
   }
 #endif
 }
--- a/tests/test-isnanl.h
+++ b/tests/test-isnanl.h
@@ -98,37 +98,31 @@
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
     ASSERT (isnanl (x.value));
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* isnanl should return something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    ASSERT (isnanl (x.value));
+    ASSERT (isnanl (x.value) || !isnanl (x.value));
   }
   { /* Pseudo-Infinity.  */
     static memory_long_double x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    ASSERT (isnanl (x.value));
+    ASSERT (isnanl (x.value) || !isnanl (x.value));
   }
   { /* Pseudo-Zero.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    ASSERT (isnanl (x.value));
+    ASSERT (isnanl (x.value) || !isnanl (x.value));
   }
   { /* Unnormalized number.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    ASSERT (isnanl (x.value));
+    ASSERT (isnanl (x.value) || !isnanl (x.value));
   }
   { /* Pseudo-Denormal.  */
     static memory_long_double x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    ASSERT (isnanl (x.value));
+    ASSERT (isnanl (x.value) || !isnanl (x.value));
   }
 #endif
 
--- a/tests/test-snprintf-posix.h
+++ b/tests/test-snprintf-posix.h
@@ -79,6 +79,7 @@
 {
   char buf[8];
   int size;
+  char result[5000];
 
   /* Test return value convention.  */
 
@@ -107,7 +108,6 @@
   /* Test support of size specifiers as in C99.  */
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
     ASSERT (strcmp (result, "12345671 33") == 0);
@@ -115,7 +115,6 @@
   }
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%zu %d", (size_t) 12345672, 33, 44, 55);
     ASSERT (strcmp (result, "12345672 33") == 0);
@@ -123,7 +122,6 @@
   }
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
     ASSERT (strcmp (result, "12345673 33") == 0);
@@ -131,7 +129,6 @@
   }
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", (long double) 1.5, 33, 44, 55);
     ASSERT (strcmp (result, "1.5 33") == 0);
@@ -142,7 +139,6 @@
      output of floating-point numbers.  */
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%a %d", 3.1416015625, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.922p+1 33") == 0
@@ -153,7 +149,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%A %d", -3.1416015625, 33, 44, 55);
     ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
@@ -164,7 +159,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%a %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0x0p+0 33") == 0);
@@ -172,7 +166,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%a %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -181,7 +174,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%a %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0);
@@ -189,7 +181,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%a %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0);
@@ -197,7 +188,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%a %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -207,7 +197,6 @@
   }
 
   { /* Rounding near the decimal point.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.0a %d", 1.5, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -218,7 +207,6 @@
   }
 
   { /* Rounding with precision 0.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.0a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -229,7 +217,6 @@
   }
 
   { /* Rounding with precision 1.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.1a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.8p+0 33") == 0
@@ -240,7 +227,6 @@
   }
 
   { /* Rounding with precision 2.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.83p+0 33") == 0
@@ -251,7 +237,6 @@
   }
 
   { /* Rounding with precision 3.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.3a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.829p+0 33") == 0
@@ -262,7 +247,6 @@
   }
 
   { /* Rounding can turn a ...FFF into a ...000.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.3a %d", 1.49999, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.800p+0 33") == 0
@@ -274,7 +258,6 @@
 
   { /* Rounding can turn a ...FFF into a ...000.
        This shows a Mac OS X 10.3.9 (Darwin 7.9) bug.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.1a %d", 1.999, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.0p+1 33") == 0
@@ -285,7 +268,6 @@
   }
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%10a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "  0x1.cp+0 33") == 0
@@ -296,7 +278,6 @@
   }
 
   { /* Small precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.10a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
@@ -307,7 +288,6 @@
   }
 
   { /* Large precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.50a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
@@ -318,7 +298,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-10a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0   33") == 0
@@ -329,7 +308,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
@@ -340,7 +318,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
@@ -351,7 +328,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0 33") == 0
@@ -362,7 +338,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#a %d", 1.0, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.p+0 33") == 0
@@ -373,7 +348,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%010a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x001.cp+0 33") == 0
@@ -384,7 +358,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%010a %d", Infinityd (), 33, 44, 55);
     /* "0000000inf 33" is not a valid result; see
@@ -394,7 +367,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050a %d", NaNd (), 33, 44, 55);
     /* "0000000nan 33" is not a valid result; see
@@ -406,7 +378,6 @@
   }
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", 3.1416015625L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.922p+1 33") == 0
@@ -417,7 +388,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LA %d", -3.1416015625L, 33, 44, 55);
     ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
@@ -428,7 +398,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0x0p+0 33") == 0);
@@ -436,7 +405,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -445,7 +413,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0);
@@ -453,7 +420,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0);
@@ -461,7 +427,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -473,7 +438,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -485,36 +449,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -522,43 +456,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
+  /* snprintf should print something for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
   { /* Pseudo-Zero.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Unnormalized number.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Rounding near the decimal point.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.0La %d", 1.5L, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -569,7 +510,6 @@
   }
 
   { /* Rounding with precision 0.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.0La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -580,7 +520,6 @@
   }
 
   { /* Rounding with precision 1.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.1La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.8p+0 33") == 0
@@ -591,7 +530,6 @@
   }
 
   { /* Rounding with precision 2.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.83p+0 33") == 0
@@ -602,7 +540,6 @@
   }
 
   { /* Rounding with precision 3.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.3La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.829p+0 33") == 0
@@ -613,7 +550,6 @@
   }
 
   { /* Rounding can turn a ...FFF into a ...000.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.3La %d", 1.49999L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.800p+0 33") == 0
@@ -626,7 +562,6 @@
   { /* Rounding can turn a ...FFF into a ...000.
        This shows a Mac OS X 10.3.9 (Darwin 7.9) bug and a
        glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.1La %d", 1.999L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.0p+1 33") == 0
@@ -637,7 +572,6 @@
   }
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%10La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "  0x1.cp+0 33") == 0
@@ -648,7 +582,6 @@
   }
 
   { /* Small precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.10La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
@@ -659,7 +592,6 @@
   }
 
   { /* Large precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.50La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
@@ -670,7 +602,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-10La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0   33") == 0
@@ -681,7 +612,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
@@ -692,7 +622,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
@@ -703,7 +632,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0 33") == 0
@@ -714,7 +642,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#La %d", 1.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.p+0 33") == 0
@@ -725,7 +652,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%010La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x001.cp+0 33") == 0
@@ -736,7 +662,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%010La %d", Infinityl (), 33, 44, 55);
     /* "0000000inf 33" is not a valid result; see
@@ -746,7 +671,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050La %d", NaNl (), 33, 44, 55);
     /* "0000000nan 33" is not a valid result; see
@@ -760,7 +684,6 @@
   /* Test the support of the %f format directive.  */
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -768,7 +691,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -856,7 +778,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[100];
         int retval =
           my_snprintf (result, sizeof (result), "%f", data[k].value);
         ASSERT (strmatch (data[k].string, result));
@@ -865,7 +786,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -873,7 +793,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -881,7 +800,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -890,7 +808,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -899,7 +816,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -908,7 +824,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%f %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -918,7 +833,6 @@
   }
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%10f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "  1.750000 33") == 0);
@@ -926,7 +840,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-10f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000   33") == 0);
@@ -934,7 +847,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000 33") == 0);
@@ -942,7 +854,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000 33") == 0);
@@ -950,7 +861,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000 33") == 0);
@@ -958,7 +868,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -966,7 +875,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015f %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -974,7 +882,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015f %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -983,7 +890,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050f %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -993,7 +899,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.f %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -1001,7 +906,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2f %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -1009,7 +913,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2f %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1017,7 +920,6 @@
   }
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -1025,7 +927,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -1113,7 +1014,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[100];
         int retval =
           my_snprintf (result, sizeof (result), "%Lf", data[k].value);
         ASSERT (strmatch (data[k].string, result));
@@ -1122,7 +1022,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -1130,7 +1029,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -1138,7 +1036,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -1147,7 +1044,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -1156,7 +1052,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -1165,7 +1060,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1177,7 +1071,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1189,58 +1082,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Zero.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Unnormalized number.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1248,21 +1089,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
+  /* snprintf should print something for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Zero.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Unnormalized number.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%10Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "  1.750000 33") == 0);
@@ -1270,7 +1140,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-10Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000   33") == 0);
@@ -1278,7 +1147,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000 33") == 0);
@@ -1286,7 +1154,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000 33") == 0);
@@ -1294,7 +1161,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000 33") == 0);
@@ -1302,7 +1168,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -1310,7 +1175,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015Lf %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -1318,7 +1182,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015Lf %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -1327,7 +1190,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050Lf %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -1337,7 +1199,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.Lf %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -1345,7 +1206,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2Lf %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -1353,7 +1213,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2Lf %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1363,7 +1222,6 @@
   /* Test the support of the %F format directive.  */
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -1371,7 +1229,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -1379,7 +1236,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -1387,7 +1243,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -1395,7 +1250,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -1404,7 +1258,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "INF 33") == 0
@@ -1413,7 +1266,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-INF 33") == 0
@@ -1422,7 +1274,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%F %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1432,7 +1283,6 @@
   }
 
   { /* FLAG_ZERO.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015F %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -1440,7 +1290,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015F %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -INF 33") == 0
@@ -1449,7 +1298,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.F %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -1457,7 +1305,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2F %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -1465,7 +1312,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2F %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1473,7 +1319,6 @@
   }
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -1481,7 +1326,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -1489,7 +1333,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -1497,7 +1340,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -1505,7 +1347,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -1514,7 +1355,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "INF 33") == 0
@@ -1523,7 +1363,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-INF 33") == 0
@@ -1532,7 +1371,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%LF %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1542,7 +1380,6 @@
   }
 
   { /* FLAG_ZERO.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015LF %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -1550,7 +1387,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015LF %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -INF 33") == 0
@@ -1559,7 +1395,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.LF %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -1567,7 +1402,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2LF %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -1575,7 +1409,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.2LF %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1585,7 +1418,6 @@
   /* Test the support of the %e format directive.  */
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.275000e+01 33") == 0
@@ -1594,7 +1426,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1.234567e+06 33") == 0
@@ -1683,7 +1514,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[100];
         int retval =
           my_snprintf (result, sizeof (result), "%e", data[k].value);
         const char *expected = data[k].string;
@@ -1700,7 +1530,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-3.125000e-02 33") == 0
@@ -1709,7 +1538,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000e+00 33") == 0
@@ -1718,7 +1546,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -1728,7 +1555,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -1737,7 +1563,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -1746,7 +1571,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%e %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1756,7 +1580,6 @@
   }
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%15e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "   1.750000e+00 33") == 0
@@ -1765,7 +1588,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-15e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00    33") == 0
@@ -1774,7 +1596,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000e+00 33") == 0
@@ -1783,7 +1604,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000e+00 33") == 0
@@ -1792,7 +1612,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00 33") == 0
@@ -1801,7 +1620,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "2.e+00 33") == 0
@@ -1810,7 +1628,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.e %d", 9.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -1819,7 +1636,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015e %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "0001.234000e+03 33") == 0
@@ -1828,7 +1644,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015e %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -1837,7 +1652,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050e %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -1847,7 +1661,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.e %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -1856,7 +1669,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.4e %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "9.9995e+02 33") == 0
@@ -1865,7 +1677,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.4e %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1.0000e+03 33") == 0
@@ -1874,7 +1685,6 @@
   }
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.275000e+01 33") == 0
@@ -1883,7 +1693,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1.234567e+06 33") == 0
@@ -1972,7 +1781,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[100];
         int retval =
           my_snprintf (result, sizeof (result), "%Le", data[k].value);
         const char *expected = data[k].string;
@@ -1989,7 +1797,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-3.125000e-02 33") == 0
@@ -1998,7 +1805,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000e+00 33") == 0
@@ -2007,7 +1813,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -2017,7 +1822,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -2026,7 +1830,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -2035,7 +1838,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2047,7 +1849,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2059,36 +1860,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2096,43 +1867,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
+  /* snprintf should print something for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
   { /* Pseudo-Zero.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Unnormalized number.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%15Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "   1.750000e+00 33") == 0
@@ -2141,7 +1919,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-15Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00    33") == 0
@@ -2150,7 +1927,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000e+00 33") == 0
@@ -2159,7 +1935,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000e+00 33") == 0
@@ -2168,7 +1943,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00 33") == 0
@@ -2177,7 +1951,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "2.e+00 33") == 0
@@ -2186,7 +1959,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Le %d", 9.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -2195,7 +1967,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015Le %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0001.234000e+03 33") == 0
@@ -2204,7 +1975,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015Le %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -2213,7 +1983,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050Le %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -2223,7 +1992,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.Le %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -2232,7 +2000,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.4Le %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "9.9995e+02 33") == 0
@@ -2241,7 +2008,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.4Le %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1.0000e+03 33") == 0
@@ -2252,7 +2018,6 @@
   /* Test the support of the %g format directive.  */
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "12.75 33") == 0);
@@ -2260,7 +2025,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1.23457e+06 33") == 0
@@ -2349,7 +2113,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[100];
         int retval =
           my_snprintf (result, sizeof (result), "%g", data[k].value);
         const char *expected = data[k].string;
@@ -2367,7 +2130,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-0.03125 33") == 0);
@@ -2375,7 +2137,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0 33") == 0);
@@ -2383,7 +2144,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -2392,7 +2152,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -2401,7 +2160,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -2410,7 +2168,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%g %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2420,7 +2177,6 @@
   }
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%10g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "      1.75 33") == 0);
@@ -2428,7 +2184,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-10g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.75       33") == 0);
@@ -2436,7 +2191,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+1.75 33") == 0);
@@ -2444,7 +2198,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 1.75 33") == 0);
@@ -2452,7 +2205,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.75000 33") == 0);
@@ -2460,7 +2212,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -2468,7 +2219,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.g %d", 9.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -2477,7 +2227,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%010g %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "0000001234 33") == 0);
@@ -2485,7 +2234,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015g %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -2494,7 +2242,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050g %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -2504,7 +2251,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.g %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -2513,7 +2259,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.5g %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -2521,7 +2266,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.5g %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1000 33") == 0);
@@ -2529,7 +2273,6 @@
   }
 
   { /* A positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "12.75 33") == 0);
@@ -2537,7 +2280,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1.23457e+06 33") == 0
@@ -2626,7 +2368,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[100];
         int retval =
           my_snprintf (result, sizeof (result), "%Lg", data[k].value);
         const char *expected = data[k].string;
@@ -2644,7 +2385,6 @@
   }
 
   { /* A negative number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-0.03125 33") == 0);
@@ -2652,7 +2392,6 @@
   }
 
   { /* Positive zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0 33") == 0);
@@ -2660,7 +2399,6 @@
   }
 
   { /* Negative zero.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -2669,7 +2407,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -2678,7 +2415,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -2687,7 +2423,6 @@
   }
 
   { /* NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2699,7 +2434,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2711,58 +2445,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Zero.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[100];
-    int retval =
-      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Unnormalized number.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2770,21 +2452,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
+  /* snprintf should print something for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Zero.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Unnormalized number.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+    int retval =
+      my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Width.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%10Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "      1.75 33") == 0);
@@ -2792,7 +2503,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%-10Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.75       33") == 0);
@@ -2800,7 +2510,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%+Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+1.75 33") == 0);
@@ -2808,7 +2517,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "% Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 1.75 33") == 0);
@@ -2816,7 +2524,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.75000 33") == 0);
@@ -2824,7 +2531,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -2832,7 +2538,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%#.Lg %d", 9.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -2841,7 +2546,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%010Lg %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0000001234 33") == 0);
@@ -2849,7 +2553,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%015Lg %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -2858,7 +2561,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%050Lg %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -2868,7 +2570,6 @@
   }
 
   { /* Precision.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.Lg %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -2877,7 +2578,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.5Lg %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -2885,7 +2585,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%.5Lg %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1000 33") == 0);
@@ -2896,7 +2595,6 @@
 
   {
     int count = -1;
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%d %n", 123, &count, 33, 44, 55);
     ASSERT (strcmp (result, "123 ") == 0);
@@ -2907,7 +2605,6 @@
   /* Test the support of the POSIX/XSI format strings with positions.  */
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%2$d %1$d", 33, 55);
     ASSERT (strcmp (result, "55 33") == 0);
@@ -2917,7 +2614,6 @@
   /* Test the support of the grouping flag.  */
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "%'d %d", 1234567, 99);
     ASSERT (result[strlen (result) - 1] == '9');
@@ -2927,7 +2623,6 @@
   /* Test the support of the left-adjust flag.  */
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "a%*sc", -3, "b");
     ASSERT (strcmp (result, "ab  c") == 0);
@@ -2935,7 +2630,6 @@
   }
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "a%-*sc", 3, "b");
     ASSERT (strcmp (result, "ab  c") == 0);
@@ -2943,7 +2637,6 @@
   }
 
   {
-    char result[100];
     int retval =
       my_snprintf (result, sizeof (result), "a%-*sc", -3, "b");
     ASSERT (strcmp (result, "ab  c") == 0);
@@ -2953,7 +2646,6 @@
   /* Test the support of large precision.  */
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%.4000d %d", 1234567, 99);
     size_t i;
@@ -2964,7 +2656,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%.*d %d", 4000, 1234567, 99);
     size_t i;
@@ -2975,7 +2666,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%.4000d %d", -1234567, 99);
     size_t i;
@@ -2987,7 +2677,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%.4000u %d", 1234567, 99);
     size_t i;
@@ -2998,7 +2687,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%.4000o %d", 1234567, 99);
     size_t i;
@@ -3009,7 +2697,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%.4000x %d", 1234567, 99);
     size_t i;
@@ -3020,7 +2707,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%#.4000x %d", 1234567, 99);
     size_t i;
@@ -3033,7 +2719,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_snprintf (result, sizeof (result), "%.4000f %d", 1.0, 99);
     size_t i;
@@ -3046,7 +2731,6 @@
   }
 
   {
-    char result[1000];
     int retval =
       my_snprintf (result, sizeof (result), "%.511f %d", 1.0, 99);
     size_t i;
@@ -3060,7 +2744,6 @@
 
   {
     char input[5000];
-    char result[5000];
     int retval;
     size_t i;
 
@@ -3084,7 +2767,6 @@
     for (i = 1; i <= 8; i++)
       {
         char *block;
-        char result[5000];
         int retval;
 
         block = (char *) malloc (i);
@@ -3104,7 +2786,6 @@
       {
         wchar_t *block;
         size_t j;
-        char result[5000];
         int retval;
 
         block = (wchar_t *) malloc (i * sizeof (wchar_t));
--- a/tests/test-sprintf-posix.h
+++ b/tests/test-sprintf-posix.h
@@ -77,6 +77,7 @@
 static void
 test_function (int (*my_sprintf) (char *, const char *, ...))
 {
+  char result[5000];
   char buf[8];
 
   /* Test return value convention.  */
@@ -93,7 +94,6 @@
   /* Test support of size specifiers as in C99.  */
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "%ju %d", (uintmax_t) 12345671, 33, 44, 55);
     ASSERT (strcmp (result, "12345671 33") == 0);
@@ -101,7 +101,6 @@
   }
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "%zu %d", (size_t) 12345672, 33, 44, 55);
     ASSERT (strcmp (result, "12345672 33") == 0);
@@ -109,7 +108,6 @@
   }
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55);
     ASSERT (strcmp (result, "12345673 33") == 0);
@@ -117,7 +115,6 @@
   }
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", (long double) 1.5, 33, 44, 55);
     ASSERT (strcmp (result, "1.5 33") == 0);
@@ -128,7 +125,6 @@
      output of floating-point numbers.  */
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%a %d", 3.1416015625, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.922p+1 33") == 0
@@ -139,7 +135,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%A %d", -3.1416015625, 33, 44, 55);
     ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
@@ -150,7 +145,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%a %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0x0p+0 33") == 0);
@@ -158,7 +152,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%a %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -167,7 +160,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%a %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0);
@@ -175,7 +167,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%a %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0);
@@ -183,7 +174,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%a %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -193,7 +183,6 @@
   }
 
   { /* Rounding near the decimal point.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.0a %d", 1.5, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -204,7 +193,6 @@
   }
 
   { /* Rounding with precision 0.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.0a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -215,7 +203,6 @@
   }
 
   { /* Rounding with precision 1.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.1a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.8p+0 33") == 0
@@ -226,7 +213,6 @@
   }
 
   { /* Rounding with precision 2.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.2a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.83p+0 33") == 0
@@ -237,7 +223,6 @@
   }
 
   { /* Rounding with precision 3.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.3a %d", 1.51, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.829p+0 33") == 0
@@ -248,7 +233,6 @@
   }
 
   { /* Rounding can turn a ...FFF into a ...000.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.3a %d", 1.49999, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.800p+0 33") == 0
@@ -260,7 +244,6 @@
 
   { /* Rounding can turn a ...FFF into a ...000.
        This shows a Mac OS X 10.3.9 (Darwin 7.9) bug.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.1a %d", 1.999, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.0p+1 33") == 0
@@ -271,7 +254,6 @@
   }
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%10a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "  0x1.cp+0 33") == 0
@@ -282,7 +264,6 @@
   }
 
   { /* Small precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.10a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
@@ -293,7 +274,6 @@
   }
 
   { /* Large precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.50a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
@@ -304,7 +284,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-10a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0   33") == 0
@@ -315,7 +294,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
@@ -326,7 +304,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
@@ -337,7 +314,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0 33") == 0
@@ -348,7 +324,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#a %d", 1.0, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.p+0 33") == 0
@@ -359,7 +334,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%010a %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "0x001.cp+0 33") == 0
@@ -370,7 +344,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%010a %d", Infinityd (), 33, 44, 55);
     /* "0000000inf 33" is not a valid result; see
@@ -380,7 +353,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050a %d", NaNd (), 33, 44, 55);
     /* "0000000nan 33" is not a valid result; see
@@ -392,7 +364,6 @@
   }
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", 3.1416015625L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.922p+1 33") == 0
@@ -403,7 +374,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LA %d", -3.1416015625L, 33, 44, 55);
     ASSERT (strcmp (result, "-0X1.922P+1 33") == 0
@@ -414,7 +384,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0x0p+0 33") == 0);
@@ -422,7 +391,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -431,7 +399,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0);
@@ -439,7 +406,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0);
@@ -447,7 +413,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -459,7 +424,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -471,36 +435,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -508,43 +442,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
+  /* sprintf should print something for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%La %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
   { /* Pseudo-Zero.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Unnormalized number.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Rounding near the decimal point.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.0La %d", 1.5L, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -555,7 +496,6 @@
   }
 
   { /* Rounding with precision 0.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.0La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x2p+0 33") == 0
@@ -566,7 +506,6 @@
   }
 
   { /* Rounding with precision 1.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.1La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.8p+0 33") == 0
@@ -577,7 +516,6 @@
   }
 
   { /* Rounding with precision 2.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.2La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.83p+0 33") == 0
@@ -588,7 +526,6 @@
   }
 
   { /* Rounding with precision 3.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.3La %d", 1.51L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.829p+0 33") == 0
@@ -599,7 +536,6 @@
   }
 
   { /* Rounding can turn a ...FFF into a ...000.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.3La %d", 1.49999L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.800p+0 33") == 0
@@ -612,7 +548,6 @@
   { /* Rounding can turn a ...FFF into a ...000.
        This shows a Mac OS X 10.3.9 (Darwin 7.9) bug and a
        glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.1La %d", 1.999L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.0p+1 33") == 0
@@ -623,7 +558,6 @@
   }
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%10La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "  0x1.cp+0 33") == 0
@@ -634,7 +568,6 @@
   }
 
   { /* Small precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.10La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c000000000p+0 33") == 0
@@ -645,7 +578,6 @@
   }
 
   { /* Large precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.50La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.c0000000000000000000000000000000000000000000000000p+0 33") == 0
@@ -656,7 +588,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-10La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0   33") == 0
@@ -667,7 +598,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+0x1.cp+0 33") == 0
@@ -678,7 +608,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 0x1.cp+0 33") == 0
@@ -689,7 +618,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.cp+0 33") == 0
@@ -700,7 +628,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#La %d", 1.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0x1.p+0 33") == 0
@@ -711,7 +638,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%010La %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "0x001.cp+0 33") == 0
@@ -722,7 +648,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%010La %d", Infinityl (), 33, 44, 55);
     /* "0000000inf 33" is not a valid result; see
@@ -732,7 +657,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050La %d", NaNl (), 33, 44, 55);
     /* "0000000nan 33" is not a valid result; see
@@ -746,7 +670,6 @@
   /* Test the support of the %f format directive.  */
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -754,7 +677,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -842,7 +764,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[1000];
         int retval =
           my_sprintf (result, "%f", data[k].value);
         ASSERT (strmatch (data[k].string, result));
@@ -851,7 +772,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -859,7 +779,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -867,7 +786,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -876,7 +794,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -885,7 +802,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -894,7 +810,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%f %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -904,7 +819,6 @@
   }
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%10f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "  1.750000 33") == 0);
@@ -912,7 +826,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-10f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000   33") == 0);
@@ -920,7 +833,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000 33") == 0);
@@ -928,7 +840,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000 33") == 0);
@@ -936,7 +847,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000 33") == 0);
@@ -944,7 +854,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.f %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -952,7 +861,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015f %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -960,7 +868,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015f %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -969,7 +876,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050f %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -979,7 +885,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.f %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -987,7 +892,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2f %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -995,7 +899,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2f %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1003,7 +906,6 @@
   }
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -1011,7 +913,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -1099,7 +1000,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[1000];
         int retval =
           my_sprintf (result, "%Lf", data[k].value);
         ASSERT (strmatch (data[k].string, result));
@@ -1108,7 +1008,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -1116,7 +1015,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -1124,7 +1022,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -1133,7 +1030,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -1142,7 +1038,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -1151,7 +1046,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1163,7 +1057,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1175,58 +1068,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Zero.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Unnormalized number.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1234,21 +1075,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
+  /* sprintf should print something for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Zero.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Unnormalized number.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lf %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%10Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "  1.750000 33") == 0);
@@ -1256,7 +1126,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-10Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000   33") == 0);
@@ -1264,7 +1133,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000 33") == 0);
@@ -1272,7 +1140,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000 33") == 0);
@@ -1280,7 +1147,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000 33") == 0);
@@ -1288,7 +1154,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.Lf %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -1296,7 +1161,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015Lf %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -1304,7 +1168,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015Lf %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -1313,7 +1176,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050Lf %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -1323,7 +1185,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.Lf %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -1331,7 +1192,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2Lf %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -1339,7 +1199,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2Lf %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1349,7 +1208,6 @@
   /* Test the support of the %F format directive.  */
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -1357,7 +1215,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -1365,7 +1222,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -1373,7 +1229,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -1381,7 +1236,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -1390,7 +1244,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "INF 33") == 0
@@ -1399,7 +1252,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-INF 33") == 0
@@ -1408,7 +1260,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%F %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1418,7 +1269,6 @@
   }
 
   { /* FLAG_ZERO.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015F %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -1426,7 +1276,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015F %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -INF 33") == 0
@@ -1435,7 +1284,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.F %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -1443,7 +1291,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2F %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -1451,7 +1298,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2F %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1459,7 +1305,6 @@
   }
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "12.750000 33") == 0);
@@ -1467,7 +1312,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234567.000000 33") == 0);
@@ -1475,7 +1319,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-0.031250 33") == 0);
@@ -1483,7 +1326,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000 33") == 0);
@@ -1491,7 +1333,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -1500,7 +1341,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "INF 33") == 0
@@ -1509,7 +1349,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-INF 33") == 0
@@ -1518,7 +1357,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%LF %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1528,7 +1366,6 @@
   }
 
   { /* FLAG_ZERO.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015LF %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "00001234.000000 33") == 0);
@@ -1536,7 +1373,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015LF %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -INF 33") == 0
@@ -1545,7 +1381,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.LF %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1234 33") == 0);
@@ -1553,7 +1388,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2LF %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -1561,7 +1395,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.2LF %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1000.00 33") == 0);
@@ -1571,7 +1404,6 @@
   /* Test the support of the %e format directive.  */
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.275000e+01 33") == 0
@@ -1580,7 +1412,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1.234567e+06 33") == 0
@@ -1669,7 +1500,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[1000];
         int retval =
           my_sprintf (result, "%e", data[k].value);
         const char *expected = data[k].string;
@@ -1686,7 +1516,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-3.125000e-02 33") == 0
@@ -1695,7 +1524,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000e+00 33") == 0
@@ -1704,7 +1532,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -1714,7 +1541,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -1723,7 +1549,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -1732,7 +1557,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%e %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -1742,7 +1566,6 @@
   }
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%15e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "   1.750000e+00 33") == 0
@@ -1751,7 +1574,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-15e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00    33") == 0
@@ -1760,7 +1582,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000e+00 33") == 0
@@ -1769,7 +1590,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000e+00 33") == 0
@@ -1778,7 +1598,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00 33") == 0
@@ -1787,7 +1606,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.e %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "2.e+00 33") == 0
@@ -1796,7 +1614,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.e %d", 9.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -1805,7 +1622,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015e %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "0001.234000e+03 33") == 0
@@ -1814,7 +1630,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015e %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -1823,7 +1638,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050e %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -1833,7 +1647,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.e %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -1842,7 +1655,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.4e %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "9.9995e+02 33") == 0
@@ -1851,7 +1663,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.4e %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1.0000e+03 33") == 0
@@ -1860,7 +1671,6 @@
   }
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.275000e+01 33") == 0
@@ -1869,7 +1679,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1.234567e+06 33") == 0
@@ -1958,7 +1767,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[1000];
         int retval =
           my_sprintf (result, "%Le", data[k].value);
         const char *expected = data[k].string;
@@ -1975,7 +1783,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-3.125000e-02 33") == 0
@@ -1984,7 +1791,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0.000000e+00 33") == 0
@@ -1993,7 +1799,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -2003,7 +1808,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -2012,7 +1816,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -2021,7 +1824,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2033,7 +1835,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2045,36 +1846,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
-  { /* Pseudo-NaN.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[1000];
-    int retval =
-      my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
-    ASSERT (retval == strlen (result));
-  }
-  { /* Pseudo-Infinity.  */
-    static union { unsigned int word[4]; long double value; } x =
-      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2082,43 +1853,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
+  /* sprintf should print something for noncanonical values.  */
+  { /* Pseudo-NaN.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
+  { /* Pseudo-Infinity.  */
+    static union { unsigned int word[4]; long double value; } x =
+      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+    int retval =
+      my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
+    ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
+  }
   { /* Pseudo-Zero.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Unnormalized number.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Le %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%15Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "   1.750000e+00 33") == 0
@@ -2127,7 +1905,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-15Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00    33") == 0
@@ -2136,7 +1913,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+1.750000e+00 33") == 0
@@ -2145,7 +1921,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 1.750000e+00 33") == 0
@@ -2154,7 +1929,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.750000e+00 33") == 0
@@ -2163,7 +1937,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.Le %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "2.e+00 33") == 0
@@ -2172,7 +1945,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.Le %d", 9.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -2181,7 +1953,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015Le %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0001.234000e+03 33") == 0
@@ -2190,7 +1961,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015Le %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -2199,7 +1969,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050Le %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -2209,7 +1978,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.Le %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -2218,7 +1986,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.4Le %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "9.9995e+02 33") == 0
@@ -2227,7 +1994,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.4Le %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1.0000e+03 33") == 0
@@ -2238,7 +2004,6 @@
   /* Test the support of the %g format directive.  */
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", 12.75, 33, 44, 55);
     ASSERT (strcmp (result, "12.75 33") == 0);
@@ -2246,7 +2011,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", 1234567.0, 33, 44, 55);
     ASSERT (strcmp (result, "1.23457e+06 33") == 0
@@ -2335,7 +2099,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[1000];
         int retval =
           my_sprintf (result, "%g", data[k].value);
         const char *expected = data[k].string;
@@ -2353,7 +2116,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", -0.03125, 33, 44, 55);
     ASSERT (strcmp (result, "-0.03125 33") == 0);
@@ -2361,7 +2123,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", 0.0, 33, 44, 55);
     ASSERT (strcmp (result, "0 33") == 0);
@@ -2369,7 +2130,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", minus_zerod, 33, 44, 55);
     if (have_minus_zero ())
@@ -2378,7 +2138,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -2387,7 +2146,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -2396,7 +2154,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%g %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2406,7 +2163,6 @@
   }
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%10g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "      1.75 33") == 0);
@@ -2414,7 +2170,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-10g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.75       33") == 0);
@@ -2422,7 +2177,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "+1.75 33") == 0);
@@ -2430,7 +2184,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, " 1.75 33") == 0);
@@ -2438,7 +2191,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.75000 33") == 0);
@@ -2446,7 +2198,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.g %d", 1.75, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -2454,7 +2205,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.g %d", 9.75, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -2463,7 +2213,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%010g %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "0000001234 33") == 0);
@@ -2471,7 +2220,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015g %d", - Infinityd (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -2480,7 +2228,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050g %d", NaNd (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -2490,7 +2237,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.g %d", 1234.0, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -2499,7 +2245,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.5g %d", 999.951, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -2507,7 +2252,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.5g %d", 999.996, 33, 44, 55);
     ASSERT (strcmp (result, "1000 33") == 0);
@@ -2515,7 +2259,6 @@
   }
 
   { /* A positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", 12.75L, 33, 44, 55);
     ASSERT (strcmp (result, "12.75 33") == 0);
@@ -2523,7 +2266,6 @@
   }
 
   { /* A larger positive number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", 1234567.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1.23457e+06 33") == 0
@@ -2612,7 +2354,6 @@
     size_t k;
     for (k = 0; k < SIZEOF (data); k++)
       {
-        char result[1000];
         int retval =
           my_sprintf (result, "%Lg", data[k].value);
         const char *expected = data[k].string;
@@ -2630,7 +2371,6 @@
   }
 
   { /* A negative number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", -0.03125L, 33, 44, 55);
     ASSERT (strcmp (result, "-0.03125 33") == 0);
@@ -2638,7 +2378,6 @@
   }
 
   { /* Positive zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", 0.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0 33") == 0);
@@ -2646,7 +2385,6 @@
   }
 
   { /* Negative zero.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", minus_zerol, 33, 44, 55);
     if (have_minus_zero ())
@@ -2655,7 +2393,6 @@
   }
 
   { /* Positive infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "inf 33") == 0
@@ -2664,7 +2401,6 @@
   }
 
   { /* Negative infinity.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "-inf 33") == 0
@@ -2673,7 +2409,6 @@
   }
 
   { /* NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2685,7 +2420,6 @@
   { /* Quiet NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2697,7 +2431,6 @@
     /* Signalling NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%La %d", x.value, 33, 44, 55);
     ASSERT (strlen (result) >= 3 + 3
@@ -2705,72 +2438,50 @@
             && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* sprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Pseudo-Infinity.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Pseudo-Zero.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Unnormalized number.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
   { /* Pseudo-Denormal.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
-    char result[1000];
     int retval =
       my_sprintf (result, "%Lg %d", x.value, 33, 44, 55);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
   }
 #endif
 
   { /* Width.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%10Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "      1.75 33") == 0);
@@ -2778,7 +2489,6 @@
   }
 
   { /* FLAG_LEFT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%-10Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.75       33") == 0);
@@ -2786,7 +2496,6 @@
   }
 
   { /* FLAG_SHOWSIGN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%+Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "+1.75 33") == 0);
@@ -2794,7 +2503,6 @@
   }
 
   { /* FLAG_SPACE.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "% Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, " 1.75 33") == 0);
@@ -2802,7 +2510,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.75000 33") == 0);
@@ -2810,7 +2517,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.Lg %d", 1.75L, 33, 44, 55);
     ASSERT (strcmp (result, "2. 33") == 0);
@@ -2818,7 +2524,6 @@
   }
 
   { /* FLAG_ALT.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%#.Lg %d", 9.75L, 33, 44, 55);
     ASSERT (strcmp (result, "1.e+01 33") == 0
@@ -2827,7 +2532,6 @@
   }
 
   { /* FLAG_ZERO with finite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%010Lg %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "0000001234 33") == 0);
@@ -2835,7 +2539,6 @@
   }
 
   { /* FLAG_ZERO with infinite number.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%015Lg %d", - Infinityl (), 33, 44, 55);
     ASSERT (strcmp (result, "           -inf 33") == 0
@@ -2844,7 +2547,6 @@
   }
 
   { /* FLAG_ZERO with NaN.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%050Lg %d", NaNl (), 33, 44, 55);
     ASSERT (strlen (result) == 50 + 3
@@ -2854,7 +2556,6 @@
   }
 
   { /* Precision.  */
-    char result[1000];
     int retval =
       my_sprintf (result, "%.Lg %d", 1234.0L, 33, 44, 55);
     ASSERT (strcmp (result, "1e+03 33") == 0
@@ -2863,7 +2564,6 @@
   }
 
   { /* Precision with no rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.5Lg %d", 999.951L, 33, 44, 55);
     ASSERT (strcmp (result, "999.95 33") == 0);
@@ -2871,7 +2571,6 @@
   }
 
   { /* Precision with rounding.  */
-    char result[100];
     int retval =
       my_sprintf (result, "%.5Lg %d", 999.996L, 33, 44, 55);
     ASSERT (strcmp (result, "1000 33") == 0);
@@ -2882,7 +2581,6 @@
 
   {
     int count = -1;
-    char result[1000];
     int retval =
       my_sprintf (result, "%d %n", 123, &count, 33, 44, 55);
     ASSERT (strcmp (result, "123 ") == 0);
@@ -2893,7 +2591,6 @@
   /* Test the support of the POSIX/XSI format strings with positions.  */
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "%2$d %1$d", 33, 55);
     ASSERT (strcmp (result, "55 33") == 0);
@@ -2903,7 +2600,6 @@
   /* Test the support of the grouping flag.  */
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "%'d %d", 1234567, 99);
     ASSERT (result[strlen (result) - 1] == '9');
@@ -2913,7 +2609,6 @@
   /* Test the support of the left-adjust flag.  */
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "a%*sc", -3, "b");
     ASSERT (strcmp (result, "ab  c") == 0);
@@ -2921,7 +2616,6 @@
   }
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "a%-*sc", 3, "b");
     ASSERT (strcmp (result, "ab  c") == 0);
@@ -2929,7 +2623,6 @@
   }
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "a%-*sc", -3, "b");
     ASSERT (strcmp (result, "ab  c") == 0);
@@ -2939,7 +2632,6 @@
   /* Test the support of large precision.  */
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%.4000d %d", 1234567, 99);
     size_t i;
@@ -2950,7 +2642,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%.*d %d", 4000, 1234567, 99);
     size_t i;
@@ -2961,7 +2652,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%.4000d %d", -1234567, 99);
     size_t i;
@@ -2973,7 +2663,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%.4000u %d", 1234567, 99);
     size_t i;
@@ -2984,7 +2673,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%.4000o %d", 1234567, 99);
     size_t i;
@@ -2995,7 +2683,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%.4000x %d", 1234567, 99);
     size_t i;
@@ -3006,7 +2693,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%#.4000x %d", 1234567, 99);
     size_t i;
@@ -3019,7 +2705,6 @@
   }
 
   {
-    char result[5000];
     int retval =
       my_sprintf (result, "%.4000f %d", 1.0, 99);
     size_t i;
@@ -3032,7 +2717,6 @@
   }
 
   {
-    char result[1000];
     int retval =
       my_sprintf (result, "%.511f %d", 1.0, 99);
     size_t i;
@@ -3046,7 +2730,6 @@
 
   {
     char input[5000];
-    char result[5000];
     int retval;
     size_t i;
 
@@ -3070,7 +2753,6 @@
     for (i = 1; i <= 8; i++)
       {
         char *block;
-        char result[5000];
         int retval;
 
         block = (char *) malloc (i);
@@ -3090,7 +2772,6 @@
       {
         wchar_t *block;
         size_t j;
-        char result[5000];
         int retval;
 
         block = (wchar_t *) malloc (i * sizeof (wchar_t));
--- a/tests/test-vasnprintf-posix.c
+++ b/tests/test-vasnprintf-posix.c
@@ -589,13 +589,7 @@
     ASSERT (length == strlen (result));
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asnprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -603,10 +597,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -616,10 +608,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -629,10 +619,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -642,10 +630,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -655,10 +641,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
 #endif
@@ -1403,13 +1387,7 @@
     ASSERT (length == strlen (result));
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asnprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -1417,10 +1395,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -1430,10 +1406,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -1443,10 +1417,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -1456,10 +1428,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -1469,10 +1439,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
 #endif
@@ -2405,10 +2373,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   {
@@ -2419,19 +2385,11 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asnprintf should print something even for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -2439,10 +2397,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -2452,10 +2408,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -2465,10 +2419,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -2478,10 +2430,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -2491,10 +2441,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 <= length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
 #endif
@@ -3179,13 +3127,7 @@
     ASSERT (length == strlen (result));
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asnprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -3193,10 +3135,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -3206,10 +3146,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -3219,10 +3157,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -3232,10 +3168,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -3245,10 +3179,8 @@
     char *result =
       my_asnprintf (NULL, &length, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (length == strlen (result));
+    ASSERT (3 < length && strcmp (result + length - 3, " 33") == 0);
     free (result);
   }
 #endif
--- a/tests/test-vasprintf-posix.c
+++ b/tests/test-vasprintf-posix.c
@@ -570,13 +570,7 @@
     ASSERT (retval == strlen (result));
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -584,10 +578,8 @@
     int retval =
       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -597,10 +589,8 @@
     int retval =
       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -610,10 +600,8 @@
     int retval =
       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -623,10 +611,8 @@
     int retval =
       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -636,10 +622,8 @@
     int retval =
       my_asprintf (&result, "%La %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
 #endif
@@ -1384,13 +1368,7 @@
     ASSERT (retval == strlen (result));
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -1398,10 +1376,8 @@
     int retval =
       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -1411,10 +1387,8 @@
     int retval =
       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -1424,10 +1398,8 @@
     int retval =
       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -1437,10 +1409,8 @@
     int retval =
       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -1450,10 +1420,8 @@
     int retval =
       my_asprintf (&result, "%Lf %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
 #endif
@@ -2406,13 +2374,7 @@
     ASSERT (retval == strlen (result));
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -2420,10 +2382,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -2433,10 +2393,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -2446,10 +2404,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -2459,10 +2415,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -2472,10 +2426,8 @@
     int retval =
       my_asprintf (&result, "%Le %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
 #endif
@@ -3160,13 +3112,7 @@
     ASSERT (retval == strlen (result));
     free (result);
   }
-  /* The isnanl function should recognize Pseudo-NaNs, Pseudo-Infinities,
-     Pseudo-Zeroes, Unnormalized Numbers, and Pseudo-Denormals, as defined in
-       Intel IA-64 Architecture Software Developer's Manual, Volume 1:
-       Application Architecture.
-       Table 5-2 "Floating-Point Register Encodings"
-       Figure 5-6 "Memory to Floating-Point Register Data Translation"
-   */
+  /* asprintf should print something for noncanonical values.  */
   { /* Pseudo-NaN.  */
     static union { unsigned int word[4]; long double value; } x =
       { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
@@ -3174,10 +3120,8 @@
     int retval =
       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Infinity.  */
@@ -3187,10 +3131,8 @@
     int retval =
       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Zero.  */
@@ -3200,10 +3142,8 @@
     int retval =
       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Unnormalized number.  */
@@ -3213,10 +3153,8 @@
     int retval =
       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
   { /* Pseudo-Denormal.  */
@@ -3226,10 +3164,8 @@
     int retval =
       my_asprintf (&result, "%Lg %d", x.value, 33, 44, 55);
     ASSERT (result != NULL);
-    ASSERT (strlen (result) >= 3 + 3
-            && strisnan (result, 0, strlen (result) - 3, 0)
-            && strcmp (result + strlen (result) - 3, " 33") == 0);
     ASSERT (retval == strlen (result));
+    ASSERT (3 < retval && strcmp (result + retval - 3, " 33") == 0);
     free (result);
   }
 #endif