From 802a54ad6205479b29aaae9e737b665d8dfbdf91 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Wed, 6 Sep 2023 11:21:39 +0200 Subject: [PATCH] Error when trying to make nil or t obsolete * lisp/emacs-lisp/byte-run.el (make-obsolete, make-obsolete-variable): Signal error if the symbol to make obsolete is nil or t. (Bug#62248) (byte-run--constant-obsolete-warning): New function. * test/lisp/emacs-lisp/byte-run-tests.el: New file. --- lisp/emacs-lisp/byte-run.el | 7 ++++++ test/lisp/emacs-lisp/byte-run-tests.el | 32 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 test/lisp/emacs-lisp/byte-run-tests.el diff --git a/lisp/emacs-lisp/byte-run.el b/lisp/emacs-lisp/byte-run.el index a377ec395e1..3e4e4d12cc8 100644 --- a/lisp/emacs-lisp/byte-run.el +++ b/lisp/emacs-lisp/byte-run.el @@ -494,6 +494,11 @@ convention was modified." Return t if there isn't any." (gethash function advertised-signature-table t)) +(defun byte-run--constant-obsolete-warning (obsolete-name) + (if (memq obsolete-name '(nil t)) + (error "Can't make `%s' obsolete; did you forget a quote mark?" + obsolete-name))) + (defun make-obsolete (obsolete-name current-name when) "Make the byte-compiler warn that function OBSOLETE-NAME is obsolete. OBSOLETE-NAME should be a function name or macro name (a symbol). @@ -503,6 +508,7 @@ If CURRENT-NAME is a string, that is the `use instead' message \(it should end with a period, and not start with a capital). WHEN should be a string indicating when the function was first made obsolete, for example a date or a release number." + (byte-run--constant-obsolete-warning obsolete-name) (put obsolete-name 'byte-obsolete-info ;; The second entry used to hold the `byte-compile' handler, but ;; is not used any more nowadays. @@ -539,6 +545,7 @@ WHEN should be a string indicating when the variable was first made obsolete, for example a date or a release number. ACCESS-TYPE if non-nil should specify the kind of access that will trigger obsolescence warnings; it can be either `get' or `set'." + (byte-run--constant-obsolete-warning obsolete-name) (put obsolete-name 'byte-obsolete-variable (purecopy (list current-name access-type when))) obsolete-name) diff --git a/test/lisp/emacs-lisp/byte-run-tests.el b/test/lisp/emacs-lisp/byte-run-tests.el new file mode 100644 index 00000000000..59ce24ad251 --- /dev/null +++ b/test/lisp/emacs-lisp/byte-run-tests.el @@ -0,0 +1,32 @@ +;;; byte-run-tests.el --- Tests for byte-run.el -*- lexical-binding: t -*- + +;; Copyright (C) 2023 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Code: + +(require 'ert) + +(ert-deftest make-obsolete () + (should-error (make-obsolete nil 'foo "30.1")) + (should-error (make-obsolete t 'foo "30.1") )) + +(ert-deftest make-obsolete-variable () + (should-error (make-obsolete-variable nil 'foo "30.1")) + (should-error (make-obsolete-variable t 'foo "30.1"))) + +;;; byte-run-tests.el ends here -- 2.39.5