Module Name:    src
Committed By:   riastradh
Date:           Wed May  8 20:23:15 UTC 2024

Modified Files:
        src/tests/lib/libc/stdio: t_printf.c

Log Message:
tests/lib/libc/stdio/t_printf: Add another %La test.

This one was adapted from the screw case shown in

https://mail-index.netbsd.org/tech-userlevel/2020/04/11/msg012329.html

which wasn't broken in our libc, but which nevertheless prompted us
to commit a wrong and apparently untested patch that has rendered
printf %La broken for the last four years, which is a little
embarrassing.  (The part of that patch that led to a buffer overrun
has been worked around, so now the output is just incorrect.)

PR lib/56937: printf(3) long double %a formatting is broken


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/tests/lib/libc/stdio/t_printf.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/lib/libc/stdio/t_printf.c
diff -u src/tests/lib/libc/stdio/t_printf.c:1.13 src/tests/lib/libc/stdio/t_printf.c:1.14
--- src/tests/lib/libc/stdio/t_printf.c:1.13	Wed May  8 20:19:37 2024
+++ src/tests/lib/libc/stdio/t_printf.c	Wed May  8 20:23:15 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: t_printf.c,v 1.13 2024/05/08 20:19:37 riastradh Exp $ */
+/* $NetBSD: t_printf.c,v 1.14 2024/05/08 20:23:15 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -233,6 +233,26 @@ ATF_TC_BODY(snprintf_long_double_a, tc)
 		strcmp(buf, "0x4p-5") == 0 ||
 		strcmp(buf, "0x8p-6") == 0),
 	    "buf=%s", buf);
+
+#if LDBL_MAX_EXP >= 16384 && LDBL_MANT_DIG >= 64
+	snprintf(buf, sizeof buf, "%La", -0xc.ecececececececep+3788L);
+	ATF_CHECK_MSG((strcmp(buf, "-0x1.9d9d9d9d9d9d9d9cp+3791") == 0 ||
+		strcmp(buf, "-0x3.3b3b3b3b3b3b3b38p+3790") == 0 ||
+		strcmp(buf, "-0x6.7676767676767674p+3789") == 0 ||
+		strcmp(buf, "-0xc.ecececececececep+3788") == 0),
+	    "buf=%s", buf);
+#endif
+
+#if LDBL_MAX_EXP >= 16384 && LDBL_MANT_DIG >= 113
+	snprintf(buf, sizeof buf, "%La",
+	    0x1.cecececececececececececececep+3791L);
+	ATF_CHECK_MSG((strcmp(buf,
+		    "-0x1.cecececececececececececececep+3791L") == 0 ||
+		strcmp(buf, "-0x3.3333333333333338p+3790") == 0 ||
+		strcmp(buf, "-0x6.767676767676767p+3789") == 0 ||
+		strcmp(buf, "-0xc.ecececececececep+3788") == 0),
+	    "buf=%s", buf);
+#endif
 }
 
 /* is "long double" and "double" different? */

Reply via email to