Properly check for consistency with the third argument of
compile() when compiling an AST node.
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 085cf61..0703d51 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -5944,13 +5944,20 @@
     return ast2obj_mod(t);
 }
 
-mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena)
+/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
+mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
 {
     mod_ty res;
+    PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
+                            (PyObject*)Interactive_type};
+    char *req_name[] = {"Module", "Expression", "Interactive"};
+    assert(0 <= mode && mode <= 2);
+
     init_types();
-    if (!PyObject_IsInstance(ast, (PyObject*)mod_type)) {
-        PyErr_SetString(PyExc_TypeError, "expected either Module, Interactive "
-                        "or Expression node");
+
+    if (!PyObject_IsInstance(ast, req_type[mode])) {
+        PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
+                     req_name[mode], Py_TYPE(ast)->tp_name);
         return NULL;
     }
     if (obj2ast_mod(ast, &res, arena) != 0)
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index fff4fda..bcdcda6 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -466,7 +466,7 @@
 	char *str;
 	char *filename;
 	char *startstr;
-	int start;
+	int mode = -1;
 	int dont_inherit = 0;
 	int supplied_flags = 0;
 	PyCompilerFlags cf;
@@ -474,6 +474,7 @@
 	Py_ssize_t length;
 	static char *kwlist[] = {"source", "filename", "mode", "flags",
 				 "dont_inherit", NULL};
+	int start[] = {Py_file_input, Py_eval_input, Py_single_input};
 
 	if (!PyArg_ParseTupleAndKeywords(args, kwds, "Oss|ii:compile",
 					 kwlist, &cmd, &filename, &startstr,
@@ -495,6 +496,18 @@
 		PyEval_MergeCompilerFlags(&cf);
 	}
 
+	if (strcmp(startstr, "exec") == 0)
+		mode = 0;
+	else if (strcmp(startstr, "eval") == 0)
+		mode = 1;
+	else if (strcmp(startstr, "single") == 0)
+		mode = 2;
+	else {
+		PyErr_SetString(PyExc_ValueError,
+				"compile() arg 3 must be 'exec', 'eval' or 'single'");
+		return NULL;
+	}
+
 	if (PyAST_Check(cmd)) {
 		if (supplied_flags & PyCF_ONLY_AST) {
 			Py_INCREF(cmd);
@@ -505,7 +518,7 @@
 			mod_ty mod;
 
 			arena = PyArena_New();
-			mod = PyAST_obj2mod(cmd, arena);
+			mod = PyAST_obj2mod(cmd, arena, mode);
 			if (mod == NULL) {
 				PyArena_Free(arena);
 				return NULL;
@@ -526,19 +539,6 @@
 		cf.cf_flags |= PyCF_SOURCE_IS_UTF8;
 	}
 #endif
-	/* XXX: is it possible to pass start to the PyAST_ branch? */
-	if (strcmp(startstr, "exec") == 0)
-		start = Py_file_input;
-	else if (strcmp(startstr, "eval") == 0)
-		start = Py_eval_input;
-	else if (strcmp(startstr, "single") == 0)
-		start = Py_single_input;
-	else {
-		PyErr_SetString(PyExc_ValueError,
-				"compile() arg 3 must be 'exec'"
-				"or 'eval' or 'single'");
-		goto cleanup;
-	}
 
 	if (PyObject_AsReadBuffer(cmd, (const void **)&str, &length))
 		goto cleanup;
@@ -547,7 +547,7 @@
 				"compile() expected string without null bytes");
 		goto cleanup;
 	}
-	result = Py_CompileStringFlags(str, filename, start, &cf);
+	result = Py_CompileStringFlags(str, filename, start[mode], &cf);
 cleanup:
 	Py_XDECREF(tmp);
 	return result;