emacs/test/lisp/emacs-lisp/bytecomp-resources/fun-attr-warn.el
Mattias Engdegård 73e75e18d1 Warn about misplaced or duplicated function/macro declarations
Doc strings, `declare` and `interactive` forms must appear in that
order and at most once each.  Complain if they don't, instead of
silently ignoring the problem (bug#55905).

* lisp/emacs-lisp/byte-run.el (byte-run--parse-body)
(byte-run--parse-declarations): New.
(defmacro, defun): Check for declaration well-formedness as
described above.  Clarify doc strings.  Refactor some common code.
* test/lisp/emacs-lisp/bytecomp-resources/fun-attr-warn.el:
* test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-fun-attr-warn):
New test.
2022-06-17 17:25:29 +02:00

266 lines
4.7 KiB
EmacsLisp

;;; -*- lexical-binding: t -*-
;; Correct
(defun faw-str-decl-code (x)
"something"
(declare (pure t))
(print x))
(defun faw-doc-decl-code (x)
(:documentation "something")
(declare (pure t))
(print x))
(defun faw-str-int-code (x)
"something"
(interactive "P")
(print x))
(defun faw-doc-int-code (x)
(:documentation "something")
(interactive "P")
(print x))
(defun faw-decl-int-code (x)
(declare (pure t))
(interactive "P")
(print x))
(defun faw-str-decl-int-code (x)
"something"
(declare (pure t))
(interactive "P")
(print x))
(defun faw-doc-decl-int-code (x)
(:documentation "something")
(declare (pure t))
(interactive "P")
(print x))
;; Correct (last string is return value)
(defun faw-str ()
"something")
(defun faw-decl-str ()
(declare (pure t))
"something")
(defun faw-decl-int-str ()
(declare (pure t))
(interactive)
"something")
(defun faw-str-str ()
"something"
"something else")
(defun faw-doc-str ()
(:documentation "something")
"something else")
;; Incorrect (bad order)
(defun faw-int-decl-code (x)
(interactive "P")
(declare (pure t))
(print x))
(defun faw-int-str-code (x)
(interactive "P")
"something"
(print x))
(defun faw-int-doc-code (x)
(interactive "P")
(:documentation "something")
(print x))
(defun faw-decl-str-code (x)
(declare (pure t))
"something"
(print x))
(defun faw-decl-doc-code (x)
(declare (pure t))
(:documentation "something")
(print x))
(defun faw-str-int-decl-code (x)
"something"
(interactive "P")
(declare (pure t))
(print x))
(defun faw-doc-int-decl-code (x)
(:documentation "something")
(interactive "P")
(declare (pure t))
(print x))
(defun faw-int-str-decl-code (x)
(interactive "P")
"something"
(declare (pure t))
(print x))
(defun faw-int-doc-decl-code (x)
(interactive "P")
(:documentation "something")
(declare (pure t))
(print x))
(defun faw-int-decl-str-code (x)
(interactive "P")
(declare (pure t))
"something"
(print x))
(defun faw-int-decl-doc-code (x)
(interactive "P")
(declare (pure t))
(:documentation "something")
(print x))
(defun faw-decl-int-str-code (x)
(declare (pure t))
(interactive "P")
"something"
(print x))
(defun faw-decl-int-doc-code (x)
(declare (pure t))
(interactive "P")
(:documentation "something")
(print x))
(defun faw-decl-str-int-code (x)
(declare (pure t))
"something"
(interactive "P")
(print x))
(defun faw-decl-doc-int-code (x)
(declare (pure t))
(:documentation "something")
(interactive "P")
(print x))
;; Incorrect (duplication)
(defun faw-str-str-decl-int-code (x)
"something"
"something else"
(declare (pure t))
(interactive "P")
(print x))
(defun faw-str-doc-decl-int-code (x)
"something"
(:documentation "something else")
(declare (pure t))
(interactive "P")
(print x))
(defun faw-doc-str-decl-int-code (x)
(:documentation "something")
"something else"
(declare (pure t))
(interactive "P")
(print x))
(defun faw-doc-doc-decl-int-code (x)
(:documentation "something")
(:documentation "something else")
(declare (pure t))
(interactive "P")
(print x))
(defun faw-str-decl-str-int-code (x)
"something"
(declare (pure t))
"something else"
(interactive "P")
(print x))
(defun faw-doc-decl-str-int-code (x)
(:documentation "something")
(declare (pure t))
"something else"
(interactive "P")
(print x))
(defun faw-str-decl-doc-int-code (x)
"something"
(declare (pure t))
(:documentation "something else")
(interactive "P")
(print x))
(defun faw-doc-decl-doc-int-code (x)
(:documentation "something")
(declare (pure t))
(:documentation "something else")
(interactive "P")
(print x))
(defun faw-str-decl-decl-int-code (x)
"something"
(declare (pure t))
(declare (indent 1))
(interactive "P")
(print x))
(defun faw-doc-decl-decl-int-code (x)
(:documentation "something")
(declare (pure t))
(declare (indent 1))
(interactive "P")
(print x))
(defun faw-str-decl-int-decl-code (x)
"something"
(declare (pure t))
(interactive "P")
(declare (indent 1))
(print x))
(defun faw-doc-decl-int-decl-code (x)
(:documentation "something")
(declare (pure t))
(interactive "P")
(declare (indent 1))
(print x))
(defun faw-str-decl-int-int-code (x)
"something"
(declare (pure t))
(interactive "P")
(interactive "p")
(print x))
(defun faw-doc-decl-int-int-code (x)
(:documentation "something")
(declare (pure t))
(interactive "P")
(interactive "p")
(print x))
(defun faw-str-int-decl-int-code (x)
"something"
(interactive "P")
(declare (pure t))
(interactive "p")
(print x))
(defun faw-doc-int-decl-int-code (x)
(:documentation "something")
(interactive "P")
(declare (pure t))
(interactive "p")
(print x))