summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2016-12-15 07:45:45 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2016-12-15 07:45:45 +0000
commit3b45fa5f7a1d47b485a09003509f3b500eaa0b0c (patch)
tree86f1551f5ed794b20429fe9a79dff59544036ab8
parent6873e9a660f52c49fbbec0738be54b98f8cdec20 (diff)
downloadmpfr-3b45fa5f7a1d47b485a09003509f3b500eaa0b0c.tar.gz
[src/vasprintf.c] Fixed a bug: spec.prec can be a negative number other
than -1 (when such a value is given as an argument with ".*"). [tests/tsprintf.c] Added non-regression test. (merged changesets r11037-11038 from the trunk) git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/3.1@11043 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--src/vasprintf.c2
-rw-r--r--tests/tsprintf.c20
2 files changed, 21 insertions, 1 deletions
diff --git a/src/vasprintf.c b/src/vasprintf.c
index 7db85a962..c517b6116 100644
--- a/src/vasprintf.c
+++ b/src/vasprintf.c
@@ -1593,7 +1593,7 @@ partition_number (struct number_parts *np, mpfr_srcptr p,
}
else if (spec.spec == 'f' || spec.spec == 'F')
{
- if (spec.prec == -1)
+ if (spec.prec < 0)
spec.prec = 6;
if (regular_fg (np, p, spec, NULL) == -1)
goto error;
diff --git a/tests/tsprintf.c b/tests/tsprintf.c
index 42778b8fe..7d6f3182f 100644
--- a/tests/tsprintf.c
+++ b/tests/tsprintf.c
@@ -1251,6 +1251,25 @@ check_emin (void)
check_emin_aux (MPFR_EMIN_MIN);
}
+static void
+test20161214 (void)
+{
+ mpfr_t x;
+ char buf[32];
+ const char s[] = "0x0.fffffffffffff8p+1024";
+ int r;
+
+ mpfr_init2 (x, 64);
+ mpfr_set_str (x, s, 16, MPFR_RNDN);
+ r = mpfr_snprintf (buf, 32, "%.*RDf", -2, x);
+ MPFR_ASSERTN(r == 316);
+ r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN + 1, x);
+ MPFR_ASSERTN(r == 316);
+ r = mpfr_snprintf (buf, 32, "%.*RDf", INT_MIN, x);
+ MPFR_ASSERTN(r == 316);
+ mpfr_clear (x);
+}
+
int
main (int argc, char **argv)
{
@@ -1271,6 +1290,7 @@ main (int argc, char **argv)
mixed ();
check_emax ();
check_emin ();
+ test20161214 ();
#if defined(HAVE_LOCALE_H) && defined(HAVE_SETLOCALE)
#if MPFR_LCONV_DPTS