1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-11 10:20:33 -08:00

Single string literal in body is return value only, not doc string

A function or macro body consisting of a single string literal now only
uses it as a return value.  Previously, it had the dual uses as return
value and doc string, which was never what the programmer wanted and
had some inconvenient consequences (bug#69387).

This change applies to `lambda`, `defun`, `defsubst` and `defmacro`
forms; most other defining forms already worked in the sensible way.

* lisp/emacs-lisp/bytecomp.el (byte-compile-lambda):
Don't use a lone string literal as doc string.
* test/lisp/emacs-lisp/bytecomp-resources/warn-wide-docstring-defun.el
(foo): Update docstring warning test.
* doc/lispref/functions.texi (Function Documentation): Update.
* etc/NEWS: Announce.
This commit is contained in:
Mattias Engdegård 2024-03-06 12:03:06 +01:00
parent 8aabd83574
commit 61b2f5f96b
4 changed files with 28 additions and 13 deletions

View file

@ -498,13 +498,12 @@ indentation of the following lines is inside the string; what looks
nice in the source code will look ugly when displayed by the help
commands.
You may wonder how the documentation string could be optional, since
there are required components of the function that follow it (the body).
Since evaluation of a string returns that string, without any side effects,
it has no effect if it is not the last form in the body. Thus, in
practice, there is no confusion between the first form of the body and the
documentation string; if the only body form is a string then it serves both
as the return value and as the documentation.
A documentation string must always be followed by at least one Lisp
expression; otherwise, it is not a documentation string at all but the
single expression of the body and used as the return value.
When there is no meaningful value to return from a function, it is
standard practice to return @code{nil} by adding it after the
documentation string.
The last line of the documentation string can specify calling
conventions different from the actual function arguments. Write

View file

@ -1818,6 +1818,22 @@ Tree-sitter conditionally sets 'forward-sexp-function' for major modes
that have defined 'sexp' in 'treesit-thing-settings' to enable
sexp-related motion commands.
+++
** Returned strings are never docstrings.
Functions and macros whose bodies consist of a single string literal now
only return that string; it is not used as a docstring. Example:
(defun sing-a-song ()
"Sing a song.")
The above function returns the string '"Sing a song."' but has no
docstring. Previously, that string was used as both a docstring and
return value, which was never what the programmer wanted. If you want
the string to be a docstring, add an explicit return value.
This change applies to 'defun', 'defsubst', 'defmacro' and 'lambda'
forms; other defining forms such as 'cl-defun' already worked this way.
** New or changed byte-compilation warnings
---

View file

@ -3061,12 +3061,11 @@ lambda-expression."
(append (if (not lexical-binding) arglistvars)
byte-compile-bound-variables))
(body (cdr (cdr fun)))
(doc (if (stringp (car body))
;; Treat a final string literal as a value, not a doc string.
(doc (if (and (cdr body) (stringp (car body)))
(prog1 (car body)
;; Discard the doc string from the body
;; unless it is the last element of the body.
(if (cdr body)
(setq body (cdr body))))))
;; Discard the doc string from the body.
(setq body (cdr body)))))
(int (assq 'interactive body))
command-modes)
(when lexical-binding

View file

@ -1,3 +1,4 @@
;;; -*- lexical-binding: t -*-
(defun foo ()
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
nil)