Subject: bug#39233: .elc file - possibly outdated backward compatibility comments

From: Stefan Monnier <[email-masked]>
Date: Fri, 24 Jan 2020 13:45:34 -0500

Here's the patch I propose for `master`.  WDYT?

        Stefan

diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index d35ce66350..c471cc64cf 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -2140,50 +2140,9 @@ byte-compile-from-buffer
 	;; Make warnings about unresolved functions
 	;; give the end of the file as their position.
 	(setq byte-compile-last-position (point-max))
-	(byte-compile-warn-about-unresolved-functions))
-      ;; Fix up the header at the front of the output
-      ;; if the buffer contains multibyte characters.
-      (and byte-compile-current-file
-	   (with-current-buffer byte-compile--outbuffer
-	     (byte-compile-fix-header byte-compile-current-file))))
+	(byte-compile-warn-about-unresolved-functions)))
      byte-compile--outbuffer)))
 
-(defun byte-compile-fix-header (_filename)
-  "If the current buffer has any multibyte characters, insert a version test."
-  (when (< (point-max) (position-bytes (point-max)))
-    (goto-char (point-min))
-    ;; Find the comment that describes the version condition.
-    (when (search-forward "\n;;; This file does not contain utf-8" nil t)
-      (narrow-to-region (line-beginning-position) (point-max))
-      ;; Find the first line of ballast semicolons.
-      (search-forward ";;;;;;;;;;")
-      (beginning-of-line)
-      (narrow-to-region (point-min) (point))
-      (let ((old-header-end (point))
-	    (minimum-version "23")
-	    delta)
-        (delete-region (point-min) (point-max))
-        (insert
-         ";;; This file contains utf-8 non-ASCII characters,\n"
-         ";;; and so cannot be loaded into Emacs 22 or earlier.\n"
-         ;; Have to check if emacs-version is bound so that this works
-         ;; in files loaded early in loadup.el.
-         "(and (boundp 'emacs-version)\n"
-         ;; If there is a name at the end of emacs-version,
-         ;; don't try to check the version number.
-         "     (< (aref emacs-version (1- (length emacs-version))) ?A)\n"
-         (format "     (string-lessp emacs-version \"%s\")\n" minimum-version)
-         ;; Because the header must fit in a fixed width, we cannot
-         ;; insert arbitrary-length file names (Bug#11585).
-         "     (error \"`%s' was compiled for "
-         (format "Emacs %s or later\" #$))\n\n" minimum-version))
-        ;; Now compensate for any change in size, to make sure all
-        ;; positions in the file remain valid.
-        (setq delta (- (point-max) old-header-end))
-        (goto-char (point-max))
-        (widen)
-        (delete-char delta)))))
-
 (defun byte-compile-insert-header (_filename outbuffer)
   "Insert a header at the start of OUTBUFFER.
 Call from the source buffer."
@@ -2214,16 +2173,16 @@ byte-compile-insert-header
        ".\n"
        (if dynamic ";;; Function definitions are lazy-loaded.\n"
 	 "")
-       "\n"
-       ;; Note that byte-compile-fix-header may change this.
-       ";;; This file does not contain utf-8 non-ASCII characters,\n"
-       ";;; and so can be loaded in Emacs versions earlier than 23.\n\n"
-       ;; Insert semicolons as ballast, so that byte-compile-fix-header
-       ;; can delete them so as to keep the buffer positions
-       ;; constant for the actual compiled code.
-       ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
-       ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
-       ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n"))))
+       (format "(if (< emacs-major-version %d)\n"
+               ;; Let's allow silently loading into Emacs-27
+               ;; files compiled with Emacs-28.0.NN since the two can
+               ;; be almost identical (e.g. right after cutting the
+               ;; release branch) and people running the development
+               ;; branch can be presumed to know that it's risky anyway.
+               (if (zerop emacs-minor-version)
+                   (1- emacs-major-version) emacs-major-version))
+       (format "    (message \"BEWARE: %%S was compiled by a more recent version of Emacs (%s)\" #$))" emacs-version)
+       "\n\n"))))
 
 (defun byte-compile-output-file-form (form)
   ;; Write the given form to the output buffer, being careful of docstrings