[Python-checkins] Fix SystemError when nested function has annotation on positional-only argument (GH-17826)

Miss Islington (bot) webhook-mailer at python.org
Sat Jan 4 21:15:02 EST 2020


https://github.com/python/cpython/commit/859525590c7aad210ae5f2557140a52033c498cd
commit: 859525590c7aad210ae5f2557140a52033c498cd
branch: 3.8
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2020-01-04T18:14:58-08:00
summary:

Fix SystemError when nested function has annotation on positional-only argument (GH-17826)

(cherry picked from commit ec007cb43faf5f33d06efbc28152c7fdcb2edb9c)

Co-authored-by: Anthony Sottile <asottile at umich.edu>

files:
A Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst
M Lib/test/test_positional_only_arg.py
M Python/symtable.c

diff --git a/Lib/test/test_positional_only_arg.py b/Lib/test/test_positional_only_arg.py
index 59b0b8fb55621..63dee7ca434b2 100644
--- a/Lib/test/test_positional_only_arg.py
+++ b/Lib/test/test_positional_only_arg.py
@@ -15,6 +15,10 @@ def global_pos_only_and_normal(a, /, b):
 def global_pos_only_defaults(a=1, /, b=2):
     return a, b
 
+def global_inner_has_pos_only():
+    def f(x: int, /): ...
+    return f
+
 
 class PositionalOnlyTestCase(unittest.TestCase):
 
@@ -412,6 +416,9 @@ def method(self, /):
 
         self.assertEqual(C().method(), sentinel)
 
+    def test_annotations(self):
+        assert global_inner_has_pos_only().__annotations__ == {'x': int}
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst
new file mode 100644
index 0000000000000..9a3178f9c6218
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-01-04-17-25-34.bpo-39215.xiqiIz.rst	
@@ -0,0 +1,2 @@
+Fix ``SystemError`` when nested function has annotation on positional-only
+argument - by Anthony Sottile.
diff --git a/Python/symtable.c b/Python/symtable.c
index b8713588b9a91..30482d99b3ca9 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -1717,6 +1717,8 @@ static int
 symtable_visit_annotations(struct symtable *st, stmt_ty s,
                            arguments_ty a, expr_ty returns)
 {
+    if (a->posonlyargs && !symtable_visit_argannotations(st, a->posonlyargs))
+        return 0;
     if (a->args && !symtable_visit_argannotations(st, a->args))
         return 0;
     if (a->vararg && a->vararg->annotation)



More information about the Python-checkins mailing list