From: Benjamin Peterson Date: Wed, 15 May 2013 21:17:25 +0000 (-0500) Subject: complain about "global __class__" in a class body (closes #17983) X-Git-Tag: v3.4.0a1~722^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1e93b060077db01ceca0cdbad00ff358fee6f104;p=thirdparty%2FPython%2Fcpython.git complain about "global __class__" in a class body (closes #17983) --- diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py index 41678b51e746..26ce0424f89b 100644 --- a/Lib/test/test_scope.py +++ b/Lib/test/test_scope.py @@ -743,6 +743,10 @@ class ScopeTests(unittest.TestCase): del tester self.assertIsNone(ref()) + def test__Class__Global(self): + s = "class X:\n global __class__\n def f(self): super()" + self.assertRaises(SyntaxError, exec, s) + def test_main(): run_unittest(ScopeTests) diff --git a/Misc/NEWS b/Misc/NEWS index c45a87b3cbf3..d6c151ff8f54 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 3.3.3 release candidate 1? Core and Builtins ----------------- +- Issue #17983: Raise a SyntaxError for a ``global __class__`` statement in a + class body. + - Issue #17927: Frame objects kept arguments alive if they had been copied into a cell, even if the cell was cleared. diff --git a/Python/symtable.c b/Python/symtable.c index 55898f99bf14..e686d9ebc336 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -1236,6 +1236,12 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s) asdl_seq *seq = s->v.Global.names; for (i = 0; i < asdl_seq_LEN(seq); i++) { identifier name = (identifier)asdl_seq_GET(seq, i); + if (st->st_cur->ste_type == ClassBlock && + !PyUnicode_CompareWithASCIIString(name, "__class__")) { + PyErr_SetString(PyExc_SyntaxError, "cannot make __class__ global"); + PyErr_SyntaxLocationEx(st->st_filename, s->lineno, s->col_offset); + return 0; + } long cur = symtable_lookup(st, name); if (cur < 0) VISIT_QUIT(st, 0);