@@ -89,6 +89,8 @@ tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \
tests-internal := tst-atomic tst-atomic-long tst-allocate_once
tests-static := tst-empty
+tests-internal += tst-ldbl-warn
+
ifeq ($(run-built-tests),yes)
tests-special += $(objpfx)tst-error1-mem.out \
$(objpfx)tst-allocate_once-mem.out
new file mode 100644
@@ -0,0 +1,115 @@
+/* Test for the long double conversions in *warn* functions.
+ Copyright (C) 2018 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <err.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <support/check.h>
+
+enum {WARN, WARNX, VWARN, VWARNX};
+
+static void
+do_one_test (int select, const char *format, va_list args,
+ long double arg1, double arg2, long double arg3,
+ double arg4, const char *expected)
+{
+ /* Prepare in-memory buffer to hold the output. */
+ char *buffer = NULL;
+ size_t length = 0;
+ FILE *fp = open_memstream (&buffer, &length);
+ TEST_VERIFY_EXIT (fp != NULL);
+ FILE *old_stderr = stderr;
+ stderr = fp;
+
+ /* Write to the buffer using one of the *warn* functions. */
+ switch (select)
+ {
+ case WARN:
+ warn (format, arg1, arg2, arg3, arg4);
+ break;
+ case WARNX:
+ warnx (format, arg1, arg2, arg3, arg4);
+ break;
+ case VWARN:
+ vwarn (format, args);
+ break;
+ case VWARNX:
+ vwarnx (format, args);
+ break;
+ }
+
+ stderr = old_stderr;
+ TEST_VERIFY_EXIT (!ferror (fp));
+ TEST_COMPARE (fclose (fp), 0);
+
+ /* Check that the rest of the output is as expected. */
+ if (strcmp (buffer, expected) != 0)
+ FAIL_EXIT1 ("unexpected output: %s", buffer);
+ free (buffer);
+}
+
+static void
+do_test_call_varg (const char *format, ...)
+{
+ va_list args;
+
+ va_start (args, format);
+ do_one_test (VWARN, format, args, 0, 0, 0, 0,
+ "tst-ldbl-warn: "
+ "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
+ va_end (args);
+
+ va_start (args, format);
+ do_one_test (VWARNX, format, args, 0, 0, 0, 0,
+ "tst-ldbl-warn: "
+ "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
+ va_end (args);
+}
+
+static void
+do_test_call_rarg (const char *format, long double arg1, double arg2,
+ long double arg3, double arg4)
+{
+ va_list args;
+ memset (&args, 0, sizeof (args));
+ do_one_test (WARN, format, args, arg1, arg2, arg3, arg4,
+ "tst-ldbl-warn: "
+ "-1.000000 - -2.000000 - -3.000000 - -4.000000: Success\n");
+ do_one_test (WARNX, format, args, arg1, arg2, arg3, arg4,
+ "tst-ldbl-warn: "
+ "-1.000000 - -2.000000 - -3.000000 - -4.000000\n");
+}
+
+static int
+do_test (void)
+{
+ long double arg1 = -1;
+ long double arg3 = -3;
+ double arg2 = -2;
+ double arg4 = -4;
+
+ do_test_call_rarg ("%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
+ do_test_call_varg ("%Lf - %f - %Lf - %f", arg1, arg2, arg3, arg4);
+
+ return 0;
+}
+
+#include <support/test-driver.c>