bpo-35975: Support parsing earlier minor versions of Python 3 (GH-12086)



This adds a `feature_version` flag to `ast.parse()` (documented) and `compile()` (hidden) that allow tweaking the parser to support older versions of the grammar. In particular if `feature_version` is 5 or 6, the hacks for the `async` and `await` keyword from PEP 492 are reinstated. (For 7 or higher, these are unconditionally treated as keywords, but they are still special tokens rather than `NAME` tokens that the parser driver recognizes.)



https://bugs.python.org/issue35975
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 92ec157..0411f9f 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -8900,6 +8900,11 @@
 /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
 mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
 {
+    return PyAST_obj2mod_ex(ast, arena, mode, PY_MINOR_VERSION);
+}
+
+mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_version)
+{
     mod_ty res;
     PyObject *req_type[3];
     char *req_name[] = {"Module", "Expression", "Interactive"};
diff --git a/Python/ast.c b/Python/ast.c
index 2e96048..d4ee1b3 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -564,6 +564,7 @@
     PyArena *c_arena; /* Arena for allocating memory. */
     PyObject *c_filename; /* filename */
     PyObject *c_normalize; /* Normalization function from unicodedata. */
+    int c_feature_version; /* Latest minor version of Python for allowed features */
 };
 
 static asdl_seq *seq_for_testlist(struct compiling *, const node *);
@@ -783,6 +784,7 @@
     /* borrowed reference */
     c.c_filename = filename;
     c.c_normalize = NULL;
+    c.c_feature_version = flags->cf_feature_version;
 
     if (TYPE(n) == encoding_decl)
         n = CHILD(n, 0);
@@ -955,7 +957,7 @@
 */
 
 static operator_ty
-get_operator(const node *n)
+get_operator(struct compiling *c, const node *n)
 {
     switch (TYPE(n)) {
         case VBAR:
@@ -975,6 +977,11 @@
         case STAR:
             return Mult;
         case AT:
+            if (c->c_feature_version < 5) {
+                ast_error(c, n,
+                          "The '@' operator is only supported in Python 3.5 and greater");
+                return (operator_ty)0;
+            }
             return MatMult;
         case SLASH:
             return Div;
@@ -1209,6 +1216,11 @@
             else
                 return Mult;
         case '@':
+            if (c->c_feature_version < 5) {
+                ast_error(c, n,
+                          "The '@' operator is only supported in Python 3.5 and greater");
+                return (operator_ty)0;
+            }
             return MatMult;
         default:
             PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
@@ -1518,7 +1530,7 @@
                 }
                 else if (found_default) {
                     ast_error(c, n,
-                             "non-default argument follows default argument");
+                              "non-default argument follows default argument");
                     return NULL;
                 }
                 arg = ast_for_arg(c, ch);
@@ -1719,6 +1731,12 @@
     node *tc;
     string type_comment = NULL;
 
+    if (is_async && c->c_feature_version < 5) {
+        ast_error(c, n,
+                  "Async functions are only supported in Python 3.5 and greater");
+        return NULL;
+    }
+
     REQ(n, funcdef);
 
     name = NEW_IDENTIFIER(CHILD(n, name_i));
@@ -1772,10 +1790,9 @@
 static stmt_ty
 ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
 {
-    /* async_funcdef: 'async' funcdef */
+    /* async_funcdef: ASYNC funcdef */
     REQ(n, async_funcdef);
-    REQ(CHILD(n, 0), NAME);
-    assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
+    REQ(CHILD(n, 0), ASYNC);
     REQ(CHILD(n, 1), funcdef);
 
     return ast_for_funcdef_impl(c, n, decorator_seq,
@@ -1794,10 +1811,9 @@
 static stmt_ty
 ast_for_async_stmt(struct compiling *c, const node *n)
 {
-    /* async_stmt: 'async' (funcdef | with_stmt | for_stmt) */
+    /* async_stmt: ASYNC (funcdef | with_stmt | for_stmt) */
     REQ(n, async_stmt);
-    REQ(CHILD(n, 0), NAME);
-    assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
+    REQ(CHILD(n, 0), ASYNC);
 
     switch (TYPE(CHILD(n, 1))) {
         case funcdef:
@@ -1948,8 +1964,7 @@
     n_fors++;
     REQ(n, comp_for);
     if (NCH(n) == 2) {
-        REQ(CHILD(n, 0), NAME);
-        assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
+        REQ(CHILD(n, 0), ASYNC);
         n = CHILD(n, 1);
     }
     else if (NCH(n) == 1) {
@@ -2034,8 +2049,7 @@
 
         if (NCH(n) == 2) {
             is_async = 1;
-            REQ(CHILD(n, 0), NAME);
-            assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
+            REQ(CHILD(n, 0), ASYNC);
             sync_n = CHILD(n, 1);
         }
         else {
@@ -2043,6 +2057,13 @@
         }
         REQ(sync_n, sync_comp_for);
 
+        /* Async comprehensions only allowed in Python 3.6 and greater */
+        if (is_async && c->c_feature_version < 6) {
+            ast_error(c, n,
+                      "Async comprehensions are only supported in Python 3.6 and greater");
+            return NULL;
+        }
+
         for_ch = CHILD(sync_n, 1);
         t = ast_for_exprlist(c, for_ch, Store);
         if (!t)
@@ -2337,7 +2358,15 @@
         return str;
     }
     case NUMBER: {
-        PyObject *pynum = parsenumber(c, STR(ch));
+        PyObject *pynum;
+        /* Underscores in numeric literals are only allowed in Python 3.6 or greater */
+        /* Check for underscores here rather than in parse_number so we can report a line number on error */
+        if (c->c_feature_version < 6 && strchr(STR(ch), '_') != NULL) {
+            ast_error(c, ch,
+                      "Underscores in numeric literals are only supported in Python 3.6 and greater");
+            return NULL;
+        }
+        pynum = parsenumber(c, STR(ch));
         if (!pynum)
             return NULL;
 
@@ -2420,8 +2449,8 @@
                     TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
                 /* It's a dictionary comprehension. */
                 if (is_dict) {
-                    ast_error(c, n, "dict unpacking cannot be used in "
-                              "dict comprehension");
+                    ast_error(c, n,
+                              "dict unpacking cannot be used in dict comprehension");
                     return NULL;
                 }
                 res = ast_for_dictcomp(c, ch);
@@ -2524,7 +2553,7 @@
     if (!expr2)
         return NULL;
 
-    newoperator = get_operator(CHILD(n, 1));
+    newoperator = get_operator(c, CHILD(n, 1));
     if (!newoperator)
         return NULL;
 
@@ -2539,7 +2568,7 @@
         expr_ty tmp_result, tmp;
         const node* next_oper = CHILD(n, i * 2 + 1);
 
-        newoperator = get_operator(next_oper);
+        newoperator = get_operator(c, next_oper);
         if (!newoperator)
             return NULL;
 
@@ -2678,7 +2707,12 @@
     REQ(n, atom_expr);
     nch = NCH(n);
 
-    if (TYPE(CHILD(n, 0)) == NAME && strcmp(STR(CHILD(n, 0)), "await") == 0) {
+    if (TYPE(CHILD(n, 0)) == AWAIT) {
+        if (c->c_feature_version < 5) {
+            ast_error(c, n,
+                      "Await expressions are only supported in Python 3.5 and greater");
+            return NULL;
+        }
         start = 1;
         assert(nch > 1);
     }
@@ -2775,7 +2809,7 @@
        term: factor (('*'|'@'|'/'|'%'|'//') factor)*
        factor: ('+'|'-'|'~') factor | power
        power: atom_expr ['**' factor]
-       atom_expr: ['await'] atom trailer*
+       atom_expr: [AWAIT] atom trailer*
        yield_expr: 'yield' [yield_arg]
     */
 
@@ -3233,6 +3267,13 @@
         node *deep, *ann = CHILD(n, 1);
         int simple = 1;
 
+        /* AnnAssigns are only allowed in Python 3.6 or greater */
+        if (c->c_feature_version < 6) {
+            ast_error(c, ch,
+                      "Variable annotation syntax is only supported in Python 3.6 and greater");
+            return NULL;
+        }
+
         /* we keep track of parens to qualify (x) as expression not name */
         deep = ch;
         while (NCH(deep) == 1) {
@@ -4050,6 +4091,13 @@
     int end_lineno, end_col_offset;
     int has_type_comment;
     string type_comment;
+
+    if (is_async && c->c_feature_version < 5) {
+        ast_error(c, n,
+                  "Async for loops are only supported in Python 3.5 and greater");
+        return NULL;
+    }
+
     /* for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] */
     REQ(n, for_stmt);
 
@@ -4278,6 +4326,12 @@
     asdl_seq *items, *body;
     string type_comment;
 
+    if (is_async && c->c_feature_version < 5) {
+        ast_error(c, n,
+                  "Async with statements are only supported in Python 3.5 and greater");
+        return NULL;
+    }
+
     REQ(n, with_stmt);
 
     has_type_comment = TYPE(CHILD(n, NCH(n) - 2)) == TYPE_COMMENT;
@@ -4768,6 +4822,7 @@
     str[len+2] = 0;
 
     cf.cf_flags = PyCF_ONLY_AST;
+    cf.cf_feature_version = PY_MINOR_VERSION;
     mod_n = PyParser_SimpleParseStringFlagsFilename(str, "<fstring>",
                                                     Py_eval_input, 0);
     if (!mod_n) {
@@ -5568,6 +5623,13 @@
             }
         }
     }
+
+    /* fstrings are only allowed in Python 3.6 and greater */
+    if (fmode && c->c_feature_version < 6) {
+        ast_error(c, n, "Format strings are only supported in Python 3.6 and greater");
+        return -1;
+    }
+
     if (fmode && *bytesmode) {
         PyErr_BadInternalCall();
         return -1;
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index a19b8b8..7a2b259 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -745,6 +745,7 @@
     flags: int = 0
     dont_inherit: bool(accept={int}) = False
     optimize: int = -1
+    feature_version: int = -1
 
 Compile source into a code object that can be executed by exec() or eval().
 
@@ -763,8 +764,8 @@
 static PyObject *
 builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
                      const char *mode, int flags, int dont_inherit,
-                     int optimize)
-/*[clinic end generated code: output=1fa176e33452bb63 input=0ff726f595eb9fcd]*/
+                     int optimize, int feature_version)
+/*[clinic end generated code: output=b0c09c84f116d3d7 input=5fcc30651a6acaa9]*/
 {
     PyObject *source_copy;
     const char *str;
@@ -775,6 +776,10 @@
     PyObject *result;
 
     cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8;
+    cf.cf_feature_version = PY_MINOR_VERSION;
+    if (feature_version >= 0 && (flags & PyCF_ONLY_AST)) {
+        cf.cf_feature_version = feature_version;
+    }
 
     if (flags &
         ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST | PyCF_TYPE_COMMENTS))
@@ -981,6 +986,7 @@
     }
 
     cf.cf_flags = PyCF_SOURCE_IS_UTF8;
+    cf.cf_feature_version = PY_MINOR_VERSION;
     str = source_as_string(source, "eval", "string, bytes or code", &cf, &source_copy);
     if (str == NULL)
         return NULL;
@@ -1068,6 +1074,7 @@
         const char *str;
         PyCompilerFlags cf;
         cf.cf_flags = PyCF_SOURCE_IS_UTF8;
+        cf.cf_feature_version = PY_MINOR_VERSION;
         str = source_as_string(source, "exec",
                                        "string, bytes or code", &cf,
                                        &source_copy);
diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h
index 1b82f77..df99709 100644
--- a/Python/clinic/bltinmodule.c.h
+++ b/Python/clinic/bltinmodule.c.h
@@ -151,7 +151,7 @@
 
 PyDoc_STRVAR(builtin_compile__doc__,
 "compile($module, /, source, filename, mode, flags=0,\n"
-"        dont_inherit=False, optimize=-1)\n"
+"        dont_inherit=False, optimize=-1, feature_version=-1)\n"
 "--\n"
 "\n"
 "Compile source into a code object that can be executed by exec() or eval().\n"
@@ -173,26 +173,27 @@
 static PyObject *
 builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
                      const char *mode, int flags, int dont_inherit,
-                     int optimize);
+                     int optimize, int feature_version);
 
 static PyObject *
 builtin_compile(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
 {
     PyObject *return_value = NULL;
-    static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", NULL};
-    static _PyArg_Parser _parser = {"OO&s|iii:compile", _keywords, 0};
+    static const char * const _keywords[] = {"source", "filename", "mode", "flags", "dont_inherit", "optimize", "feature_version", NULL};
+    static _PyArg_Parser _parser = {"OO&s|iiii:compile", _keywords, 0};
     PyObject *source;
     PyObject *filename;
     const char *mode;
     int flags = 0;
     int dont_inherit = 0;
     int optimize = -1;
+    int feature_version = -1;
 
     if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
-        &source, PyUnicode_FSDecoder, &filename, &mode, &flags, &dont_inherit, &optimize)) {
+        &source, PyUnicode_FSDecoder, &filename, &mode, &flags, &dont_inherit, &optimize, &feature_version)) {
         goto exit;
     }
-    return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize);
+    return_value = builtin_compile_impl(module, source, filename, mode, flags, dont_inherit, optimize, feature_version);
 
 exit:
     return return_value;
@@ -754,4 +755,4 @@
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=54e5e33dcc2659e0 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=00b97a48ea49eaf2 input=a9049054013a1b77]*/
diff --git a/Python/compile.c b/Python/compile.c
index c262106..6978337 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -330,6 +330,7 @@
         goto finally;
     if (!flags) {
         local_flags.cf_flags = 0;
+        local_flags.cf_feature_version = PY_MINOR_VERSION;
         flags = &local_flags;
     }
     merged = c.c_future->ff_features | flags->cf_flags;
diff --git a/Python/graminit.c b/Python/graminit.c
index 6cb7bbc..24f6f6c 100644
--- a/Python/graminit.c
+++ b/Python/graminit.c
@@ -106,7 +106,7 @@
     {1, arcs_5_2},
 };
 static arc arcs_6_0[1] = {
-    {16, 1},
+    {38, 1},
 };
 static arc arcs_6_1[1] = {
     {56, 2},
@@ -120,7 +120,7 @@
     {1, arcs_6_2},
 };
 static arc arcs_7_0[1] = {
-    {21, 1},
+    {19, 1},
 };
 static arc arcs_7_1[1] = {
     {40, 2},
@@ -583,7 +583,7 @@
     {1, arcs_19_1},
 };
 static arc arcs_20_0[1] = {
-    {22, 1},
+    {20, 1},
 };
 static arc arcs_20_1[1] = {
     {98, 2},
@@ -597,7 +597,7 @@
     {1, arcs_20_2},
 };
 static arc arcs_21_0[1] = {
-    {31, 1},
+    {29, 1},
 };
 static arc arcs_21_1[1] = {
     {0, 1},
@@ -621,7 +621,7 @@
     {1, arcs_22_1},
 };
 static arc arcs_23_0[1] = {
-    {18, 1},
+    {16, 1},
 };
 static arc arcs_23_1[1] = {
     {0, 1},
@@ -631,7 +631,7 @@
     {1, arcs_23_1},
 };
 static arc arcs_24_0[1] = {
-    {20, 1},
+    {18, 1},
 };
 static arc arcs_24_1[1] = {
     {0, 1},
@@ -641,7 +641,7 @@
     {1, arcs_24_1},
 };
 static arc arcs_25_0[1] = {
-    {33, 1},
+    {31, 1},
 };
 static arc arcs_25_1[2] = {
     {80, 2},
@@ -666,14 +666,14 @@
     {1, arcs_26_1},
 };
 static arc arcs_27_0[1] = {
-    {32, 1},
+    {30, 1},
 };
 static arc arcs_27_1[2] = {
     {60, 2},
     {0, 1},
 };
 static arc arcs_27_2[2] = {
-    {24, 3},
+    {22, 3},
     {0, 2},
 };
 static arc arcs_27_3[1] = {
@@ -701,7 +701,7 @@
     {1, arcs_28_1},
 };
 static arc arcs_29_0[1] = {
-    {27, 1},
+    {25, 1},
 };
 static arc arcs_29_1[1] = {
     {106, 2},
@@ -715,7 +715,7 @@
     {1, arcs_29_2},
 };
 static arc arcs_30_0[1] = {
-    {24, 1},
+    {22, 1},
 };
 static arc arcs_30_1[3] = {
     {107, 2},
@@ -725,11 +725,11 @@
 static arc arcs_30_2[4] = {
     {107, 2},
     {9, 2},
-    {27, 4},
+    {25, 4},
     {49, 3},
 };
 static arc arcs_30_3[1] = {
-    {27, 4},
+    {25, 4},
 };
 static arc arcs_30_4[3] = {
     {5, 5},
@@ -832,7 +832,7 @@
     {2, arcs_35_1},
 };
 static arc arcs_36_0[1] = {
-    {25, 1},
+    {23, 1},
 };
 static arc arcs_36_1[1] = {
     {40, 2},
@@ -847,7 +847,7 @@
     {2, arcs_36_2},
 };
 static arc arcs_37_0[1] = {
-    {29, 1},
+    {27, 1},
 };
 static arc arcs_37_1[1] = {
     {40, 2},
@@ -903,7 +903,7 @@
     {1, arcs_39_1},
 };
 static arc arcs_40_0[1] = {
-    {16, 1},
+    {38, 1},
 };
 static arc arcs_40_1[3] = {
     {113, 2},
@@ -919,7 +919,7 @@
     {1, arcs_40_2},
 };
 static arc arcs_41_0[1] = {
-    {26, 1},
+    {24, 1},
 };
 static arc arcs_41_1[1] = {
     {118, 2},
@@ -955,7 +955,7 @@
     {1, arcs_41_7},
 };
 static arc arcs_42_0[1] = {
-    {35, 1},
+    {33, 1},
 };
 static arc arcs_42_1[1] = {
     {118, 2},
@@ -990,7 +990,7 @@
     {1, arcs_42_7},
 };
 static arc arcs_43_0[1] = {
-    {23, 1},
+    {21, 1},
 };
 static arc arcs_43_1[1] = {
     {98, 2},
@@ -1038,7 +1038,7 @@
     {1, arcs_43_10},
 };
 static arc arcs_44_0[1] = {
-    {34, 1},
+    {32, 1},
 };
 static arc arcs_44_1[1] = {
     {59, 2},
@@ -1097,7 +1097,7 @@
     {2, arcs_44_12},
 };
 static arc arcs_45_0[1] = {
-    {36, 1},
+    {34, 1},
 };
 static arc arcs_45_1[1] = {
     {125, 2},
@@ -1218,7 +1218,7 @@
     {0, 1},
 };
 static arc arcs_50_2[2] = {
-    {26, 3},
+    {24, 3},
     {0, 2},
 };
 static arc arcs_50_3[1] = {
@@ -1250,7 +1250,7 @@
     {1, arcs_51_1},
 };
 static arc arcs_52_0[1] = {
-    {28, 1},
+    {26, 1},
 };
 static arc arcs_52_1[2] = {
     {59, 2},
@@ -1273,7 +1273,7 @@
     {1, arcs_52_4},
 };
 static arc arcs_53_0[1] = {
-    {28, 1},
+    {26, 1},
 };
 static arc arcs_53_1[2] = {
     {59, 2},
@@ -1318,7 +1318,7 @@
     {2, arcs_55_1},
 };
 static arc arcs_56_0[2] = {
-    {30, 1},
+    {28, 1},
     {139, 2},
 };
 static arc arcs_56_1[1] = {
@@ -1353,13 +1353,13 @@
     {146, 1},
     {122, 1},
     {147, 2},
-    {30, 3},
+    {28, 3},
 };
 static arc arcs_58_1[1] = {
     {0, 1},
 };
 static arc arcs_58_2[2] = {
-    {30, 1},
+    {28, 1},
     {0, 2},
 };
 static arc arcs_58_3[1] = {
@@ -1460,7 +1460,7 @@
 static arc arcs_66_0[4] = {
     {7, 1},
     {8, 1},
-    {39, 1},
+    {37, 1},
     {162, 2},
 };
 static arc arcs_66_1[1] = {
@@ -1494,7 +1494,7 @@
     {1, arcs_67_3},
 };
 static arc arcs_68_0[2] = {
-    {17, 1},
+    {39, 1},
     {164, 2},
 };
 static arc arcs_68_1[1] = {
@@ -1516,7 +1516,7 @@
     {12, 2},
     {13, 2},
     {14, 3},
-    {38, 4},
+    {36, 4},
     {40, 2},
     {41, 2},
     {42, 5},
@@ -1788,7 +1788,7 @@
     {1, arcs_77_13},
 };
 static arc arcs_78_0[1] = {
-    {19, 1},
+    {17, 1},
 };
 static arc arcs_78_1[1] = {
     {40, 2},
@@ -1874,7 +1874,7 @@
     {1, arcs_81_1},
 };
 static arc arcs_82_0[1] = {
-    {23, 1},
+    {21, 1},
 };
 static arc arcs_82_1[1] = {
     {98, 2},
@@ -1901,7 +1901,7 @@
     {1, arcs_82_5},
 };
 static arc arcs_83_0[2] = {
-    {16, 1},
+    {38, 1},
     {177, 2},
 };
 static arc arcs_83_1[1] = {
@@ -1916,7 +1916,7 @@
     {1, arcs_83_2},
 };
 static arc arcs_84_0[1] = {
-    {26, 1},
+    {24, 1},
 };
 static arc arcs_84_1[1] = {
     {133, 2},
@@ -1945,7 +1945,7 @@
     {1, arcs_85_1},
 };
 static arc arcs_86_0[1] = {
-    {37, 1},
+    {35, 1},
 };
 static arc arcs_86_1[2] = {
     {179, 2},
@@ -1960,7 +1960,7 @@
     {1, arcs_86_2},
 };
 static arc arcs_87_0[2] = {
-    {24, 1},
+    {22, 1},
     {80, 2},
 };
 static arc arcs_87_1[1] = {
@@ -2115,7 +2115,7 @@
     {257, "file_input", 0, 2, states_1,
      "\344\377\377\377\377\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {258, "eval_input", 0, 3, states_2,
-     "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {259, "decorator", 0, 7, states_3,
      "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {260, "decorators", 0, 2, states_4,
@@ -2123,9 +2123,9 @@
     {261, "decorated", 0, 3, states_5,
      "\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {262, "async_funcdef", 0, 3, states_6,
-     "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {263, "funcdef", 0, 9, states_7,
-     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {264, "parameters", 0, 4, states_8,
      "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {265, "typedargslist", 0, 22, states_9,
@@ -2139,39 +2139,39 @@
     {269, "stmt", 0, 2, states_13,
      "\340\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {270, "simple_stmt", 0, 4, states_14,
-     "\340\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {271, "small_stmt", 0, 2, states_15,
-     "\340\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {272, "expr_stmt", 0, 6, states_16,
-     "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {273, "annassign", 0, 5, states_17,
      "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {274, "testlist_star_expr", 0, 3, states_18,
-     "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {275, "augassign", 0, 2, states_19,
      "\000\000\000\000\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000"},
     {276, "del_stmt", 0, 3, states_20,
-     "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
-    {277, "pass_stmt", 0, 2, states_21,
-     "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
-    {278, "flow_stmt", 0, 2, states_22,
-     "\000\000\024\000\043\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
-    {279, "break_stmt", 0, 2, states_23,
-     "\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
-    {280, "continue_stmt", 0, 2, states_24,
      "\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+    {277, "pass_stmt", 0, 2, states_21,
+     "\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+    {278, "flow_stmt", 0, 2, states_22,
+     "\000\000\005\300\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+    {279, "break_stmt", 0, 2, states_23,
+     "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+    {280, "continue_stmt", 0, 2, states_24,
+     "\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {281, "return_stmt", 0, 3, states_25,
-     "\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {282, "yield_stmt", 0, 2, states_26,
-     "\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {283, "raise_stmt", 0, 5, states_27,
-     "\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {284, "import_stmt", 0, 2, states_28,
-     "\000\000\000\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\100\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {285, "import_name", 0, 3, states_29,
-     "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {286, "import_from", 0, 8, states_30,
-     "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {287, "import_as_name", 0, 4, states_31,
      "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {288, "dotted_as_name", 0, 4, states_32,
@@ -2183,117 +2183,117 @@
     {291, "dotted_name", 0, 2, states_35,
      "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {292, "global_stmt", 0, 3, states_36,
-     "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {293, "nonlocal_stmt", 0, 3, states_37,
-     "\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {294, "assert_stmt", 0, 5, states_38,
      "\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {295, "compound_stmt", 0, 2, states_39,
-     "\000\004\251\004\034\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\004\052\001\107\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {296, "async_stmt", 0, 3, states_40,
-     "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {297, "if_stmt", 0, 8, states_41,
-     "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {298, "while_stmt", 0, 8, states_42,
-     "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {299, "for_stmt", 0, 11, states_43,
-     "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {300, "try_stmt", 0, 13, states_44,
-     "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {301, "with_stmt", 0, 6, states_45,
-     "\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {302, "with_item", 0, 4, states_46,
-     "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {303, "except_clause", 0, 5, states_47,
      "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"},
     {304, "suite", 0, 5, states_48,
-     "\344\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {305, "namedexpr_test", 0, 4, states_49,
-     "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {306, "test", 0, 6, states_50,
-     "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {307, "test_nocond", 0, 2, states_51,
-     "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {308, "lambdef", 0, 5, states_52,
-     "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {309, "lambdef_nocond", 0, 5, states_53,
-     "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {310, "or_test", 0, 2, states_54,
-     "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {311, "and_test", 0, 2, states_55,
-     "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {312, "not_test", 0, 3, states_56,
-     "\240\173\002\100\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\020\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {313, "comparison", 0, 2, states_57,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {314, "comp_op", 0, 4, states_58,
-     "\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"},
+     "\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\004\000\340\017\000\000\000\000"},
     {315, "star_expr", 0, 3, states_59,
      "\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {316, "expr", 0, 2, states_60,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {317, "xor_expr", 0, 2, states_61,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {318, "and_expr", 0, 2, states_62,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {319, "shift_expr", 0, 2, states_63,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {320, "arith_expr", 0, 2, states_64,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {321, "term", 0, 2, states_65,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {322, "factor", 0, 3, states_66,
-     "\240\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {323, "power", 0, 4, states_67,
-     "\040\172\002\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\040\172\000\000\220\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {324, "atom_expr", 0, 3, states_68,
-     "\040\172\002\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\040\172\000\000\220\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {325, "atom", 0, 9, states_69,
-     "\040\172\000\000\100\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\040\172\000\000\020\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {326, "testlist_comp", 0, 5, states_70,
-     "\340\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {327, "trailer", 0, 7, states_71,
      "\040\100\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"},
     {328, "subscriptlist", 0, 3, states_72,
-     "\240\173\002\120\300\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {329, "subscript", 0, 5, states_73,
-     "\240\173\002\120\300\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {330, "sliceop", 0, 3, states_74,
      "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {331, "exprlist", 0, 3, states_75,
-     "\340\173\002\000\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\000\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {332, "testlist", 0, 3, states_76,
-     "\240\173\002\120\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\240\173\000\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {333, "dictorsetmaker", 0, 14, states_77,
-     "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {334, "classdef", 0, 8, states_78,
-     "\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {335, "arglist", 0, 3, states_79,
-     "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {336, "argument", 0, 4, states_80,
-     "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {337, "comp_iter", 0, 2, states_81,
-     "\000\000\201\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\040\001\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {338, "sync_comp_for", 0, 6, states_82,
-     "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {339, "comp_for", 0, 3, states_83,
-     "\000\000\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\040\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {340, "comp_if", 0, 4, states_84,
-     "\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {341, "encoding_decl", 0, 2, states_85,
      "\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {342, "yield_expr", 0, 3, states_86,
-     "\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {343, "yield_arg", 0, 3, states_87,
-     "\340\173\002\121\300\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\100\024\260\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {344, "func_body_suite", 0, 7, states_88,
-     "\344\373\126\373\343\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\344\373\325\376\270\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {345, "func_type_input", 0, 3, states_89,
      "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {346, "func_type", 0, 6, states_90,
      "\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
     {347, "typelist", 0, 11, states_91,
-     "\340\173\002\120\300\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
+     "\340\173\000\024\260\007\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
 };
 static label labels[183] = {
     {0, "EMPTY"},
@@ -2312,8 +2312,6 @@
     {1, "True"},
     {9, 0},
     {1, "assert"},
-    {1, "async"},
-    {1, "await"},
     {1, "break"},
     {1, "class"},
     {1, "continue"},
@@ -2336,6 +2334,8 @@
     {1, "yield"},
     {25, 0},
     {31, 0},
+    {56, 0},
+    {55, 0},
     {1, 0},
     {2, 0},
     {3, 0},
@@ -2357,7 +2357,7 @@
     {51, 0},
     {11, 0},
     {306, 0},
-    {56, 0},
+    {58, 0},
     {344, 0},
     {265, 0},
     {35, 0},
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 906877a..199ea82 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -105,6 +105,7 @@
     if (flags == NULL) {
         flags = &local_flags;
         local_flags.cf_flags = 0;
+        local_flags.cf_feature_version = PY_MINOR_VERSION;
     }
     v = _PySys_GetObjectId(&PyId_ps1);
     if (v == NULL) {
@@ -1165,6 +1166,7 @@
         return NULL;
 
     flags.cf_flags = 0;
+    flags.cf_feature_version = PY_MINOR_VERSION;
     mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena);
     if (mod == NULL) {
         PyArena_Free(arena);
@@ -1198,12 +1200,15 @@
     PyCompilerFlags localflags;
     perrdetail err;
     int iflags = PARSER_FLAGS(flags);
+    if (flags && flags->cf_feature_version < 7)
+        iflags |= PyPARSE_ASYNC_HACKS;
 
     node *n = PyParser_ParseStringObject(s, filename,
                                          &_PyParser_Grammar, start, &err,
                                          &iflags);
     if (flags == NULL) {
         localflags.cf_flags = 0;
+        localflags.cf_feature_version = PY_MINOR_VERSION;
         flags = &localflags;
     }
     if (n) {
@@ -1249,6 +1254,7 @@
                                        start, ps1, ps2, &err, &iflags);
     if (flags == NULL) {
         localflags.cf_flags = 0;
+        localflags.cf_feature_version = PY_MINOR_VERSION;
         flags = &localflags;
     }
     if (n) {