complain about "global __class__" in a class body (closes #17983)
This commit is contained in:
parent
c032f16d18
commit
1e93b06007
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue