From 1e70fda69fcb4991eb60ed43e610f664ea1319e6 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Wed, 14 Jun 2017 18:18:01 +1000
Subject: [PATCH] py/compile: Raise SyntaxError if positional args are given
 after */**.

In CPython 3.4 this raises a SyntaxError.  In CPython 3.5+ having a
positional after * is allowed but uPy has the wrong semantics and passes
the arguments in the incorrect order.  To prevent incorrect use of a
function going unnoticed it is important to raise the SyntaxError in uPy,
until the behaviour is fixed to follow CPython 3.5+.
---
 py/compile.c                 | 4 ++++
 tests/basics/python34.py     | 2 ++
 tests/basics/python34.py.exp | 2 ++
 3 files changed, 8 insertions(+)

diff --git a/py/compile.c b/py/compile.c
index 3b6a264d6..86ec4d3a3 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -2308,6 +2308,10 @@ STATIC void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_t pn_ar
             }
         } else {
             normal_argument:
+            if (star_flags) {
+                compile_syntax_error(comp, args[i], "non-keyword arg after */**");
+                return;
+            }
             if (n_keyword > 0) {
                 compile_syntax_error(comp, args[i], "non-keyword arg after keyword arg");
                 return;
diff --git a/tests/basics/python34.py b/tests/basics/python34.py
index a23f347d6..d5cc59ad6 100644
--- a/tests/basics/python34.py
+++ b/tests/basics/python34.py
@@ -20,6 +20,8 @@ def test_syntax(code):
         print("SyntaxError")
 test_syntax("f(*a, *b)") # can't have multiple * (in 3.5 we can)
 test_syntax("f(**a, **b)") # can't have multiple ** (in 3.5 we can)
+test_syntax("f(*a, b)") # can't have positional after *
+test_syntax("f(**a, b)") # can't have positional after **
 test_syntax("() = []") # can't assign to empty tuple (in 3.6 we can)
 test_syntax("del ()") # can't delete empty tuple (in 3.6 we can)
 
diff --git a/tests/basics/python34.py.exp b/tests/basics/python34.py.exp
index f497df3b8..590fc364f 100644
--- a/tests/basics/python34.py.exp
+++ b/tests/basics/python34.py.exp
@@ -7,5 +7,7 @@ SyntaxError
 SyntaxError
 SyntaxError
 SyntaxError
+SyntaxError
+SyntaxError
 3.4
 3 4
-- 
GitLab