diff --git a/src/ast.scm b/src/ast.scm index 5cc97014e373e..a20f8f87f955c 100644 --- a/src/ast.scm +++ b/src/ast.scm @@ -449,7 +449,7 @@ (check-dotop (cadr e)))))) e) -(define (vararg? x) (and (pair? x) (eq? (car x) '...))) +(define (vararg? x) (and (pair? x) (eq? (car x) '...) (length= x 2))) (define (vararg-type-expr? x) (or (eq? x 'Vararg) (and (length> x 1) diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index b6dc7bb9c8a12..f17a1dcd4f989 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -2691,8 +2691,7 @@ (if (null? run) '() (list `(call (core tuple) ,.(reverse run)))) (let ((x (car a))) - (if (and (length= x 2) - (eq? (car x) '...)) + (if (vararg? x) (if (null? run) (list* (cadr x) (tuple-wrap (cdr a) '())) @@ -2814,7 +2813,10 @@ '.>>>= lower-update-op '|...| - (lambda (e) (error "\"...\" expression outside call")) + (lambda (e) + (if (not (length= e 2)) + (error "wrong number of expressions following \"...\"")) + (error "\"...\" expression outside call")) '$ (lambda (e) (error "\"$\" expression outside quote")) diff --git a/test/syntax.jl b/test/syntax.jl index 2230d01991691..a4122904947fd 100644 --- a/test/syntax.jl +++ b/test/syntax.jl @@ -345,6 +345,10 @@ end # issue #15828 @test Meta.lower(Main, Meta.parse("x...")) == Expr(:error, "\"...\" expression outside call") +# issue #57153 - malformed "..." expr +@test Meta.lower(@__MODULE__, :(identity($(Expr(:(...), 1, 2, 3))))) == + (Expr(:error, "wrong number of expressions following \"...\"")) + # issue #15830 @test Meta.lower(Main, Meta.parse("foo(y = (global x)) = y")) == Expr(:error, "misplaced \"global\" declaration")