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#55905: warn about misplaced or duplicated doc strings, `declare` or `interactive` forms Date: Sat, 11 Jun 2022 14:07:03 +0200 Message-ID: <7541DAE8-38BD-4CF6-A652-744E31C42442@acm.org> Mime-Version: 1.0 (Mac OS X Mail 14.0 \(3654.120.0.1.13\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_FCB02B89-EC3B-403F-99E8-F6FB490350E1" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="40698"; mail-complaints-to="usenet@ciao.gmane.io" To: 55905@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Jun 11 14:08:22 2022 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 1nzzug-000AQZ-CZ for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 11 Jun 2022 14:08:22 +0200 Original-Received: from localhost ([::1]:42272 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nzzue-0007X6-VL for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 11 Jun 2022 08:08:20 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:56038) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nzzuN-0007UM-Iy for bug-gnu-emacs@gnu.org; Sat, 11 Jun 2022 08:08:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:58146) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nzzuL-0004E7-Vb for bug-gnu-emacs@gnu.org; Sat, 11 Jun 2022 08:08:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nzzuL-0005zn-OE for bug-gnu-emacs@gnu.org; Sat, 11 Jun 2022 08:08:01 -0400 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: Sat, 11 Jun 2022 12:08:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 55905 X-GNU-PR-Package: emacs X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.165494925523011 (code B ref -1); Sat, 11 Jun 2022 12:08:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 11 Jun 2022 12:07:35 +0000 Original-Received: from localhost ([127.0.0.1]:52043 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nzztv-0005z4-0X for submit@debbugs.gnu.org; Sat, 11 Jun 2022 08:07:35 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:49696) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nzztq-0005yt-W4 for submit@debbugs.gnu.org; Sat, 11 Jun 2022 08:07:34 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:55882) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nzztq-0007IU-RQ for bug-gnu-emacs@gnu.org; Sat, 11 Jun 2022 08:07:30 -0400 Original-Received: from mail175c50.megamailservers.eu ([91.136.10.185]:55260 helo=mail50c50.megamailservers.eu) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nzzto-0004BO-E3 for bug-gnu-emacs@gnu.org; Sat, 11 Jun 2022 08:07:30 -0400 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1654949226; bh=f+Jaz6QgtshZ9cMPbP+AF3+iiOYVLcQwPDmO0mjZdM0=; h=From:Subject:Date:To:From; b=rW+3frgKrY+C7WxEPiOk4KH+1z6CLC6HML+cKvhCm+NHJ/5iTsSWnBl8jDiOAODkb wFzYE39MsEktiuaGtayb9wysfFnaZodlO4zKv3Csbo496PPd3Y4FZ0CEswgn4ZIFxw HF0PAWLs1rB9ySkaYKGsRK1rJ8w8vMXixy6a8T+0= Feedback-ID: mattiase@acm.or Original-Received: from smtpclient.apple (c188-150-171-71.bredband.tele2.se [188.150.171.71]) (authenticated bits=0) by mail50c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id 25BC74rV017094 for ; Sat, 11 Jun 2022 12:07:05 +0000 X-Mailer: Apple Mail (2.3654.120.0.1.13) X-CTCH-RefID: str=0001.0A782F25.62A4856A.0020, 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-Origin-Country: SE Received-SPF: softfail client-ip=91.136.10.185; envelope-from=mattiase@acm.org; helo=mail50c50.megamailservers.eu X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action 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:234274 Archived-At: --Apple-Mail=_FCB02B89-EC3B-403F-99E8-F6FB490350E1 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii In function definitions, doc strings, `declare` and `interactive` forms = are each optional but must appear in that order and duplications are not = permitted. Many violations against these rules go undetected. The attached patch adds checks to `defun` and `defmacro`. Violations = result in compilation warnings but it could be changed into hard errors = if desired. It also accepts `(:documentation EXPR)` as alternative to a = doc string literal, which currently doesn't work i all cases. Applying it reveals a handful of mistakes in the Emacs source tree, and = in some external packages. --Apple-Mail=_FCB02B89-EC3B-403F-99E8-F6FB490350E1 Content-Disposition: attachment; filename=0001-function-and-macro-attribute-order-warning-patch.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-function-and-macro-attribute-order-warning-patch.patch" Content-Transfer-Encoding: quoted-printable =46rom=208f7da7e642be6fb4bf09ba71a986319aa4d47988=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Fri,=2010=20Jun=202022=2010:16:57=20+0200=0A= Subject:=20[PATCH]=20function=20and=20macro=20attribute=20order=20= warning=20patch=0A=0A---=0A=20lisp/emacs-lisp/byte-run.el=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20|=20244=20++++++++++------=0A=20= .../bytecomp-resources/fun-attr-warn.el=20=20=20=20=20=20=20|=20266=20= ++++++++++++++++++=0A=20test/lisp/emacs-lisp/bytecomp-tests.el=20=20=20=20= =20=20=20=20|=20=2063=20+++++=0A=203=20files=20changed,=20482=20= insertions(+),=2091=20deletions(-)=0A=20create=20mode=20100644=20= test/lisp/emacs-lisp/bytecomp-resources/fun-attr-warn.el=0A=0Adiff=20= --git=20a/lisp/emacs-lisp/byte-run.el=20b/lisp/emacs-lisp/byte-run.el=0A= index=2092c2699c6e..8e5e0e0f5a=20100644=0A---=20= a/lisp/emacs-lisp/byte-run.el=0A+++=20b/lisp/emacs-lisp/byte-run.el=0A@@=20= -289,7=20+289,7=20@@=20macro-declarations-alist=0A=20(defalias=20= 'defmacro=0A=20=20=20(cons=0A=20=20=20=20'macro=0A-=20=20=20#'(lambda=20= (name=20arglist=20&optional=20docstring=20&rest=20body)=0A+=20=20=20= #'(lambda=20(name=20arglist=20&rest=20body)=0A=20=20=20=20=20=20=20=20= "Define=20NAME=20as=20a=20macro.=0A=20When=20the=20macro=20is=20called,=20= as=20in=20(NAME=20ARGS...),=0A=20the=20function=20(lambda=20ARGLIST=20= BODY...)=20is=20applied=20to=0A@@=20-301,115=20+301,177=20@@=20'defmacro=0A= =20The=20return=20value=20is=20undefined.=0A=20=0A=20\(fn=20NAME=20= ARGLIST=20&optional=20DOCSTRING=20DECL=20&rest=20BODY)"=0A-=20=20=20=20=20= =20=20;;=20We=20can't=20just=20have=20`decl'=20as=20an=20&optional=20= argument,=20because=20we=20need=0A-=20=20=20=20=20=20=20;;=20to=20= distinguish=0A-=20=20=20=20=20=20=20;;=20=20=20=20(defmacro=20foo=20= (arg)=20(bar)=20nil)=0A-=20=20=20=20=20=20=20;;=20from=0A-=20=20=20=20=20= =20=20;;=20=20=20=20(defmacro=20foo=20(arg)=20(bar)).=0A-=20=20=20=20=20=20= =20(let=20((decls=20(cond=0A-=09=09=20=20=20=20=20((eq=20(car-safe=20= docstring)=20'declare)=0A-=09=09=20=20=20=20=20=20(prog1=20(cdr=20= docstring)=20(setq=20docstring=20nil)))=0A-=09=09=20=20=20=20=20((and=20= (stringp=20docstring)=0A-=09=09=09=20=20=20(eq=20(car-safe=20(car=20= body))=20'declare))=0A-=09=09=20=20=20=20=20=20(prog1=20(cdr=20(car=20= body))=20(setq=20body=20(cdr=20body)))))))=0A-=09=20(if=20docstring=20= (setq=20body=20(cons=20docstring=20body))=0A-=09=20=20=20(if=20(null=20= body)=20(setq=20body=20'(nil))))=0A-=09=20;;=20Can't=20use=20backquote=20= because=20it's=20not=20defined=20yet!=0A-=09=20(let*=20((fun=20(list=20= 'function=20(cons=20'lambda=20(cons=20arglist=20body))))=0A-=09=09(def=20= (list=20'defalias=0A-=09=09=09=20=20=20(list=20'quote=20name)=0A-=09=09=09= =20=20=20(list=20'cons=20''macro=20fun)))=0A-=09=09(declarations=0A-=09=09= =20(mapcar=0A-=09=09=20=20#'(lambda=20(x)=0A-=09=09=20=20=20=20=20=20= (let=20((f=20(cdr=20(assq=20(car=20x)=20macro-declarations-alist))))=0A-=09= =09=09(if=20f=20(apply=20(car=20f)=20name=20arglist=20(cdr=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= (macroexp-warn-and-return=0A-=09=09=09=20=20=20(format-message=0A-=09=09=09= =20=20=20=20"Unknown=20macro=20property=20%S=20in=20%S"=0A-=09=09=09=20=20= =20=20(car=20x)=20name)=0A-=09=09=09=20=20=20nil=20nil=20nil=20(car=20= x)))))=0A-=09=09=20=20decls)))=0A-=09=20=20=20;;=20Refresh=20font-lock=20= if=20this=20is=20a=20new=20macro,=20or=20it=20is=20an=0A-=09=20=20=20;;=20= existing=20macro=20whose=20'no-font-lock-keyword=20declaration=0A-=09=20=20= =20;;=20has=20changed.=0A-=09=20=20=20(if=20(and=0A-=09=09;;=20If=20= lisp-mode=20hasn't=20been=20loaded,=20there's=20no=20reason=0A-=09=09;;=20= to=20flush.=0A-=09=09(fboundp=20'lisp--el-font-lock-flush-elisp-buffers)=0A= -=09=09(or=20(not=20(fboundp=20name))=20;;=20new=20macro=0A-=09=09=20=20=20= =20(and=20(fboundp=20name)=20=20;;=20existing=20macro=0A-=09=09=09=20= (member=20`(function-put=20',name=20'no-font-lock-keyword=0A-=09=09=09=09= =09=09',(get=20name=20'no-font-lock-keyword))=0A-=09=09=09=09=20= declarations))))=0A+=20=20=20=20=20=20=20(let=20((docstring=20nil)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20(declare-form=20nil)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20(warnings=20nil))=0A+=20=20=20=20=20=20=20=20=20= (while=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(and=20body=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(let*=20((form=20(car=20= body))=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(head=20(car-safe=20form)))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(cond=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20((or=20(and=20(stringp=20form)=20(cdr=20= body))=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(eq=20head=20:documentation))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(cond=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(docstring=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(push=20= (macroexp-warn-and-return=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"More=20than=20one=20doc=20= string"=20nil=20nil=20t=20form)=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=20warnings))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (declare-form=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(push=20(macroexp-warn-and-return=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= "Doc=20string=20after=20`declare'"=20nil=20nil=20t=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= declare-form)=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=20warnings))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20(setq=20docstring=20= form)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20t)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ((eq=20head=20'declare)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(cond=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(declare-form=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(push=20(macroexp-warn-and-return=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"More=20than=20one=20`declare'=20form"=20nil=20nil=20= t=20form)=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=20warnings))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20(t=20(setq=20declare-form=20= form)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20t))))=0A+=20=20=20=20=20=20=20=20=20=20=20(setq=20body=20(cdr=20= body)))=0A+=20=20=20=20=20=20=20=20=20(if=20docstring=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20(setq=20body=20(cons=20docstring=20body))=0A+=20=20=20= =20=20=20=20=20=20=20=20(if=20(null=20body)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(setq=20body=20'(nil))))=0A+=20=20=20=20=20=20=20=20=20= (let*=20((declarations=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(nconc=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= warnings=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (mapcar=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(let=20((f=20(cdr=20(assq=20(car=20x)=20= macro-declarations-alist))))=0A+=09=09=20=20=20=20=20=20=20=20=20(if=20f=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(apply=20(car=20f)=20name=20arglist=20(cdr=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= (macroexp-warn-and-return=0A+=09=09=20=20=20=20=20=20=20=20=20=20=20=20= (format-message=0A+=09=09=20=20=20=20=20=20=20=20=20=20=20=20=20"Unknown=20= macro=20property=20%S=20in=20%S"=0A+=09=09=20=20=20=20=20=20=20=20=20=20=20= =20=20(car=20x)=20name)=0A+=09=09=20=20=20=20=20=20=20=20=20=20=20=20nil=20= nil=20nil=20(car=20x)))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(cdr=20declare-form))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20;;=20Can't=20use=20backquote=20because=20it's=20not=20= defined=20yet!=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(fun=20= (list=20'function=20(cons=20'lambda=20(cons=20arglist=20body))))=0A+=09=20= =20=20=20=20=20=20=20(def=20(list=20'defalias=0A+=09=09=20=20=20=20=20=20= =20=20=20=20=20(list=20'quote=20name)=0A+=09=09=20=20=20=20=20=20=20=20=20= =20=20(list=20'cons=20''macro=20fun))))=0A+=20=20=20=20=20=20=20=20=20=20= =20;;=20Refresh=20font-lock=20if=20this=20is=20a=20new=20macro,=20or=20= it=20is=20an=0A+=20=20=20=20=20=20=20=20=20=20=20;;=20existing=20macro=20= whose=20'no-font-lock-keyword=20declaration=0A+=20=20=20=20=20=20=20=20=20= =20=20;;=20has=20changed.=0A+=20=20=20=20=20=20=20=20=20=20=20(if=20(and=0A= +=09=20=20=20=20=20=20=20=20;;=20If=20lisp-mode=20hasn't=20been=20= loaded,=20there's=20no=20reason=0A+=09=20=20=20=20=20=20=20=20;;=20to=20= flush.=0A+=09=20=20=20=20=20=20=20=20(fboundp=20= 'lisp--el-font-lock-flush-elisp-buffers)=0A+=09=20=20=20=20=20=20=20=20= (or=20(not=20(fboundp=20name))=20;;=20new=20macro=0A+=09=20=20=20=20=20=20= =20=20=20=20=20=20(and=20(fboundp=20name)=20=20;;=20existing=20macro=0A+=09= =09=20=20=20=20=20=20=20=20=20(member=20`(function-put=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',name=20'no-font-lock-keyword=0A+=09=09=09=09=20=20=20= ',(get=20name=20'no-font-lock-keyword))=0A+=09=09=09=20=20=20=20=20=20=20= =20=20declarations))))=0A=20=09=20=20=20=20=20=20=20= (lisp--el-font-lock-flush-elisp-buffers))=0A-=09=20=20=20(if=20= declarations=0A+=20=20=20=20=20=20=20=20=20=20=20(if=20declarations=0A=20= =09=20=20=20=20=20=20=20(cons=20'prog1=20(cons=20def=20declarations))=0A=20= =09=20=20=20=20=20def))))))=0A=20=0A=20;;=20Now=20that=20we=20defined=20= defmacro=20we=20can=20use=20it!=0A-(defmacro=20defun=20(name=20arglist=20= &optional=20docstring=20&rest=20body)=0A+(defmacro=20defun=20(name=20= arglist=20&rest=20body)=0A=20=20=20"Define=20NAME=20as=20a=20function.=0A= =20The=20definition=20is=20(lambda=20ARGLIST=20[DOCSTRING]=20BODY...).=0A= -See=20also=20the=20function=20`interactive'.=0A=20DECL=20is=20a=20= declaration,=20optional,=20of=20the=20form=20(declare=20DECLS...)=20= where=0A=20DECLS=20is=20a=20list=20of=20elements=20of=20the=20form=20= (PROP=20.=20VALUES).=20=20These=20are=0A=20interpreted=20according=20to=20= `defun-declarations-alist'.=0A+INTERACTIVE=20is=20an=20optional=20= `interactive'=20specification.=0A=20The=20return=20value=20is=20= undefined.=0A=20=0A-\(fn=20NAME=20ARGLIST=20&optional=20DOCSTRING=20DECL=20= &rest=20BODY)"=0A-=20=20;;=20We=20can't=20just=20have=20`decl'=20as=20an=20= &optional=20argument,=20because=20we=20need=0A-=20=20;;=20to=20= distinguish=0A-=20=20;;=20=20=20=20(defun=20foo=20(arg)=20(toto)=20nil)=0A= -=20=20;;=20from=0A-=20=20;;=20=20=20=20(defun=20foo=20(arg)=20(toto)).=0A= +\(fn=20NAME=20ARGLIST=20&optional=20DOCSTRING=20DECL=20INTERACTIVE=20= &rest=20BODY)"=0A=20=20=20(declare=20(doc-string=203)=20(indent=202))=0A=20= =20=20(or=20name=20(error=20"Cannot=20define=20'%s'=20as=20a=20function"=20= name))=0A=20=20=20(if=20(null=0A=20=20=20=20=20=20=20=20(and=20(listp=20= arglist)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20(null=20(delq=20t=20= (mapcar=20#'symbolp=20arglist)))))=0A=20=20=20=20=20=20=20(error=20= "Malformed=20arglist:=20%s"=20arglist))=0A-=20=20(let=20((decls=20(cond=0A= -=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((eq=20(car-safe=20= docstring)=20'declare)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(prog1=20(cdr=20docstring)=20(setq=20docstring=20nil)))=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20((and=20(stringp=20docstring)=0A-=09=09= =20=20=20=20=20=20(eq=20(car-safe=20(car=20body))=20'declare))=0A-=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(prog1=20(cdr=20(car=20body))=20= (setq=20body=20(cdr=20body)))))))=0A-=20=20=20=20(if=20docstring=20(setq=20= body=20(cons=20docstring=20body))=0A-=20=20=20=20=20=20(if=20(null=20= body)=20(setq=20body=20'(nil))))=0A+=20=20(let=20((docstring=20nil)=0A+=20= =20=20=20=20=20=20=20(declare-form=20nil)=0A+=20=20=20=20=20=20=20=20= (interactive-form=20nil)=0A+=20=20=20=20=20=20=20=20(warnings=20nil))=0A= +=20=20=20=20(while=0A+=20=20=20=20=20=20=20=20(and=20body=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20(let*=20((form=20(car=20body))=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(head=20(car-safe=20= form)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(cond=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20((or=20(and=20(stringp=20form)=20= (cdr=20body))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(eq=20head=20:documentation))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(cond=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(docstring=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (push=20(macroexp-warn-and-return=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"More=20than=20one=20doc=20= string"=20nil=20nil=20t=20form)=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=20warnings))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(declare-form=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(push=20(macroexp-warn-and-return=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= "Doc=20string=20after=20`declare'"=20nil=20nil=20t=20declare-form)=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= warnings))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (interactive-form=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(push=20(macroexp-warn-and-return=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"Doc=20string=20after=20= `interactive'"=20nil=20nil=20t=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=20interactive-form)=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=20warnings))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20(setq=20= docstring=20form)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= t)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((eq=20head=20= 'declare)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(cond=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(declare-form=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20= (macroexp-warn-and-return=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"More=20than=20one=20`declare'=20form"=20= nil=20nil=20t=20form)=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=20warnings))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(interactive-form=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(push=20(macroexp-warn-and-return=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= "`declare'=20after=20`interactive'"=20nil=20nil=20t=20form)=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= warnings))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20= (setq=20declare-form=20form)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20t)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20((eq=20= head=20'interactive)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (cond=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (interactive-form=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(push=20(macroexp-warn-and-return=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"More=20than=20one=20= `interactive'=20form"=20nil=20nil=20t=20form)=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=20warnings))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=20(setq=20= interactive-form=20form)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20t))))=0A+=20=20=20=20=20=20(setq=20body=20(cdr=20body)))=0A=20=20=20= =20=20(let=20((declarations=0A-=20=20=20=20=20=20=20=20=20=20=20(mapcar=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(let=20((f=20(cdr=20(assq=20(car=20x)=20= defun-declarations-alist))))=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(cond=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(f=20(apply=20(car=20f)=20name=20arglist=20(cdr=20x)))=0A-=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;;=20Yuck!!=0A-=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20((and=20(featurep=20'cl)=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= (memq=20(car=20x)=20=20;C.f.=20cl-do-proclaim.=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= '(special=20inline=20notinline=20optimize=20warn)))=0A-=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(push=20(list=20'declare=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(if=20(stringp=20docstring)=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(if=20(eq=20= (car-safe=20(cadr=20body))=20'interactive)=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= (cddr=20body)=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(cdr=20body))=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(if=20= (eq=20(car-safe=20(car=20body))=20'interactive)=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= (cdr=20body)=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=20body)))=0A-=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20nil)=0A-=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(t=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20(macroexp-warn-and-return=0A-=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(format-message=20"Unknown=20defun=20= property=20`%S'=20in=20%S"=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=20=20(car=20= x)=20name)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20nil=20nil=20nil=20(car=20x))))))=0A-=20=20=20=20=20=20=20=20=20=20=20=20= decls))=0A-=20=20=20=20=20=20=20=20=20=20(def=20(list=20'defalias=0A-=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(list=20'quote=20= name)=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (list=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=20=20=20(cons=20'lambda=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= (cons=20arglist=20body))))))=0A-=20=20=20=20=20=20(if=20declarations=0A-=20= =20=20=20=20=20=20=20=20=20(cons=20'prog1=20(cons=20def=20declarations))=0A= -=20=20=20=20=20=20=20=20=20=20def))))=0A+=20=20=20=20=20=20=20=20=20=20=20= (nconc=0A+=20=20=20=20=20=20=20=20=20=20=20=20warnings=0A+=20=20=20=20=20= =20=20=20=20=20=20=20(mapcar=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= (let=20((f=20(cdr=20(assq=20(car=20x)=20defun-declarations-alist))))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(cond=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(f=20(apply=20(car=20f)=20= name=20arglist=20(cdr=20x)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20;;=20Yuck!!=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20((and=20(featurep=20'cl)=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(memq=20(car=20x)=20=20= ;C.f.=20cl-do-proclaim.=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'(special=20inline=20= notinline=20optimize=20warn)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20(push=20(list=20'declare=20x)=20body)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20nil)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(t=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(macroexp-warn-and-return=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (format-message=20"Unknown=20defun=20property=20`%S'=20in=20%S"=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=20=20=20(car=20x)=20name)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20nil=20nil=20nil=20(car=20= x))))))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20(cdr=20= declare-form)))))=0A+=20=20=20=20=20=20(if=20interactive-form=0A+=20=20=20= =20=20=20=20=20=20=20(setq=20body=20(cons=20interactive-form=20body)))=0A= +=20=20=20=20=20=20(if=20docstring=0A+=20=20=20=20=20=20=20=20=20=20= (setq=20body=20(cons=20docstring=20body)))=0A+=20=20=20=20=20=20(if=20= (null=20body)=0A+=20=20=20=20=20=20=20=20=20=20(setq=20body=20'(nil)))=0A= +=20=20=20=20=20=20(let=20((def=20(list=20'defalias=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=20'quote=20= name)=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=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=20=20=20=20=20(cons=20'lambda=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(cons=20arglist=20body))))))=0A+=20=20=20=20=20=20=20=20(if=20= declarations=0A+=20=20=20=20=20=20=20=20=20=20=20=20(cons=20'prog1=20= (cons=20def=20declarations))=0A+=20=20=20=20=20=20=20=20=20=20def)))))=0A= =20=0A=20=0C=0A=20;;=20Redefined=20in=20byte-opt.el.=0Adiff=20--git=20= a/test/lisp/emacs-lisp/bytecomp-resources/fun-attr-warn.el=20= b/test/lisp/emacs-lisp/bytecomp-resources/fun-attr-warn.el=0Anew=20file=20= mode=20100644=0Aindex=200000000000..be907b32f4=0A---=20/dev/null=0A+++=20= b/test/lisp/emacs-lisp/bytecomp-resources/fun-attr-warn.el=0A@@=20-0,0=20= +1,266=20@@=0A+;;;=20-*-=20lexical-binding:=20t=20-*-=0A+=0A+;;=20= Correct=0A+=0A+(defun=20faw-str-decl-code=20(x)=0A+=20=20"something"=0A+=20= =20(declare=20(pure=20t))=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-doc-decl-code=20(x)=0A+=20=20(:documentation=20"something")=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-str-int-code=20(x)=0A+=20=20"something"=0A+=20=20(interactive=20"P")=0A= +=20=20(print=20x))=0A+=0A+(defun=20faw-doc-int-code=20(x)=0A+=20=20= (:documentation=20"something")=0A+=20=20(interactive=20"P")=0A+=20=20= (print=20x))=0A+=0A+(defun=20faw-decl-int-code=20(x)=0A+=20=20(declare=20= (pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20(print=20x))=0A+=0A= +(defun=20faw-str-decl-int-code=20(x)=0A+=20=20"something"=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20(print=20= x))=0A+=0A+(defun=20faw-doc-decl-int-code=20(x)=0A+=20=20(:documentation=20= "something")=0A+=20=20(declare=20(pure=20t))=0A+=20=20(interactive=20= "P")=0A+=20=20(print=20x))=0A+=0A+=0A+;;=20Correct=20(last=20string=20is=20= return=20value)=0A+=0A+(defun=20faw-str=20()=0A+=20=20"something")=0A+=0A= +(defun=20faw-decl-str=20()=0A+=20=20(declare=20(pure=20t))=0A+=20=20= "something")=0A+=0A+(defun=20faw-decl-int-str=20()=0A+=20=20(declare=20= (pure=20t))=0A+=20=20(interactive)=0A+=20=20"something")=0A+=0A+(defun=20= faw-str-str=20()=0A+=20=20"something"=0A+=20=20"something=20else")=0A+=0A= +(defun=20faw-doc-str=20()=0A+=20=20(:documentation=20"something")=0A+=20= =20"something=20else")=0A+=0A+=0A+;;=20Incorrect=20(bad=20order)=0A+=0A= +(defun=20faw-int-decl-code=20(x)=0A+=20=20(interactive=20"P")=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-int-str-code=20(x)=0A+=20=20(interactive=20"P")=0A+=20=20"something"=0A= +=20=20(print=20x))=0A+=0A+(defun=20faw-int-doc-code=20(x)=0A+=20=20= (interactive=20"P")=0A+=20=20(:documentation=20"something")=0A+=20=20= (print=20x))=0A+=0A+(defun=20faw-decl-str-code=20(x)=0A+=20=20(declare=20= (pure=20t))=0A+=20=20"something"=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-decl-doc-code=20(x)=0A+=20=20(declare=20(pure=20t))=0A+=20=20= (:documentation=20"something")=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-str-int-decl-code=20(x)=0A+=20=20"something"=0A+=20=20(interactive=20= "P")=0A+=20=20(declare=20(pure=20t))=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-doc-int-decl-code=20(x)=0A+=20=20(:documentation=20"something")=0A+=20= =20(interactive=20"P")=0A+=20=20(declare=20(pure=20t))=0A+=20=20(print=20= x))=0A+=0A+(defun=20faw-int-str-decl-code=20(x)=0A+=20=20(interactive=20= "P")=0A+=20=20"something"=0A+=20=20(declare=20(pure=20t))=0A+=20=20= (print=20x))=0A+=0A+(defun=20faw-int-doc-decl-code=20(x)=0A+=20=20= (interactive=20"P")=0A+=20=20(:documentation=20"something")=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-int-decl-str-code=20(x)=0A+=20=20(interactive=20"P")=0A+=20=20= (declare=20(pure=20t))=0A+=20=20"something"=0A+=20=20(print=20x))=0A+=0A= +(defun=20faw-int-decl-doc-code=20(x)=0A+=20=20(interactive=20"P")=0A+=20= =20(declare=20(pure=20t))=0A+=20=20(:documentation=20"something")=0A+=20=20= (print=20x))=0A+=0A+(defun=20faw-decl-int-str-code=20(x)=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20"something"=0A= +=20=20(print=20x))=0A+=0A+(defun=20faw-decl-int-doc-code=20(x)=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20= (:documentation=20"something")=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-decl-str-int-code=20(x)=0A+=20=20(declare=20(pure=20t))=0A+=20=20= "something"=0A+=20=20(interactive=20"P")=0A+=20=20(print=20x))=0A+=0A= +(defun=20faw-decl-doc-int-code=20(x)=0A+=20=20(declare=20(pure=20t))=0A= +=20=20(:documentation=20"something")=0A+=20=20(interactive=20"P")=0A+=20= =20(print=20x))=0A+=0A+=0A+;;=20Incorrect=20(duplication)=0A+=0A+(defun=20= faw-str-str-decl-int-code=20(x)=0A+=20=20"something"=0A+=20=20"something=20= else"=0A+=20=20(declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20= =20(print=20x))=0A+=0A+(defun=20faw-str-doc-decl-int-code=20(x)=0A+=20=20= "something"=0A+=20=20(:documentation=20"something=20else")=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20(print=20= x))=0A+=0A+(defun=20faw-doc-str-decl-int-code=20(x)=0A+=20=20= (:documentation=20"something")=0A+=20=20"something=20else"=0A+=20=20= (declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20(print=20= x))=0A+=0A+(defun=20faw-doc-doc-decl-int-code=20(x)=0A+=20=20= (:documentation=20"something")=0A+=20=20(:documentation=20"something=20= else")=0A+=20=20(declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20= =20(print=20x))=0A+=0A+(defun=20faw-str-decl-str-int-code=20(x)=0A+=20=20= "something"=0A+=20=20(declare=20(pure=20t))=0A+=20=20"something=20else"=0A= +=20=20(interactive=20"P")=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-doc-decl-str-int-code=20(x)=0A+=20=20(:documentation=20"something")=0A= +=20=20(declare=20(pure=20t))=0A+=20=20"something=20else"=0A+=20=20= (interactive=20"P")=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-str-decl-doc-int-code=20(x)=0A+=20=20"something"=0A+=20=20(declare=20= (pure=20t))=0A+=20=20(:documentation=20"something=20else")=0A+=20=20= (interactive=20"P")=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-doc-decl-doc-int-code=20(x)=0A+=20=20(:documentation=20"something")=0A= +=20=20(declare=20(pure=20t))=0A+=20=20(:documentation=20"something=20= else")=0A+=20=20(interactive=20"P")=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-str-decl-decl-int-code=20(x)=0A+=20=20"something"=0A+=20=20(declare=20= (pure=20t))=0A+=20=20(declare=20(indent=201))=0A+=20=20(interactive=20= "P")=0A+=20=20(print=20x))=0A+=0A+(defun=20faw-doc-decl-decl-int-code=20= (x)=0A+=20=20(:documentation=20"something")=0A+=20=20(declare=20(pure=20= t))=0A+=20=20(declare=20(indent=201))=0A+=20=20(interactive=20"P")=0A+=20= =20(print=20x))=0A+=0A+(defun=20faw-str-decl-int-decl-code=20(x)=0A+=20=20= "something"=0A+=20=20(declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A= +=20=20(declare=20(indent=201))=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-doc-decl-int-decl-code=20(x)=0A+=20=20(:documentation=20"something")=0A= +=20=20(declare=20(pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20= (declare=20(indent=201))=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-str-decl-int-int-code=20(x)=0A+=20=20"something"=0A+=20=20(declare=20= (pure=20t))=0A+=20=20(interactive=20"P")=0A+=20=20(interactive=20"p")=0A= +=20=20(print=20x))=0A+=0A+(defun=20faw-doc-decl-int-int-code=20(x)=0A+=20= =20(:documentation=20"something")=0A+=20=20(declare=20(pure=20t))=0A+=20=20= (interactive=20"P")=0A+=20=20(interactive=20"p")=0A+=20=20(print=20x))=0A= +=0A+(defun=20faw-str-int-decl-int-code=20(x)=0A+=20=20"something"=0A+=20= =20(interactive=20"P")=0A+=20=20(declare=20(pure=20t))=0A+=20=20= (interactive=20"p")=0A+=20=20(print=20x))=0A+=0A+(defun=20= faw-doc-int-decl-int-code=20(x)=0A+=20=20(:documentation=20"something")=0A= +=20=20(interactive=20"P")=0A+=20=20(declare=20(pure=20t))=0A+=20=20= (interactive=20"p")=0A+=20=20(print=20x))=0Adiff=20--git=20= a/test/lisp/emacs-lisp/bytecomp-tests.el=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0Aindex=20= 27098d0bb1..0e46bce5f2=20100644=0A---=20= a/test/lisp/emacs-lisp/bytecomp-tests.el=0A+++=20= b/test/lisp/emacs-lisp/bytecomp-tests.el=0A@@=20-1574,6=20+1574,69=20@@=20= bytecomp-function-attributes=0A=20=20=20=20=20=20=20(should=20(equal=20= (get=20fname=20'lisp-indent-function)=201))=0A=20=20=20=20=20=20=20= (should=20(equal=20(aref=20bc=204)=20"tata\n\n(fn=20X)")))))=0A=20=0A= +(ert-deftest=20bytecomp-fun-attr-warn=20()=0A+=20=20;;=20Check=20that=20= warnings=20are=20emitted=20when=20doc=20strings,=20`declare'=20and=0A+=20= =20;;=20`interactive'=20forms=20don't=20come=20in=20the=20proper=20= order,=20or=20more=20than=20once.=0A+=20=20(let*=20((filename=20= "fun-attr-warn.el")=0A+=20=20=20=20=20=20=20=20=20(el=20= (ert-resource-file=20filename))=0A+=20=20=20=20=20=20=20=20=20(elc=20= (concat=20el=20"c"))=0A+=20=20=20=20=20=20=20=20=20(text-quoting-style=20= 'grave))=0A+=20=20=20=20(with-current-buffer=20(get-buffer-create=20= "*Compile-Log*")=0A+=20=20=20=20=20=20(let=20((inhibit-read-only=20t))=0A= +=20=20=20=20=20=20=20=20(erase-buffer))=0A+=20=20=20=20=20=20= (byte-compile-file=20el)=0A+=20=20=20=20=20=20(let=20((expected=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20'("70:4:=20Warning:=20`declare'=20after=20= `interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"74:4:=20= Warning:=20Doc=20string=20after=20`interactive'"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20"79:4:=20Warning:=20Doc=20string=20after=20= `interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"84:4:=20= Warning:=20Doc=20string=20after=20`declare'"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20"89:4:=20Warning:=20Doc=20string=20after=20`declare'"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"96:4:=20Warning:=20= `declare'=20after=20`interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20"102:4:=20Warning:=20`declare'=20after=20`interactive'"=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20"108:4:=20Warning:=20`declare'=20= after=20`interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= "106:4:=20Warning:=20Doc=20string=20after=20`interactive'"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20"114:4:=20Warning:=20`declare'=20after=20= `interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"112:4:=20= Warning:=20Doc=20string=20after=20`interactive'"=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20"118:4:=20Warning:=20Doc=20string=20after=20= `interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"119:4:=20= Warning:=20`declare'=20after=20`interactive'"=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20"124:4:=20Warning:=20Doc=20string=20after=20= `interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"125:4:=20= Warning:=20`declare'=20after=20`interactive'"=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20"130:4:=20Warning:=20Doc=20string=20after=20= `declare'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"136:4:=20= Warning:=20Doc=20string=20after=20`declare'"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20"142:4:=20Warning:=20Doc=20string=20after=20`declare'"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"148:4:=20Warning:=20Doc=20= string=20after=20`declare'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20"156:2:=20Warning:=20More=20than=20one=20doc=20string"=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20"165:4:=20Warning:=20More=20than=20one=20= doc=20string"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"170:2:=20= Warning:=20More=20than=20one=20doc=20string"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20"179:4:=20Warning:=20More=20than=20one=20doc=20string"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"184:2:=20Warning:=20More=20= than=20one=20doc=20string"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= "191:2:=20Warning:=20More=20than=20one=20doc=20string"=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20"201:4:=20Warning:=20More=20than=20one=20= doc=20string"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"208:4:=20= Warning:=20More=20than=20one=20doc=20string"=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20"215:4:=20Warning:=20More=20than=20one=20`declare'=20= form"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"222:4:=20Warning:=20= More=20than=20one=20`declare'=20form"=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20"230:4:=20Warning:=20More=20than=20one=20`declare'=20form"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"237:4:=20Warning:=20More=20= than=20one=20`declare'=20form"=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20"244:4:=20Warning:=20More=20than=20one=20`interactive'=20form"=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20"251:4:=20Warning:=20More=20= than=20one=20`interactive'=20form"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20"258:4:=20Warning:=20More=20than=20one=20`interactive'=20form"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"257:4:=20Warning:=20= `declare'=20after=20`interactive'"=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20"265:4:=20Warning:=20More=20than=20one=20`interactive'=20form"=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20"264:4:=20Warning:=20= `declare'=20after=20`interactive'")))=0A+=20=20=20=20=20=20=20=20= (goto-char=20(point-min))=0A+=20=20=20=20=20=20=20=20(let=20((actual=20= nil))=0A+=20=20=20=20=20=20=20=20=20=20(while=20(re-search-forward=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(rx=20bol=20(*=20(not=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(group=20(+=20digit)=20":"=20(+=20digit)=20":=20Warning:=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=20(or=20"More=20than=20one=20"=20(+=20nonl)=20"=20form"=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(+=20nonl)=20"=20after=20"=20(+=20nonl))))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20eol)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20nil=20t)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20(push=20(match-string=201)=20actual))=0A+=20=20=20=20=20= =20=20=20=20=20(setq=20actual=20(nreverse=20actual))=0A+=20=20=20=20=20=20= =20=20=20=20(should=20(equal=20actual=20expected)))))))=0A+=0A+=0A=20;;=20= Local=20Variables:=0A=20;;=20no-byte-compile:=20t=0A=20;;=20End:=0A--=20=0A= 2.32.0=20(Apple=20Git-132)=0A=0A= --Apple-Mail=_FCB02B89-EC3B-403F-99E8-F6FB490350E1--