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? */