- Issue #2371: Add a Py3k warning when catching an exception that
  doesn't derive from BaseException.
diff --git a/Python/ceval.c b/Python/ceval.c
index 4fc1709..72da263 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -4042,6 +4042,13 @@
 	}
 }
 
+#define Py3kExceptionClass_Check(x)     \
+    (PyType_Check((x)) &&               \
+     PyType_FastSubclass((PyTypeObject*)(x), Py_TPFLAGS_BASE_EXC_SUBCLASS))
+
+#define CANNOT_CATCH_MSG "catching classes that don't inherit from " \
+			 "BaseException is not allowed in 3.x."
+
 static PyObject *
 cmp_outcome(int op, register PyObject *v, register PyObject *w)
 {
@@ -4079,6 +4086,16 @@
 					if (ret_val == -1)
 						return NULL;
 				}
+				if (Py_Py3kWarningFlag  &&
+				    !Py3kExceptionClass_Check(exc))
+				{
+					int ret_val;
+					ret_val = PyErr_WarnEx(
+						PyExc_DeprecationWarning,
+						CANNOT_CATCH_MSG, 1);
+					if (ret_val == -1)
+						return NULL;
+				}
 			}
 		}
 		else {
@@ -4091,6 +4108,16 @@
 				if (ret_val == -1)
 					return NULL;
 			}
+			if (Py_Py3kWarningFlag  &&
+			    !Py3kExceptionClass_Check(w))
+			{
+				int ret_val;
+				ret_val = PyErr_WarnEx(
+					PyExc_DeprecationWarning,
+					CANNOT_CATCH_MSG, 1);
+				if (ret_val == -1)
+					return NULL;
+			}
 		}
 		res = PyErr_GivenExceptionMatches(v, w);
 		break;