From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Newsgroups: gmane.emacs.bugs Subject: bug#51982: Erroneous handling of local variables in byte-compiled nested lambdas Date: Mon, 22 Nov 2021 18:35:18 +0100 Message-ID: References: <87y25jo2q1.fsf@web.de> <29C3A3F8-CD9F-4AF2-A731-3304FC30E380@acm.org> <87wnl23pnd.fsf@web.de> <59A729EF-C4D4-47EB-9ADC-19FE8EBE7F10@acm.org> <877dd0bi17.fsf@web.de> Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.21\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_6202F8C8-FAA9-429A-9E5E-24A6D73097EA" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="35237"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Paul Pogonyshev , 51982@debbugs.gnu.org, Stefan Monnier To: Michael Heerdegen Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Nov 22 18:36:32 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mpDF1-0008uc-7y for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 22 Nov 2021 18:36:31 +0100 Original-Received: from localhost ([::1]:59030 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mpDEz-0004Vw-2y for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 22 Nov 2021 12:36:29 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:38398) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mpDEg-0004Uk-1G for bug-gnu-emacs@gnu.org; Mon, 22 Nov 2021 12:36:11 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:37456) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mpDEZ-00087m-By for bug-gnu-emacs@gnu.org; Mon, 22 Nov 2021 12:36:09 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mpDEZ-000754-6k for bug-gnu-emacs@gnu.org; Mon, 22 Nov 2021 12:36:03 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 22 Nov 2021 17:36:03 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 51982 X-GNU-PR-Package: emacs Original-Received: via spool by 51982-submit@debbugs.gnu.org id=B51982.163760254027151 (code B ref 51982); Mon, 22 Nov 2021 17:36:03 +0000 Original-Received: (at 51982) by debbugs.gnu.org; 22 Nov 2021 17:35:40 +0000 Original-Received: from localhost ([127.0.0.1]:48998 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mpDEB-00073o-41 for submit@debbugs.gnu.org; Mon, 22 Nov 2021 12:35:39 -0500 Original-Received: from mail1454c50.megamailservers.eu ([91.136.14.54]:53358 helo=mail266c50.megamailservers.eu) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mpDE4-00073P-Dd for 51982@debbugs.gnu.org; Mon, 22 Nov 2021 12:35:37 -0500 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1637602525; bh=BJK0aWQ8BvaejY4gEf7WHVpdlzhTD/FnaTzAXOrpFmA=; h=From:Subject:Date:In-Reply-To:Cc:To:References:From; b=lEiFPKOqdkYZEE5oJr3qopYesr8b+cAo1CC3rH0J8wGF6t4NMUdmUAt7Ey+aNQUGB QwepPz7V2oq3VzzgZGxfWLGVRWJlFc0IGf97hB1tlmz3FLhapQ4sXTTujEi8tJygiS K59C6G+KNfJGiHSiOHOq06cPZjiDO4kIChS2yup0= Feedback-ID: mattiase@acm.or Original-Received: from stanniol.lan (c-b952e353.032-75-73746f71.bbcust.telenor.se [83.227.82.185]) (authenticated bits=0) by mail266c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id 1AMHZIuf013513; Mon, 22 Nov 2021 17:35:20 +0000 In-Reply-To: X-Mailer: Apple Mail (2.3445.104.21) X-CTCH-RefID: str=0001.0A742F18.619BD4DD.0026, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown X-CTCH-Score: 0.000 X-CTCH-Flags: 0 X-CTCH-ScoreCust: 0.000 X-CSC: 0 X-CHA: v=2.4 cv=E5KuGYRl c=1 sm=1 tr=0 ts=619bd4dd a=von4qPfY+hyqc0zmWf0tYQ==:117 a=von4qPfY+hyqc0zmWf0tYQ==:17 a=M51BFTxLslgA:10 a=5hr3uwvhae-bEsuNmpYA:9 a=CjuIK1q_8ugA:10 a=Hj0ZHtO1rmNFOb7b9sgA:9 a=B2y7HmGcmWMA:10 a=5hiNXCo7YkXxgPKWgXEA:9 X-Origin-Country: SE X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:220627 Archived-At: --Apple-Mail=_6202F8C8-FAA9-429A-9E5E-24A6D73097EA Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii > I just found a case where it doesn't work. A repaired patch will = arrive soon (we hope). Not one but two patches for your enjoyment, representing two alternative = solutions. Patch A is an extension of the original proposal and is = simpler but perhaps less performant; patch B is messier but may result = in better code. To connect to the previous example, cconv transforms the function (defun f (x) (lambda () (let ((f (lambda () x))) (let ((x 'a)) (list x (funcall f)))))) with patch A into (defun f (x) (internal-make-closure nil (x) nil (let ((f (lambda (x) x))) (let ((x 'a) (closed-x (internal-get-closed-var 0))) (list x (funcall f closed-x)))))) and with patch B into (defun f (x) (internal-make-closure nil (x) nil (let ((f (lambda (x) x))) (let ((x 'a)) (list x (funcall f (internal-get-closed-var 0))))))) This looks like a wash but the optimiser isn't able to elide that = superfluous closed-x variable yet, and in Paul's original example the = captured variable is only used in one conditional branch which makes it = a loss to bind it up-front whereas it's very cheap to materialise at the = call site (a single constant-pushing byte op). On the other hand, patch B does abuse the cconv data structures a little = (but it works!). We'll see if Stefan can stomach it. (This reminds me: we should probably declare internal-get-closed-var as = pure and error-free, even though it's not even an actual function.) --Apple-Mail=_6202F8C8-FAA9-429A-9E5E-24A6D73097EA Content-Disposition: attachment; filename=bug51982-A.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="bug51982-A.patch" Content-Transfer-Encoding: quoted-printable =46rom=20e3b306c9748c8738ed9086fb81562031865dffda=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Mon,=2022=20Nov=202021=2016:56:38=20+0100=0A= Subject:=20[PATCH]=20Fix=20closure-conversion=20of=20shadowed=20captured=20= lambda-lifted=0A=20vars=0A=0A*=20lisp/emacs-lisp/cconv.el=20= (cconv-convert):=0ALambda=20lifted=20variables=20(ones=20passed=20= explicitly=20to=20lambda-lifted=0Afunctions)=20that=20are=20also=20= captured=20in=20an=20outer=20closure=20and=20shadowed=0Awere=20renamed=20= incorrectly.=20=20Fix=20that=20by=20providing=20the=20correct=0A= definiens=20for=20the=20closed-over=20variable=20(bug#51982).=0A=0A*=20= test/lisp/emacs-lisp/bytecomp-tests.el=20(bytecomp-tests--test-cases):=0A= *=20test/lisp/emacs-lisp/cconv-tests.el=20(cconv-tests--intern-all)=0A= (cconv-closure-convert-remap-var):=20Add=20tests.=0A---=0A=20= lisp/emacs-lisp/cconv.el=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= =2052=20+++++++--=0A=20test/lisp/emacs-lisp/bytecomp-tests.el=20|=20=20= 41=20+++++++=0A=20test/lisp/emacs-lisp/cconv-tests.el=20=20=20=20|=20152=20= +++++++++++++++++++++++++=0A=203=20files=20changed,=20234=20= insertions(+),=2011=20deletions(-)=0A=0Adiff=20--git=20= a/lisp/emacs-lisp/cconv.el=20b/lisp/emacs-lisp/cconv.el=0Aindex=20= 03e109f250..34663937cc=20100644=0A---=20a/lisp/emacs-lisp/cconv.el=0A+++=20= b/lisp/emacs-lisp/cconv.el=0A@@=20-428,10=20+428,26=20@@=20cconv-convert=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20One=20of=20= the=20lambda-lifted=20vars=20is=20shadowed,=20so=20add=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20a=20reference=20to=20the=20= outside=20binding=20and=20arrange=20to=20use=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20;;=20that=20reference.=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(let=20((closedsym=20(make-symbol=20= (format=20"closed-%s"=20var))))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(setq=20new-env=20(cconv--remap-llv=20new-env=20var=20= closedsym))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (setq=20new-extend=20(cons=20closedsym=20(remq=20var=20new-extend)))=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20= `(,closedsym=20,var)=20binders-new)))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(let*=20((mapping=20(cdr=20(assq=20var=20env)))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (var-def=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(pcase-exhaustive=20mapping=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (`(internal-get-closed-var=20.=20,_)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20The=20variable=20= is=20captured.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20mapping)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(`(car-safe=20= (internal-get-closed-var=20.=20,_))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20The=20variable=20is=20= mutably=20captured;=20skip=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20;;=20the=20indirection=20step=20= because=20the=20variable=20is=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20passed=20"by=20rerefence"=20= to=20the=20=CE=BB-lifted=20function.=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(cadr=20mapping))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20((or=20'()=20`(car-safe=20,(pred=20symbolp)))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20The=20= variable=20is=20not=20captured.=20=20Add=20a=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20reference=20= to=20the=20outside=20binding=20and=20arrange=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20to=20use=20= that=20reference.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20var))))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let=20((closedsym=20(make-symbol=20(format=20= "closed-%s"=20var))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(setq=20new-env=20(cconv--remap-llv=20new-env=20var=20= closedsym))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(setq=20new-extend=20(cons=20closedsym=20(remq=20var=20new-extend)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20= `(,closedsym=20,var-def)=20binders-new))))=0A=20=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20;;=20We=20push=20the=20element=20after=20= redefined=20free=20variables=20are=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20;;=20processed.=20=20This=20is=20important=20to=20avoid=20= the=20bug=20when=20free=0A@@=20-449,14=20+465,28=20@@=20cconv-convert=0A=20= =20=20=20=20=20=20=20=20=20;;=20before=20we=20know=20that=20the=20var=20= will=20be=20in=20`new-extend'=20(bug#24171).=0A=20=20=20=20=20=20=20=20=20= =20(dolist=20(binder=20binders-new)=0A=20=20=20=20=20=20=20=20=20=20=20=20= (when=20(memq=20(car-safe=20binder)=20new-extend)=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20;;=20One=20of=20the=20lambda-lifted=20vars=20is=20= shadowed,=20so=20add=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20a=20= reference=20to=20the=20outside=20binding=20and=20arrange=20to=20use=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20that=20reference.=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20;;=20One=20of=20the=20lambda-lifted=20vars=20= is=20shadowed.=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((var=20= (car-safe=20binder))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(closedsym=20(make-symbol=20(format=20"closed-%s"=20var))))=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20new-env=20= (cconv--remap-llv=20new-env=20var=20closedsym))=0A-=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(setq=20new-extend=20(cons=20closedsym=20(remq=20= var=20new-extend)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (push=20`(,closedsym=20,var)=20binders-new)))))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(mapping=20(cdr=20(assq=20var=20= env)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (var-def=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (pcase-exhaustive=20mapping=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(`(internal-get-closed-var=20.=20,_)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= The=20variable=20is=20captured.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20mapping)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(`(car-safe=20= (internal-get-closed-var=20.=20,_))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20The=20variable=20is=20mutably=20= captured;=20skip=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20;;=20the=20indirection=20step=20because=20the=20= variable=20is=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20;;=20passed=20"by=20rerefence"=20to=20the=20=CE=BB-lifted=20= function.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(cadr=20mapping))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20((or=20'()=20`(car-safe=20,(pred=20symbolp)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ;;=20The=20variable=20is=20not=20captured.=20=20Add=20a=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20reference=20= to=20the=20outside=20binding=20and=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20arrange=20to=20use=20that=20= reference.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20var))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20= ((closedsym=20(make-symbol=20(format=20"closed-%s"=20var))))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20new-env=20= (cconv--remap-llv=20new-env=20var=20closedsym))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(setq=20new-extend=20(cons=20closedsym=20= (remq=20var=20new-extend)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(push=20`(,closedsym=20,var-def)=20binders-new))))))=0A=20=0A=20= =20=20=20=20=20=20=20`(,letsym=20,(nreverse=20binders-new)=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20.=20,(mapcar=20(lambda=20= (form)=0Adiff=20--git=20a/test/lisp/emacs-lisp/bytecomp-tests.el=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0Aindex=20= dbc0aa3db4..c427cd7536=20100644=0A---=20= a/test/lisp/emacs-lisp/bytecomp-tests.el=0A+++=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0A@@=20-643,6=20+643,47=20@@=20= bytecomp-tests--test-cases=0A=20=0A=20=20=20=20=20(cond)=0A=20=20=20=20=20= (mapcar=20(lambda=20(x)=20(cond=20((=3D=20x=200))))=20'(0=201))=0A+=0A+=20= =20=20=20;;=20These=20expressions=20give=20different=20results=20in=20= lexbind=20and=20dynbind=20modes,=0A+=20=20=20=20;;=20but=20in=20each=20= the=20compiler=20and=20interpreter=20should=20agree!=0A+=20=20=20=20(let=20= ((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20= ((g=20(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(let=20((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(list=20x=20(funcall=20g))))))))=0A+=20=20=20=20=20=20= (funcall=20(funcall=20f=20'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20= (x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(lambda=20()=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((g=20(lambda=20()=20= x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20= ((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(list=20x=20(funcall=20g))))))))=0A+=20=20=20=20=20=20(funcall=20= (funcall=20f=20'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20(x)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(lambda=20()=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(let=20((g=20(lambda=20()=20x)))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'a))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20= (funcall=20g))))))))=0A+=20=20=20=20=20=20(funcall=20(funcall=20f=20= 'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(let=20((g=20(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(let*=20((x=20'a))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20= g))))))))=0A+=20=20=20=20=20=20(funcall=20(funcall=20f=20'b)))=0A+=20=20=20= =20(let=20((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(let=20((g=20(lambda=20()=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(h=20(lambda=20()=20(setq=20x=20x))))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'b))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20= g)=20(funcall=20h)))))))=0A+=20=20=20=20=20=20(funcall=20(funcall=20f=20= 'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((g=20(lambda=20()=20x))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(h=20(lambda=20()=20(setq=20= x=20x))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20= ((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (list=20x=20(funcall=20g)=20(funcall=20h)))))))=0A+=20=20=20=20=20=20= (funcall=20(funcall=20f=20'b)))=0A=20=20=20=20=20)=0A=20=20=20"List=20of=20= expressions=20for=20cross-testing=20interpreted=20and=20compiled=20= code.")=0A=20=0Adiff=20--git=20a/test/lisp/emacs-lisp/cconv-tests.el=20= b/test/lisp/emacs-lisp/cconv-tests.el=0Aindex=204290571735..0701892b8c=20= 100644=0A---=20a/test/lisp/emacs-lisp/cconv-tests.el=0A+++=20= b/test/lisp/emacs-lisp/cconv-tests.el=0A@@=20-205,5=20+205,157=20@@=20= cconv-convert-lambda-lifted=0A=20=20=20=20=20=20=20=20=20=20=20=20nil=20= 99)=0A=20=20=20=20=20=20=20=20=20=20=2042)))=0A=20=0A+(defun=20= cconv-tests--intern-all=20(x)=0A+=20=20"Intern=20all=20symbols=20in=20= X."=0A+=20=20(cond=20((symbolp=20x)=20(intern=20(symbol-name=20x)))=0A+=20= =20=20=20=20=20=20=20((consp=20x)=20(cons=20(cconv-tests--intern-all=20= (car=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(cconv-tests--intern-all=20(cdr=20x))))=0A+=20=20=20=20=20= =20=20=20;;=20Assume=20we=20don't=20need=20to=20deal=20with=20vectors=20= etc.=0A+=20=20=20=20=20=20=20=20(t=20x)))=0A+=0A+(ert-deftest=20= cconv-closure-convert-remap-var=20()=0A+=20=20;;=20Verify=20that=20we=20= correctly=20remap=20shadowed=20lambda-lifted=20variables.=0A+=0A+=20=20= ;;=20We=20intern=20all=20symbols=20for=20ease=20of=20comparison;=20this=20= works=20because=0A+=20=20;;=20the=20`cconv-closure-convert'=20result=20= should=20contain=20no=20pair=20of=0A+=20=20;;=20distinct=20symbols=20= having=20the=20same=20name.=0A+=0A+=20=20;;=20Sanity=20check:=20captured=20= variable,=20no=20lambda-lifting=20or=20shadowing:=0A+=20=20(should=20= (equal=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20'#'(lambda=20= (x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20#'(lambda=20()=20= x))))=0A+=20=20=20=20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(internal-make-closure=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20nil=20(x)=20nil=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(internal-get-closed-var=200)))))=0A= +=0A+=20=20;;=20Basic=20case:=0A+=20=20(should=20(equal=20= (cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(let=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f)))))))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((f=20= #'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let=20((x=20'b)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(closed-x=20= x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20f=20closed-x)))))))=0A+=20=20(should=20= (equal=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((f=20#'(lambda=20()=20= x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(let*=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20= f)))))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(let=20((f=20#'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((closed-x=20x)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20= closed-x)))))))=0A+=0A+=20=20;;=20With=20the=20lambda-lifted=20shadowed=20= variable=20also=20being=20captured:=0A+=20=20(should=20(equal=0A+=20=20=20= =20=20=20=20=20=20=20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20= =20=20=20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20#'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'a))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (list=20x=20(funcall=20f))))))))=0A+=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (internal-make-closure=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((f=20#'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((x=20'a)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(closed-x=20= (internal-get-closed-var=200)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20closed-x))))))))=0A+=20= =20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20= (cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= #'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((x=20'a))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (list=20x=20(funcall=20f))))))))=0A+=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (internal-make-closure=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((f=20#'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let*=20((closed-x=20(internal-get-closed-var=200))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(list=20x=20(funcall=20f=20closed-x))))))))=0A+=20=20;;=20With=20= lambda-lifted=20shadowed=20variable=20also=20being=20mutably=20captured:=0A= +=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20= (cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= #'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20= 'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20f))))))))=0A+=20=20=20=20=20=20=20=20=20= =20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(internal-make-closure=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((f=20#'(lambda=20(x)=20(car-safe=20x))))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setcar=20= (internal-get-closed-var=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(car-safe=20= (internal-get-closed-var=200)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let=20((x=20'a)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(closed-x=20= (internal-get-closed-var=200)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20= closed-x)))))))))=0A+=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20= =20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= #'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((x=20= 'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20f))))))))=0A+=20=20=20=20=20=20=20=20=20= =20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(internal-make-closure=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((f=20#'(lambda=20(x)=20(car-safe=20x))))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setcar=20= (internal-get-closed-var=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(car-safe=20= (internal-get-closed-var=200)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let*=20((closed-x=20(internal-get-closed-var=20= 0))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20closed-x)))))))))=0A= +=20=20;;=20Lambda-lifted=20variable=20that=20isn't=20actually=20= captured=20where=20it=20is=20shadowed:=0A+=20=20(should=20(equal=0A+=20=20= =20=20=20=20=20=20=20=20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20= =20=20=20=20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(let=20((g=20#'(lambda=20()=20x))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(h=20#'(lambda=20()=20(setq=20= x=20x))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20g)=20(funcall=20h)))))))=0A+=20=20=20=20= =20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let=20((g=20#'(lambda=20(x)=20(car-safe=20x)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (h=20#'(lambda=20(x)=20(setcar=20x=20(car-safe=20x)))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'b)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (closed-x=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20g=20closed-x)=20(funcall=20h=20= closed-x))))))))=0A+=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20= =20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((g=20#'(lambda=20()=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(h=20#'(lambda=20()=20(setq=20x=20= x))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let*=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(list=20x=20(funcall=20g)=20(funcall=20h)))))))=0A+=20=20=20= =20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(let=20((g=20#'(lambda=20(x)=20(car-safe=20= x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(h=20#'(lambda=20(x)=20(setcar=20x=20(car-safe=20x)))))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((closed-x=20= x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(list=20x=20(funcall=20g=20closed-x)=20(funcall=20h=20= closed-x))))))))=0A+=20=20)=0A+=0A=20(provide=20'cconv-tests)=0A=20;;;=20= cconv-tests.el=20ends=20here=0A--=20=0A2.21.1=20(Apple=20Git-122.3)=0A=0A= --Apple-Mail=_6202F8C8-FAA9-429A-9E5E-24A6D73097EA Content-Disposition: attachment; filename=bug51982-B.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="bug51982-B.patch" Content-Transfer-Encoding: quoted-printable =46rom=203bcad5e4c21f94cc91a397685848f1887ac21207=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Mon,=2022=20Nov=202021=2016:56:38=20+0100=0A= Subject:=20[PATCH]=20Fix=20closure-conversion=20of=20shadowed=20captured=20= lambda-lifted=0A=20vars=0A=0A*=20lisp/emacs-lisp/cconv.el=20= (cconv-convert):=0ALambda=20lifted=20variables=20(ones=20passed=20= explicitly=20to=20lambda-lifted=0Afunctions)=20that=20are=20also=20= captured=20in=20an=20outer=20closure=20and=20shadowed=0Awere=20renamed=20= incorrectly.=20=20Fix=20that=20by=20dropping=20the=20renaming=0Asince=20= it's=20not=20needed=20for=20captured=20variables=20(bug#51982).=0A=0A*=20= test/lisp/emacs-lisp/bytecomp-tests.el=20(bytecomp-tests--test-cases):=0A= *=20test/lisp/emacs-lisp/cconv-tests.el=20(cconv-tests--intern-all)=0A= (cconv-closure-convert-remap-var):=20Add=20tests.=0A---=0A=20= lisp/emacs-lisp/cconv.el=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= =2054=20+++++++--=0A=20test/lisp/emacs-lisp/bytecomp-tests.el=20|=20=20= 41=20+++++++=0A=20test/lisp/emacs-lisp/cconv-tests.el=20=20=20=20|=20148=20= +++++++++++++++++++++++++=0A=203=20files=20changed,=20232=20= insertions(+),=2011=20deletions(-)=0A=0Adiff=20--git=20= a/lisp/emacs-lisp/cconv.el=20b/lisp/emacs-lisp/cconv.el=0Aindex=20= 03e109f250..8989bd412f=20100644=0A---=20a/lisp/emacs-lisp/cconv.el=0A+++=20= b/lisp/emacs-lisp/cconv.el=0A@@=20-428,10=20+428,27=20@@=20cconv-convert=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20One=20of=20= the=20lambda-lifted=20vars=20is=20shadowed,=20so=20add=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20a=20reference=20to=20the=20= outside=20binding=20and=20arrange=20to=20use=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20;;=20that=20reference.=0A-=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(let=20((closedsym=20(make-symbol=20= (format=20"closed-%s"=20var))))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(setq=20new-env=20(cconv--remap-llv=20new-env=20var=20= closedsym))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (setq=20new-extend=20(cons=20closedsym=20(remq=20var=20new-extend)))=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20= `(,closedsym=20,var)=20binders-new)))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(let*=20((mapping=20(cdr=20(assq=20var=20env)))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (remap-to=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(pcase-exhaustive=20mapping=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (`(internal-get-closed-var=20.=20,_)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20The=20variable=20= is=20captured;=20remap.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20mapping)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(`(car-safe=20= (internal-get-closed-var=20.=20,_))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20The=20variable=20is=20= mutably=20captured;=20remap,=20but=20skip=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20the=20= indirection=20step=20because=20the=20variable=20is=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= passed=20"by=20rerefence"=20to=20the=20=CE=BB-lifted=20function.=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(cadr=20mapping))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20((or=20'()=20`(car-safe=20,(pred=20= symbolp)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20;;=20The=20variable=20is=20not=20captured.=20=20= Add=20a=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20;;=20reference=20to=20the=20outside=20binding=20and=20= arrange=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20;;=20to=20use=20that=20reference.=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((closedsym=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(make-symbol=20= (format=20"closed-%s"=20var))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20`(,closedsym=20= ,var)=20binders-new)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20closedsym)))))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20new-env=20= (cconv--remap-llv=20new-env=20var=20remap-to))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(setq=20new-extend=20(cons=20remap-to=20= (remq=20var=20new-extend)))))=0A=20=0A=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20;;=20We=20push=20the=20element=20after=20redefined=20free=20= variables=20are=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= processed.=20=20This=20is=20important=20to=20avoid=20the=20bug=20when=20= free=0A@@=20-449,14=20+466,29=20@@=20cconv-convert=0A=20=20=20=20=20=20=20= =20=20=20;;=20before=20we=20know=20that=20the=20var=20will=20be=20in=20= `new-extend'=20(bug#24171).=0A=20=20=20=20=20=20=20=20=20=20(dolist=20= (binder=20binders-new)=0A=20=20=20=20=20=20=20=20=20=20=20=20(when=20= (memq=20(car-safe=20binder)=20new-extend)=0A-=20=20=20=20=20=20=20=20=20=20= =20=20=20;;=20One=20of=20the=20lambda-lifted=20vars=20is=20shadowed,=20= so=20add=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20a=20reference=20= to=20the=20outside=20binding=20and=20arrange=20to=20use=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20;;=20that=20reference.=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20;;=20One=20of=20the=20lambda-lifted=20vars=20is=20= shadowed.=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((var=20= (car-safe=20binder))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(closedsym=20(make-symbol=20(format=20"closed-%s"=20var))))=0A-=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20new-env=20= (cconv--remap-llv=20new-env=20var=20closedsym))=0A-=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(setq=20new-extend=20(cons=20closedsym=20(remq=20= var=20new-extend)))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (push=20`(,closedsym=20,var)=20binders-new)))))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(mapping=20(cdr=20(assq=20var=20= env)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (remap-to=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(pcase-exhaustive=20mapping=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(`(internal-get-closed-var=20.=20,_)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= The=20variable=20is=20captured;=20remap.=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20mapping)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(`(car-safe=20= (internal-get-closed-var=20.=20,_))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20;;=20The=20variable=20is=20mutably=20= captured;=20remap,=20but=20skip=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20;;=20the=20indirection=20step=20because=20= the=20variable=20is=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20;;=20passed=20"by=20rerefence"=20to=20the=20= =CE=BB-lifted=20function.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(cadr=20mapping))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20((or=20'()=20`(car-safe=20= ,(pred=20symbolp)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20;;=20The=20variable=20is=20not=20captured.=20=20Add=20= a=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20;;=20reference=20to=20the=20outside=20binding=20and=20arrange=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20= to=20use=20that=20reference.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(let=20((closedsym=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (make-symbol=20(format=20"closed-%s"=20var))))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20= `(,closedsym=20,var)=20binders-new)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20closedsym)))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(setq=20new-env=20(cconv--remap-llv=20= new-env=20var=20remap-to))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (setq=20new-extend=20(cons=20remap-to=20(remq=20var=20new-extend)))))))=0A= =20=0A=20=20=20=20=20=20=20=20`(,letsym=20,(nreverse=20binders-new)=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20.=20,(mapcar=20= (lambda=20(form)=0Adiff=20--git=20= a/test/lisp/emacs-lisp/bytecomp-tests.el=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0Aindex=20= dbc0aa3db4..c427cd7536=20100644=0A---=20= a/test/lisp/emacs-lisp/bytecomp-tests.el=0A+++=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0A@@=20-643,6=20+643,47=20@@=20= bytecomp-tests--test-cases=0A=20=0A=20=20=20=20=20(cond)=0A=20=20=20=20=20= (mapcar=20(lambda=20(x)=20(cond=20((=3D=20x=200))))=20'(0=201))=0A+=0A+=20= =20=20=20;;=20These=20expressions=20give=20different=20results=20in=20= lexbind=20and=20dynbind=20modes,=0A+=20=20=20=20;;=20but=20in=20each=20= the=20compiler=20and=20interpreter=20should=20agree!=0A+=20=20=20=20(let=20= ((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20= ((g=20(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(let=20((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(list=20x=20(funcall=20g))))))))=0A+=20=20=20=20=20=20= (funcall=20(funcall=20f=20'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20= (x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(lambda=20()=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((g=20(lambda=20()=20= x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20= ((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(list=20x=20(funcall=20g))))))))=0A+=20=20=20=20=20=20(funcall=20= (funcall=20f=20'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20(x)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(lambda=20()=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(let=20((g=20(lambda=20()=20x)))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'a))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20= (funcall=20g))))))))=0A+=20=20=20=20=20=20(funcall=20(funcall=20f=20= 'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(let=20((g=20(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(let*=20((x=20'a))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20= g))))))))=0A+=20=20=20=20=20=20(funcall=20(funcall=20f=20'b)))=0A+=20=20=20= =20(let=20((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(let=20((g=20(lambda=20()=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(h=20(lambda=20()=20(setq=20x=20x))))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'b))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20= g)=20(funcall=20h)))))))=0A+=20=20=20=20=20=20(funcall=20(funcall=20f=20= 'b)))=0A+=20=20=20=20(let=20((f=20(lambda=20(x)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((g=20(lambda=20()=20x))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(h=20(lambda=20()=20(setq=20= x=20x))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20= ((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (list=20x=20(funcall=20g)=20(funcall=20h)))))))=0A+=20=20=20=20=20=20= (funcall=20(funcall=20f=20'b)))=0A=20=20=20=20=20)=0A=20=20=20"List=20of=20= expressions=20for=20cross-testing=20interpreted=20and=20compiled=20= code.")=0A=20=0Adiff=20--git=20a/test/lisp/emacs-lisp/cconv-tests.el=20= b/test/lisp/emacs-lisp/cconv-tests.el=0Aindex=204290571735..3bd34e08d3=20= 100644=0A---=20a/test/lisp/emacs-lisp/cconv-tests.el=0A+++=20= b/test/lisp/emacs-lisp/cconv-tests.el=0A@@=20-205,5=20+205,153=20@@=20= cconv-convert-lambda-lifted=0A=20=20=20=20=20=20=20=20=20=20=20=20nil=20= 99)=0A=20=20=20=20=20=20=20=20=20=20=2042)))=0A=20=0A+(defun=20= cconv-tests--intern-all=20(x)=0A+=20=20"Intern=20all=20symbols=20in=20= X."=0A+=20=20(cond=20((symbolp=20x)=20(intern=20(symbol-name=20x)))=0A+=20= =20=20=20=20=20=20=20((consp=20x)=20(cons=20(cconv-tests--intern-all=20= (car=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(cconv-tests--intern-all=20(cdr=20x))))=0A+=20=20=20=20=20= =20=20=20;;=20Assume=20we=20don't=20need=20to=20deal=20with=20vectors=20= etc.=0A+=20=20=20=20=20=20=20=20(t=20x)))=0A+=0A+(ert-deftest=20= cconv-closure-convert-remap-var=20()=0A+=20=20;;=20Verify=20that=20we=20= correctly=20remap=20shadowed=20lambda-lifted=20variables.=0A+=0A+=20=20= ;;=20We=20intern=20all=20symbols=20for=20ease=20of=20comparison;=20this=20= works=20because=0A+=20=20;;=20the=20`cconv-closure-convert'=20result=20= should=20contain=20no=20pair=20of=0A+=20=20;;=20distinct=20symbols=20= having=20the=20same=20name.=0A+=0A+=20=20;;=20Sanity=20check:=20captured=20= variable,=20no=20lambda-lifting=20or=20shadowing:=0A+=20=20(should=20= (equal=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20'#'(lambda=20= (x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20#'(lambda=20()=20= x))))=0A+=20=20=20=20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(internal-make-closure=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20nil=20(x)=20nil=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(internal-get-closed-var=200)))))=0A= +=0A+=20=20;;=20Basic=20case:=0A+=20=20(should=20(equal=20= (cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(let=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f)))))))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((f=20= #'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let=20((x=20'b)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(closed-x=20= x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20f=20closed-x)))))))=0A+=20=20(should=20= (equal=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((f=20#'(lambda=20()=20= x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(let*=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20= f)))))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(let=20((f=20#'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((closed-x=20x)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20= closed-x)))))))=0A+=0A+=20=20;;=20With=20the=20lambda-lifted=20shadowed=20= variable=20also=20being=20captured:=0A+=20=20(should=20(equal=0A+=20=20=20= =20=20=20=20=20=20=20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20= =20=20=20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20#'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'a))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (list=20x=20(funcall=20f))))))))=0A+=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (internal-make-closure=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((f=20#'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20= (internal-get-closed-var=200)))))))))=0A+=20=20(should=20(equal=0A+=20=20= =20=20=20=20=20=20=20=20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20= =20=20=20=20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20#'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((x=20'a))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(list=20x=20(funcall=20f))))))))=0A+=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (internal-make-closure=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((f=20#'(lambda=20(x)=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let*=20((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20= (internal-get-closed-var=200)))))))))=0A+=20=20;;=20With=20lambda-lifted=20= shadowed=20variable=20also=20being=20mutably=20captured:=0A+=20=20= (should=20(equal=0A+=20=20=20=20=20=20=20=20=20=20=20= (cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= #'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20= 'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20f))))))))=0A+=20=20=20=20=20=20=20=20=20= =20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(internal-make-closure=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(let=20((f=20#'(lambda=20(x)=20(car-safe=20x))))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setcar=20= (internal-get-closed-var=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(car-safe=20= (internal-get-closed-var=200)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let=20((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f=20= (internal-get-closed-var=200))))))))))=0A+=20=20(should=20(equal=0A+=20=20= =20=20=20=20=20=20=20=20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20= =20=20=20=20=20=20(cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20#'(lambda=20()=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(let=20((f=20#'(lambda=20()=20x)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20x=20x)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let*=20((x=20'a))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(list=20x=20(funcall=20f))))))))=0A+=20=20=20=20= =20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(internal-make-closure=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20nil=20(x)=20nil=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(let=20((f=20#'(lambda=20(x)=20= (car-safe=20x))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(setcar=20(internal-get-closed-var=200)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (car-safe=20(internal-get-closed-var=200)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(let*=20((x=20'a))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20x=20= (funcall=20f=20(internal-get-closed-var=200))))))))))=0A+=20=20;;=20= Lambda-lifted=20variable=20that=20isn't=20actually=20captured=20where=20= it=20is=20shadowed:=0A+=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20= =20=20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((g=20#'(lambda=20()=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(h=20#'(lambda=20()=20(setq=20x=20= x))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20g)=20(funcall=20h)))))))=0A+=20=20=20=20= =20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(let=20((g=20#'(lambda=20(x)=20(car-safe=20x)))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (h=20#'(lambda=20(x)=20(setcar=20x=20(car-safe=20x)))))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let=20((x=20'b)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (closed-x=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(list=20x=20(funcall=20g=20closed-x)=20(funcall=20h=20= closed-x))))))))=0A+=20=20(should=20(equal=0A+=20=20=20=20=20=20=20=20=20= =20=20(cconv-tests--intern-all=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (cconv-closure-convert=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= '#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let=20((g=20#'(lambda=20()=20x))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(h=20#'(lambda=20()=20(setq=20x=20= x))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (let*=20((x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(list=20x=20(funcall=20g)=20(funcall=20h)))))))=0A+=20=20=20= =20=20=20=20=20=20=20=20'#'(lambda=20(x)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(let=20((x=20(list=20x)))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(let=20((g=20#'(lambda=20(x)=20(car-safe=20= x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(h=20#'(lambda=20(x)=20(setcar=20x=20(car-safe=20x)))))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((closed-x=20= x)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(x=20'b))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(list=20x=20(funcall=20g=20closed-x)=20(funcall=20h=20= closed-x))))))))=0A+=20=20)=0A+=0A=20(provide=20'cconv-tests)=0A=20;;;=20= cconv-tests.el=20ends=20here=0A--=20=0A2.21.1=20(Apple=20Git-122.3)=0A=0A= --Apple-Mail=_6202F8C8-FAA9-429A-9E5E-24A6D73097EA--