Issue #5080: turn the DeprecationWarning from float arguments passed
to integer PyArg_Parse* format codes into a TypeError.  Add a
DeprecationWarning for floats passed with the 'L' format code, which
didn't previously have a warning.
diff --git a/Python/getargs.c b/Python/getargs.c
index 1fd17d3..287b5d9 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -526,7 +526,7 @@
 /* explicitly check for float arguments when integers are expected.  For now
  * signal a warning.  Returns true if an exception was raised. */
 static int
-float_argument_error(PyObject *arg)
+float_argument_warning(PyObject *arg)
 {
 	if (PyFloat_Check(arg) &&
 	    PyErr_Warn(PyExc_DeprecationWarning,
@@ -536,6 +536,20 @@
 		return 0;
 }
 
+/* explicitly check for float arguments when integers are expected.  Raises
+   TypeError and returns true for float arguments. */
+static int
+float_argument_error(PyObject *arg)
+{
+	if (PyFloat_Check(arg)) {
+		PyErr_SetString(PyExc_TypeError,
+				"integer argument expected, got float");
+		return 1;
+	}
+	else
+		return 0;
+}
+
 /* Convert a non-tuple argument.  Return NULL if conversion went OK,
    or a string with a message describing the failure.  The message is
    formatted as "must be <desired type>, not <actual type>".
@@ -719,7 +733,10 @@
 #ifdef HAVE_LONG_LONG
 	case 'L': {/* PY_LONG_LONG */
 		PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * );
-		PY_LONG_LONG ival = PyLong_AsLongLong( arg );
+		PY_LONG_LONG ival;
+		if (float_argument_warning(arg))
+			return converterr("long<L>", arg, msgbuf, bufsize);
+		ival = PyLong_AsLongLong(arg);
 		if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred() ) {
 			return converterr("long<L>", arg, msgbuf, bufsize);
 		} else {