Skip to content

Commit ddb1e1e

Browse files
authored
Merge pull request #20525 from JuliaLang/jb/fix20524
fix #20524, macros not handling nested tuple destructuring
2 parents c027cf4 + 27f3846 commit ddb1e1e

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

src/ast.scm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@
187187
(define (ssavalue? e)
188188
(and (pair? e) (eq? (car e) 'ssavalue)))
189189

190+
(define (globalref? e)
191+
(and (pair? e) (eq? (car e) 'globalref)))
192+
190193
(define (symbol-like? e)
191194
(or (and (symbol? e) (not (eq? e 'true)) (not (eq? e 'false)))
192195
(ssavalue? e)))

src/julia-syntax.scm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2381,7 +2381,7 @@
23812381
((=)
23822382
(let ((v (decl-var (cadr e)))
23832383
(rest (find-assigned-vars (caddr e) env)))
2384-
(if (or (ssavalue? v) (memq v env))
2384+
(if (or (ssavalue? v) (memq v env) (globalref? v))
23852385
rest
23862386
(cons v rest))))
23872387
(else

src/macroexpand.scm

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,11 @@
310310
((eq? (car e) 'curly) (decl-var* (cadr e)))
311311
(else (decl-var e))))
312312

313+
(define (decl-vars* e)
314+
(if (and (pair? e) (eq? (car e) 'tuple))
315+
(apply append (map decl-vars* (cdr e)))
316+
(list (decl-var* e))))
317+
313318
(define (function-def? e)
314319
(and (pair? e) (or (eq? (car e) 'function) (eq? (car e) '->)
315320
(and (eq? (car e) '=) (length= e 3)
@@ -340,11 +345,7 @@
340345
(list fname)
341346
'())))
342347
((and (eq? (car e) '=) (not (function-def? e)))
343-
(append! (filter
344-
symbol?
345-
(if (and (pair? (cadr e)) (eq? (car (cadr e)) 'tuple))
346-
(map decl-var* (cdr (cadr e)))
347-
(list (decl-var* (cadr e)))))
348+
(append! (filter symbol? (decl-vars* (cadr e)))
348349
(find-assigned-vars-in-expansion (caddr e) #f)))
349350
(else
350351
(apply append! (map (lambda (x)

test/core.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,19 @@ let
17521752
@test f5876(Int) === Int
17531753
end
17541754

1755+
# issue #20524
1756+
macro m20524(ex)
1757+
quote
1758+
global f20524
1759+
function f20524()
1760+
$ex
1761+
end
1762+
end
1763+
end
1764+
@m20524 ((a,(b20524,c)) = (8,(1,5)); (a,b20524,c))
1765+
@test f20524() === (8,1,5)
1766+
@test !isdefined(:b20524) # should not assign to a global
1767+
17551768
# issue #6387
17561769
bitstype 64 Date6387{C}
17571770

0 commit comments

Comments
 (0)