diff --git a/ChangeLog b/ChangeLog index f61a292d97..7368be4c78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-11-06 Gabriel F. T. Gomes + + * misc/Makefile (tests): Add tst-ldbl-warn. + * misc/tst-ldbl-warn.c: New file. + 2018-11-06 Gabriel F. T. Gomes * argp/Makefile (tests): Add tst-ldbl-argp. diff --git a/misc/Makefile b/misc/Makefile index 30e0673c8a..201de124f4 100644 --- a/misc/Makefile +++ b/misc/Makefile @@ -84,7 +84,8 @@ tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \ tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 \ tst-mntent-blank-corrupt tst-mntent-blank-passno bug18240 \ tst-preadvwritev tst-preadvwritev64 tst-makedev tst-empty \ - tst-preadvwritev2 tst-preadvwritev64v2 tst-warn-wide + tst-preadvwritev2 tst-preadvwritev64v2 tst-warn-wide \ + tst-ldbl-warn # Tests which need libdl. ifeq (yes,$(build-shared)) diff --git a/misc/tst-ldbl-warn.c b/misc/tst-ldbl-warn.c new file mode 100644 index 0000000000..3ac0e4c873 --- /dev/null +++ b/misc/tst-ldbl-warn.c @@ -0,0 +1,120 @@ +/* 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 + . */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +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. */ + struct xmemstream stream; + xopen_memstream (&stream); + FILE *old_stderr = stderr; + stderr = stream.out; + + /* Write to the buffer using one of the *warn* functions. */ + errno = 0; + 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; + + /* Close the in-memory stream and check the output buffer. */ + xfclose_memstream (&stream); + if (strcmp (stream.buffer, expected) != 0) + FAIL_EXIT1 ("error:\n" + " expected: '%s'\n" + " actual: '%s'\n", + expected, stream.buffer); + + if (stream.buffer != NULL) + free (stream.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