Skip to content

Commit 85b9752

Browse files
JeffBezansonKristofferC
authored andcommitted
fix #41416, splatted default argument lost with keyword argument (#41427)
(cherry picked from commit ebc8f3c)
1 parent 4dd3346 commit 85b9752

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

src/ast.scm

+5-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@
306306
(bad-formal-argument v))
307307
(else
308308
(case (car v)
309-
((... kw)
309+
((...)
310310
(arg-name (cadr v)) ;; to check for errors
311311
(decl-var (cadr v)))
312312
((|::|)
@@ -317,6 +317,8 @@
317317
(if (nospecialize-meta? v #t)
318318
(arg-name (caddr v))
319319
(bad-formal-argument v)))
320+
((kw)
321+
(arg-name (cadr v)))
320322
(else (bad-formal-argument v))))))
321323

322324
(define (arg-type v)
@@ -336,6 +338,8 @@
336338
(if (nospecialize-meta? v #t)
337339
(arg-type (caddr v))
338340
(bad-formal-argument v)))
341+
((kw)
342+
(arg-type (cadr v)))
339343
(else (bad-formal-argument v))))))
340344

341345
;; convert a lambda list into a list of just symbols

src/julia-syntax.scm

+8-9
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,12 @@
433433
;; 1-element list of vararg argument, or empty if none
434434
(vararg (let* ((l (if (null? pargl) '() (last pargl)))
435435
;; handle vararg with default value
436-
(l (if (kwarg? l) (cadr l) l)))
437-
(if (or (vararg? l) (varargexpr? l))
436+
(l- (if (kwarg? l) (cadr l) l)))
437+
(if (or (vararg? l-) (varargexpr? l-))
438438
(list l) '())))
439+
;; expression to forward varargs to another call
440+
(splatted-vararg (if (null? vararg) '()
441+
(list `(... ,(arg-name (car vararg))))))
439442
;; positional args with vararg
440443
(pargl-all pargl)
441444
;; positional args without vararg
@@ -510,8 +513,7 @@
510513
,@(if ordered-defaults keynames vals)
511514
,@(if (null? restkw) '() `((call (top pairs) (call (core NamedTuple)))))
512515
,@(map arg-name pargl)
513-
,@(if (null? vararg) '()
514-
(list `(... ,(arg-name (car vararg)))))))))
516+
,@splatted-vararg))))
515517
(if ordered-defaults
516518
(scopenest keynames vals ret)
517519
ret))))
@@ -569,16 +571,13 @@
569571
,@(if (null? restkw)
570572
`((if (call (top isempty) ,rkw)
571573
(null)
572-
(call (top kwerr) ,kw ,@(map arg-name pargl)
573-
,@(if (null? vararg) '()
574-
(list `(... ,(arg-name (car vararg))))))))
574+
(call (top kwerr) ,kw ,@(map arg-name pargl) ,@splatted-vararg)))
575575
'())
576576
(return (call ,mangled ;; finally, call the core function
577577
,@keynames
578578
,@(if (null? restkw) '() (list rkw))
579579
,@(map arg-name pargl)
580-
,@(if (null? vararg) '()
581-
(list `(... ,(arg-name (car vararg)))))))))))
580+
,@splatted-vararg))))))
582581
;; return primary function
583582
,(if (not (symbol? name))
584583
'(null) name))))))

test/keywordargs.jl

+7
Original file line numberDiff line numberDiff line change
@@ -380,3 +380,10 @@ f40964(xs::Int...=1; k = 2) = (xs, k)
380380
@test f40964() === ((1,), 2)
381381
@test f40964(7, 8) === ((7,8), 2)
382382
@test f40964(7, 8, k=0) === ((7,8), 0)
383+
# issue #41416
384+
@test f40964(; k = 1) === ((1,), 1)
385+
f41416(a...="a"; b=true) = (b, a)
386+
@test f41416() === (true, ("a",))
387+
@test f41416(;b=false) === (false, ("a",))
388+
@test f41416(33) === (true, (33,))
389+
@test f41416(3; b=false) === (false, (3,))

0 commit comments

Comments
 (0)