Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.6
Changeset: r95540:3f85fe07a914
Date: 2018-12-30 14:57 +0100
http://bitbucket.org/pypy/pypy/changeset/3f85fe07a914/
Log: Check conflict between 'global' and variable annotation. This fixes
the last failure in test_grammar.
diff --git a/pypy/interpreter/astcompiler/symtable.py
b/pypy/interpreter/astcompiler/symtable.py
--- a/pypy/interpreter/astcompiler/symtable.py
+++ b/pypy/interpreter/astcompiler/symtable.py
@@ -429,8 +429,17 @@
self.scope.contains_annotated = True
target = assign.target
if isinstance(target, ast.Name):
- # XXX Should check (and fail) for previous 'global' annotation.
name = target.id
+ old_role = self.scope.lookup_role(name)
+ if assign.simple:
+ if old_role & SYM_GLOBAL:
+ raise SyntaxError(
+ "annotated name '%s' can't be global" % name,
+ assign.lineno, assign.col_offset)
+ if old_role & SYM_NONLOCAL:
+ raise SyntaxError(
+ "annotated name '%s' can't be nonlocal" % name,
+ assign.lineno, assign.col_offset)
scope = SYM_BLANK
if assign.simple:
scope |= SYM_ANNOTATED
diff --git a/pypy/interpreter/astcompiler/test/test_symtable.py
b/pypy/interpreter/astcompiler/test/test_symtable.py
--- a/pypy/interpreter/astcompiler/test/test_symtable.py
+++ b/pypy/interpreter/astcompiler/test/test_symtable.py
@@ -494,6 +494,14 @@
assert exc_global.msg == "annotated name 'x' can't be global"
assert exc_global.lineno == 3
+ def test_annotation_global2(self):
+ src_global = ("def f():\n"
+ " global x\n"
+ " x: int\n")
+ exc_global = py.test.raises(SyntaxError, self.func_scope,
src_global).value
+ assert exc_global.msg == "annotated name 'x' can't be global"
+ assert exc_global.lineno == 3
+
def test_annotation_nonlocal(self):
src_nonlocal = ("def f():\n"
" x: int\n"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit