diff --git a/Python/ast.c b/Python/ast.c
index 6a9658a..1124a8b 100644
--- a/Python/ast.c
+++ b/Python/ast.c
@@ -34,7 +34,7 @@
 /* Note different signature for ast_for_call */
 static expr_ty ast_for_call(struct compiling *, const node *, expr_ty);
 
-static PyObject *parsenumber(const char *);
+static PyObject *parsenumber(struct compiling *, const char *);
 static PyObject *parsestr(struct compiling *, const node *n, int *bytesmode);
 static PyObject *parsestrplus(struct compiling *, const node *n,
                               int *bytesmode);
@@ -379,7 +379,7 @@
 */
 
 static int
-set_context(expr_ty e, expr_context_ty ctx, const node *n)
+set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
 {
     asdl_seq *s = NULL;
     /* If a particular expression type can't be used for assign / delete,
@@ -405,7 +405,7 @@
             break;
         case Starred_kind:
             e->v.Starred.ctx = ctx;
-            if (!set_context(e->v.Starred.value, ctx, n))
+            if (!set_context(c, e->v.Starred.value, ctx, n))
                 return 0;
             break;
         case Name_kind:
@@ -489,7 +489,7 @@
         int i;
 
         for (i = 0; i < asdl_seq_LEN(s); i++) {
-            if (!set_context((expr_ty)asdl_seq_GET(s, i), ctx, n))
+            if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
                 return 0;
         }
     }
@@ -497,7 +497,7 @@
 }
 
 static operator_ty
-ast_for_augassign(const node *n)
+ast_for_augassign(struct compiling *c, const node *n)
 {
     REQ(n, augassign);
     n = CHILD(n, 0);
@@ -535,7 +535,7 @@
 }
 
 static cmpop_ty
-ast_for_comp_op(const node *n)
+ast_for_comp_op(struct compiling *c, const node *n)
 {
     /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
                |'is' 'not'
@@ -632,6 +632,12 @@
     }
 
     return arg(name, annotation, c->c_arena);
+#if 0
+    result = Tuple(args, Store, LINENO(n), n->n_col_offset, c->c_arena);
+    if (!set_context(c, result, Store, n))
+        return NULL;
+    return result;
+#endif
 }
 
 /* returns -1 if failed to handle keyword only arguments
@@ -1080,7 +1086,7 @@
 */
 
 static int
-count_comp_fors(const node *n)
+count_comp_fors(struct compiling *c, const node *n)
 {
     int n_fors = 0;
 
@@ -1117,7 +1123,7 @@
 */
 
 static int
-count_comp_ifs(const node *n)
+count_comp_ifs(struct compiling *c, const node *n)
 {
     int n_ifs = 0;
 
@@ -1140,7 +1146,7 @@
     int i, n_fors;
     asdl_seq *comps;
 
-    n_fors = count_comp_fors(n);
+    n_fors = count_comp_fors(c, n);
     if (n_fors == -1)
         return NULL;
 
@@ -1182,7 +1188,7 @@
             asdl_seq *ifs;
             
             n = CHILD(n, 4);
-            n_ifs = count_comp_ifs(n);
+            n_ifs = count_comp_ifs(c, n);
             if (n_ifs == -1)
                 return NULL;
 
@@ -1331,7 +1337,7 @@
             return Str(str, LINENO(n), n->n_col_offset, c->c_arena);
     }
     case NUMBER: {
-        PyObject *pynum = parsenumber(STR(ch));
+        PyObject *pynum = parsenumber(c, STR(ch));
         if (!pynum)
             return NULL;
 
@@ -1822,7 +1828,7 @@
                 for (i = 1; i < NCH(n); i += 2) {
                     cmpop_ty newoperator;
 
-                    newoperator = ast_for_comp_op(CHILD(n, i));
+                    newoperator = ast_for_comp_op(c, CHILD(n, i));
                     if (!newoperator) {
                         return NULL;
                     }
@@ -2084,7 +2090,8 @@
                           "assignment");
                 return NULL;
         }
-        set_context(expr1, Store, ch);
+        if(!set_context(c, expr1, Store, ch))
+            return NULL;
 
         ch = CHILD(n, 2);
         if (TYPE(ch) == testlist)
@@ -2094,7 +2101,7 @@
         if (!expr2)
             return NULL;
 
-        newoperator = ast_for_augassign(CHILD(n, 1));
+        newoperator = ast_for_augassign(c, CHILD(n, 1));
         if (!newoperator)
             return NULL;
 
@@ -2124,7 +2131,7 @@
             if (!e) 
               return NULL;
 
-            if (!set_context(e, Store, CHILD(n, i)))
+            if (!set_context(c, e, Store, CHILD(n, i)))
               return NULL;
 
             asdl_seq_SET(targets, i / 2, e);
@@ -2157,7 +2164,7 @@
         if (!e)
             return NULL;
         asdl_seq_SET(seq, i / 2, e);
-        if (context && !set_context(e, context, CHILD(n, i)))
+        if (context && !set_context(c, e, context, CHILD(n, i)))
             return NULL;
     }
     return seq;
@@ -2928,7 +2935,7 @@
         if (!optional_vars) {
             return NULL;
         }
-        if (!set_context(optional_vars, Store, n)) {
+        if (!set_context(c, optional_vars, Store, n)) {
             return NULL;
         }
         suite_index = 4;
@@ -3057,13 +3064,13 @@
 }
 
 static PyObject *
-parsenumber(const char *s)
+parsenumber(struct compiling *c, const char *s)
 {
     const char *end;
     long x;
     double dx;
 #ifndef WITHOUT_COMPLEX
-    Py_complex c;
+    Py_complex compl;
     int imflag;
 #endif
 
@@ -3090,11 +3097,11 @@
     /* XXX Huge floats may silently fail */
 #ifndef WITHOUT_COMPLEX
     if (imflag) {
-        c.real = 0.;
+        compl.real = 0.;
         PyFPE_START_PROTECT("atof", return 0)
-            c.imag = PyOS_ascii_atof(s);
+            compl.imag = PyOS_ascii_atof(s);
         PyFPE_END_PROTECT(c)
-            return PyComplex_FromCComplex(c);
+            return PyComplex_FromCComplex(compl);
     }
     else
 #endif
@@ -3107,7 +3114,7 @@
 }
 
 static PyObject *
-decode_utf8(const char **sPtr, const char *end, char* encoding)
+decode_utf8(struct compiling *c, const char **sPtr, const char *end, char* encoding)
 {
     PyObject *u, *v;
     char *s, *t;
@@ -3124,7 +3131,7 @@
 }
 
 static PyObject *
-decode_unicode(const char *s, size_t len, int rawmode, const char *encoding)
+decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, const char *encoding)
 {
     PyObject *v, *u;
     char *buf;
@@ -3156,7 +3163,7 @@
                 PyObject *w;
                 char *r;
                 Py_ssize_t rn, i;
-                w = decode_utf8(&s, end, "utf-16-be");
+                w = decode_utf8(c, &s, end, "utf-16-be");
                 if (w == NULL) {
                     Py_DECREF(u);
                     return NULL;
@@ -3232,7 +3239,7 @@
         }
     }
     if (!*bytesmode && !rawmode) {
-        return decode_unicode(s, len, rawmode, c->c_encoding);
+        return decode_unicode(c, s, len, rawmode, c->c_encoding);
     }
     if (*bytesmode) {
         /* Disallow non-ascii characters (but not escapes) */
