Skip to content

Commit d69177f

Browse files
JeffBezansonjohanmon
authored andcommitted
fix JuliaLang#41416, splatted default argument lost with keyword argument (JuliaLang#41427)
1 parent 9c9d23e commit d69177f

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

src/ast.scm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@
319319
(bad-formal-argument v))
320320
(else
321321
(case (car v)
322-
((... kw)
322+
((...)
323323
(arg-name (cadr v)) ;; to check for errors
324324
(decl-var (cadr v)))
325325
((|::|)
@@ -330,6 +330,8 @@
330330
(if (nospecialize-meta? v #t)
331331
(arg-name (caddr v))
332332
(bad-formal-argument v)))
333+
((kw)
334+
(arg-name (cadr v)))
333335
(else (bad-formal-argument v))))))
334336

335337
(define (arg-type v)
@@ -349,6 +351,8 @@
349351
(if (nospecialize-meta? v #t)
350352
(arg-type (caddr v))
351353
(bad-formal-argument v)))
354+
((kw)
355+
(arg-type (cadr v)))
352356
(else (bad-formal-argument v))))))
353357

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

src/julia-syntax.scm

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,12 @@
442442
;; 1-element list of vararg argument, or empty if none
443443
(vararg (let* ((l (if (null? pargl) '() (last pargl)))
444444
;; handle vararg with default value
445-
(l (if (kwarg? l) (cadr l) l)))
446-
(if (or (vararg? l) (varargexpr? l))
445+
(l- (if (kwarg? l) (cadr l) l)))
446+
(if (or (vararg? l-) (varargexpr? l-))
447447
(list l) '())))
448+
;; expression to forward varargs to another call
449+
(splatted-vararg (if (null? vararg) '()
450+
(list `(... ,(arg-name (car vararg))))))
448451
;; positional args with vararg
449452
(pargl-all pargl)
450453
;; positional args without vararg
@@ -520,8 +523,7 @@
520523
,@(if ordered-defaults keynames vals)
521524
,@(if (null? restkw) '() `((call (top pairs) (call (core NamedTuple)))))
522525
,@(map arg-name pargl)
523-
,@(if (null? vararg) '()
524-
(list `(... ,(arg-name (car vararg)))))))))
526+
,@splatted-vararg))))
525527
(if ordered-defaults
526528
(scopenest keynames vals ret)
527529
ret))))
@@ -579,16 +581,13 @@
579581
,@(if (null? restkw)
580582
`((if (call (top isempty) ,rkw)
581583
(null)
582-
(call (top kwerr) ,kw ,@(map arg-name pargl)
583-
,@(if (null? vararg) '()
584-
(list `(... ,(arg-name (car vararg))))))))
584+
(call (top kwerr) ,kw ,@(map arg-name pargl) ,@splatted-vararg)))
585585
'())
586586
(return (call ,mangled ;; finally, call the core function
587587
,@keynames
588588
,@(if (null? restkw) '() (list rkw))
589589
,@(map arg-name pargl)
590-
,@(if (null? vararg) '()
591-
(list `(... ,(arg-name (car vararg)))))))))))
590+
,@splatted-vararg))))))
592591
;; return primary function
593592
,(if (not (symbol? name))
594593
'(null) name)))))

test/keywordargs.jl

Lines changed: 7 additions & 0 deletions
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)