Issue #5835: Deprecate PyOS_ascii_formatd.
diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst
index 1c19879..a2e2542 100644
--- a/Doc/c-api/conversion.rst
+++ b/Doc/c-api/conversion.rst
@@ -73,6 +73,43 @@
    The return value is a pointer to *buffer* with the converted string or NULL if
    the conversion failed.
 
+   .. deprecated:: 3.1
+     Use :cfunc:`PyOS_double_to_string` instead.
+
+
+.. cfunction:: char* PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype)
+
+   Convert a :ctype:`double` *val* to a string using supplied
+   *format_code*, *precision*, and *flags*.
+
+   *format_code* must be one of ``'e'``, ``'E'``, ``'f'``, ``'F'``, ``'g'``,
+   ``'G'``, ``'s'``, or ``'r'``.  For ``'s'`` and ``'r'``, the supplied
+   *precision* must be 0 and is ignored.  These specify the standard
+   :func:`str` and :func:`repr` formats, respectively.
+
+   *flags* can be zero or more of the values *Py_DTSF_SIGN*,
+   *Py_DTSF_ADD_DOT_0*, or *Py_DTSF_ALT*, or-ed together:
+
+   * *Py_DTSF_SIGN* means to always precede the returned string with a sign
+     character, even if *val* is non-negative.
+
+   * *Py_DTSF_ADD_DOT_0* means to ensure that the returned string will not look
+     like an integer.
+
+   * *Py_DTSF_ALT* means to apply "alternate" formatting rules.  See the
+     documentation for the :cfunc:`PyOS_snprintf` ``'#'`` specifier for
+     details.
+
+   If *ptype* is non-NULL, then the value it points to will be set to one of
+   *Py_DTST_FINITE*, *Py_DTST_INFINITE*, or *Py_DTST_NAN*, signifying that
+   *val* is a finite number, an infinite number, or not a number, respectively.
+
+   The return value is a pointer to *buffer* with the converted string or
+   *NULL* if the conversion failed. The caller is responsible for freeing the
+   returned string by calling :cfunc:`PyMem_Free`.
+
+   .. versionadded:: 3.1
+
 
 .. cfunction:: double PyOS_ascii_atof(const char *nptr)
 
diff --git a/Misc/NEWS b/Misc/NEWS
index 8d98720..2240c62 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@
 Core and Builtins
 -----------------
 
+- Issue #5835: Deprecate PyOS_ascii_formatd.
+
 - Issue #4971: Fix titlecase for characters that are their own
   titlecase, but not their own uppercase.
 
diff --git a/Python/pystrtod.c b/Python/pystrtod.c
index b5dd93d..872cc37 100644
--- a/Python/pystrtod.c
+++ b/Python/pystrtod.c
@@ -433,7 +433,7 @@
  * Return value: The pointer to the buffer with the converted string.
  **/
 char *
-PyOS_ascii_formatd(char       *buffer, 
+_PyOS_ascii_formatd(char       *buffer, 
 		   size_t      buf_size, 
 		   const char *format, 
 		   double      d)
@@ -508,6 +508,20 @@
 	return buffer;
 }
 
+char *
+PyOS_ascii_formatd(char       *buffer, 
+		   size_t      buf_size, 
+		   const char *format, 
+		   double      d)
+{
+	if (PyErr_WarnEx(PyExc_DeprecationWarning,
+			 "PyOS_ascii_formatd is deprecated, "
+			 "use PyOS_double_to_string instead", 1) < 0)
+		return NULL;
+
+	return _PyOS_ascii_formatd(buffer, buf_size, format, d);
+}
+
 #ifdef PY_NO_SHORT_FLOAT_REPR
 
 /* The fallback code to use if _Py_dg_dtoa is not available. */
@@ -638,8 +652,10 @@
 		if ((flags & Py_DTSF_ADD_DOT_0) && (format_code != 'e'))
 			format_code = 'Z';
 
-		PyOS_snprintf(format, 32, "%%%s.%i%c", (flags & Py_DTSF_ALT ? "#" : ""), precision, format_code);
-		PyOS_ascii_formatd(buf, sizeof(buf), format, val);
+		PyOS_snprintf(format, sizeof(format), "%%%s.%i%c",
+			      (flags & Py_DTSF_ALT ? "#" : ""), precision,
+			      format_code);
+		_PyOS_ascii_formatd(buf, sizeof(buf), format, val);
 		/* remove trailing zeros if necessary */
 		if (strip_trailing_zeros)
 			remove_trailing_zeros(buf);