diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index 8facfca3c3aca..d71c7aff58128 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -662,7 +662,10 @@ (vals (list-tail dfl n)) (absent (list-tail opt n)) ;; absent arguments (body - (if (any (lambda (defaultv) + (if (any vararg? (butlast vals)) + ;; Forbid splat in all but the final default value + (error "invalid \"...\" in non-final positional argument default value") + (if (any (lambda (defaultv) ;; does any default val expression... (contains (lambda (e) ;; contain "e" such that... @@ -681,7 +684,7 @@ ;; otherwise add all `(block ,@prologue - (call ,(arg-name (car req)) ,@(map arg-name (cdr passed)) ,@vals))))) + (call ,(arg-name (car req)) ,@(map arg-name (cdr passed)) ,@vals)))))) (method-def-expr- name sp passed body))) (iota (length opt))) ,(method-def-expr- name sparams overall-argl body rett)))) diff --git a/test/syntax.jl b/test/syntax.jl index 13dd3e5aca1d6..d43162fbd12c9 100644 --- a/test/syntax.jl +++ b/test/syntax.jl @@ -3508,6 +3508,26 @@ let x = 1 => 2 @test_throws "function Base.=> must be explicitly imported to be extended" @eval a => b = 2 end +# Splatting in non-final default value (Ref #50518) +for expr in (quote + function g1(a=(1,2)..., b...=3) + b + end +end,quote + function g2(a=(1,2)..., b=3, c=4) + (b, c) + end +end,quote + function g3(a=(1,2)..., b=3, c...=4) + (b, c) + end +end) + let exc = try eval(expr); catch exc; exc end + @test isa(exc, ErrorException) + @test startswith(exc.msg, "syntax: invalid \"...\" in non-final positional argument default value") + end +end + # Test that bad lowering does not segfault (ref #50518) @test_throws ErrorException("syntax: Attempted to use slot marked unused") @eval function funused50518(::Float64) $(Symbol("#unused#"))