Skip to content

Commit 28ce0a4

Browse files
simeonschaubKristofferC
authored andcommitted
fix #42220: macro hygiene with unary :: (#42221)
(cherry picked from commit 8db1d89)
1 parent 1a912b2 commit 28ce0a4

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

src/macroexpand.scm

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,9 @@
271271
(define (other x) (resolve-expansion-vars-with-new-env x env m parent-scope inarg))
272272
(case (car e)
273273
((where) `(where ,(recur (cadr e)) ,@(map other (cddr e))))
274-
((|::|) `(|::| ,(recur (cadr e)) ,(other (caddr e))))
274+
((|::|) (if (length= e 2)
275+
`(|::| ,(other (cadr e)))
276+
`(|::| ,(recur (cadr e)) ,(other (caddr e)))))
275277
((call) `(call ,(other (cadr e))
276278
,@(map (lambda (x)
277279
(resolve-expansion-vars-with-new-env x env m parent-scope #t))
@@ -397,13 +399,18 @@
397399
((not (length> e 2)) e)
398400
((and (pair? (cadr e))
399401
(eq? (caadr e) '|::|))
400-
`(kw (|::|
401-
,(if inarg
402-
(resolve-expansion-vars- (cadr (cadr e)) env m parent-scope inarg)
403-
;; in keyword arg A=B, don't transform "A"
404-
(unescape (cadr (cadr e))))
405-
,(resolve-expansion-vars- (caddr (cadr e)) env m parent-scope inarg))
406-
,(resolve-expansion-vars-with-new-env (caddr e) env m parent-scope inarg)))
402+
(let* ((type-decl (cadr e)) ;; [argname]::type
403+
(argname (and (length> type-decl 2) (cadr type-decl)))
404+
(type (if argname (caddr type-decl) (cadr type-decl))))
405+
`(kw (|::|
406+
,@(if argname
407+
(list (if inarg
408+
(resolve-expansion-vars- argname env m parent-scope inarg)
409+
;; in keyword arg A=B, don't transform "A"
410+
(unescape argname)))
411+
'())
412+
,(resolve-expansion-vars- type env m parent-scope inarg))
413+
,(resolve-expansion-vars-with-new-env (caddr e) env m parent-scope inarg))))
407414
(else
408415
`(kw ,(if inarg
409416
(resolve-expansion-vars- (cadr e) env m parent-scope inarg)

test/syntax.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2949,3 +2949,14 @@ end
29492949
@test x == 1
29502950
@test f() == (2, 3)
29512951
end
2952+
2953+
# issue 42220
2954+
macro m42220()
2955+
return quote
2956+
function foo(::Type{T}=Float64) where {T}
2957+
return Vector{T}(undef, 10)
2958+
end
2959+
end
2960+
end
2961+
@test @m42220()() isa Vector{Float64}
2962+
@test @m42220()(Bool) isa Vector{Bool}

0 commit comments

Comments
 (0)