
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.
266 lines
4.7 KiB
EmacsLisp
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))
|