<div dir="ltr"><div><div><div><div><div>Christian,<br><br></div>When I wrote this, my intention was like: cur & DEF_LOCAL is a "more serious" error, so that if both errors are made in the same statement:<br></div><div>def f():<br></div>    x: int = 5<br></div>    global x<br><br></div>"SyntaxError: global after assignment" will be reported. The same logic applies to nonlocal.<br><br>--<br></div>Ivan<br><div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 12 September 2016 at 11:37, Christian Heimes <span dir="ltr"><<a href="mailto:christian@python.org" target="_blank">christian@python.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 2016-09-09 18:53, guido.van.rossum wrote:<br>
> <a href="https://hg.python.org/cpython/rev/804b71d43c85" rel="noreferrer" target="_blank">https://hg.python.org/cpython/<wbr>rev/804b71d43c85</a><br>
> changeset:   103415:804b71d43c85<br>
> user:        Guido van Rossum <<a href="mailto:guido@dropbox.com">guido@dropbox.com</a>><br>
> date:        Fri Sep 09 09:36:26 2016 -0700<br>
> summary:<br>
>   Issue #27999: Make "global after use" a SyntaxError, and ditto for nonlocal.<br>
> Patch by Ivan Levkivskyi.<br>
><br>
> files:<br>
>   Doc/reference/simple_stmts.rst |    5 +-<br>
>   Lib/test/test_syntax.py        |   18 +++-<br>
>   Misc/NEWS                      |    3 +<br>
>   Python/symtable.c              |  104 +++++++-------------<br>
>   4 files changed, 59 insertions(+), 71 deletions(-)<br>
><br>
<br>
[...]<br>
<br>
> @@ -1337,31 +1313,23 @@<br>
>              long cur = symtable_lookup(st, name);<br>
>              if (cur < 0)<br>
>                  VISIT_QUIT(st, 0);<br>
> -            if (cur & DEF_ANNOT) {<br>
> -                PyErr_Format(PyExc_<wbr>SyntaxError,<br>
> -                             "annotated name '%U' can't be nonlocal",<br>
> -                             name);<br>
> +            if (cur & (DEF_LOCAL | USE | DEF_ANNOT)) {<br>
> +                char* msg;<br>
> +                if (cur & DEF_ANNOT) {<br>
> +                    msg = NONLOCAL_ANNOT;<br>
> +                }<br>
> +                if (cur & DEF_LOCAL) {<br>
> +                    msg = NONLOCAL_AFTER_ASSIGN;<br>
> +                }<br>
> +                else {<br>
> +                    msg = NONLOCAL_AFTER_USE;<br>
> +                }<br>
> +                PyErr_Format(PyExc_<wbr>SyntaxError, msg, name);<br>
<br>
Hi Guido,<br>
<br>
did you mean if / else if / else here? It's not completely clear if the<br>
code means to set msg a second time if both cur & DEF_ANNOT and cur &<br>
DEF_LOCAL are true.<br>
<br>
Christian<br>
______________________________<wbr>_________________<br>
Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-dev" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/levkivskyi%40gmail.com" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/options/python-dev/<wbr>levkivskyi%40gmail.com</a><br>
</blockquote></div><br></div>