Skip to content

Commit b405562

Browse files
authored
fix macro expansion of (::typeof(x))() = ... (#43993)
1 parent 0cbacf2 commit b405562

File tree

2 files changed

+15
-11
lines changed

2 files changed

+15
-11
lines changed

src/macroexpand.scm

+11-11
Original file line numberDiff line numberDiff line change
@@ -271,9 +271,7 @@
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-
((|::|) (if (length= e 2)
275-
`(|::| ,(other (cadr e)))
276-
`(|::| ,(recur (cadr e)) ,(other (caddr e)))))
274+
((|::|) `(|::| ,(recur (cadr e)) ,(other (caddr e))))
277275
((call) `(call ,(other (cadr e))
278276
,@(map (lambda (x)
279277
(resolve-expansion-vars-with-new-env x env m parent-scope #t))
@@ -457,14 +455,16 @@
457455

458456
;; decl-var that also identifies f in f()=...
459457
(define (decl-var* e)
460-
(cond ((not (pair? e)) e)
461-
((eq? (car e) 'escape) '())
462-
((eq? (car e) 'call) (decl-var* (cadr e)))
463-
((eq? (car e) '=) (decl-var* (cadr e)))
464-
((eq? (car e) 'curly) (decl-var* (cadr e)))
465-
((eq? (car e) '|::|) (decl-var* (cadr e)))
466-
((eq? (car e) 'where) (decl-var* (cadr e)))
467-
(else (decl-var e))))
458+
(if (pair? e)
459+
(case (car e)
460+
((escape) '())
461+
((call) (decl-var* (cadr e)))
462+
((=) (decl-var* (cadr e)))
463+
((curly) (decl-var* (cadr e)))
464+
((|::|) (if (length= e 2) '() (decl-var* (cadr e))))
465+
((where) (decl-var* (cadr e)))
466+
(else (decl-var e)))
467+
e))
468468

469469
(define (decl-vars* e)
470470
(if (and (pair? e) (eq? (car e) 'tuple))

test/syntax.jl

+4
Original file line numberDiff line numberDiff line change
@@ -3140,3 +3140,7 @@ end
31403140

31413141
@test Meta.parseatom("@foo", 1; filename="foo", lineno=7) == (Expr(:macrocall, :var"@foo", LineNumberNode(7, :foo)), 5)
31423142
@test Meta.parseall("@foo"; filename="foo", lineno=3) == Expr(:toplevel, LineNumberNode(3, :foo), Expr(:macrocall, :var"@foo", LineNumberNode(3, :foo)))
3143+
3144+
let ex = :(const $(esc(:x)) = 1; (::typeof(2))() = $(esc(:x)))
3145+
@test macroexpand(Main, Expr(:var"hygienic-scope", ex, Main)).args[3].args[1] == :((::$(GlobalRef(Main, :typeof))(2))())
3146+
end

0 commit comments

Comments
 (0)