Index: Python/ast.c =================================================================== --- Python/ast.c (revision 53285) +++ Python/ast.c (working copy) @@ -19,6 +19,7 @@ struct compiling { char *c_encoding; /* source encoding */ PyArena *c_arena; /* arena for allocating memeory */ + const char *c_filename; /* filename being compiled */ }; static asdl_seq *seq_for_testlist(struct compiling *, const node *); @@ -109,6 +110,21 @@ PyErr_Restore(type, value, tback); } +static int +ast_warn(const node *n, char *msg, const char *filename) +{ + if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename, + LINENO(n), NULL, NULL) < 0) { + if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) { + PyErr_SetString(PyExc_SyntaxError, msg); + PyErr_SyntaxLocation(filename, LINENO(n)); + } + return 0; + } + return 1; +} + + /* num_stmts() returns number of contained statements. Use this routine to determine how big a sequence is needed for @@ -196,6 +212,7 @@ c.c_encoding = NULL; } c.c_arena = arena; + c.c_filename = filename; k = 0; switch (TYPE(n)) { @@ -1307,6 +1324,9 @@ return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena); } case BACKQUOTE: { /* repr */ + if (!ast_warn(n, "use repr() rather than ``", c->c_filename)) { + return NULL; + } expr_ty expression = ast_for_testlist(c, CHILD(n, 1)); if (!expression) return NULL;