Subject: 29.0.50; assertion failure in diff--iterate-hunks

From: Stephen Berman <[email-masked]>
Date: Tue, 18 Jan 2022 12:02:17 +0100

Trying to view in Gnus an attached and buttonized diff in a certain
article raises an assertion failure.  To reproduce:

0. emacs -Q
1. M-x gnus
2. Type `y' at prompt
3. Type `B RET news.gmane.io RET'
4. Type `C-s gmane.emacs.bugs RET RET'
5. Type `1 RET' at prompt
6. Type `j' and enter `<[email-masked]> RET' at the prompt
7. Click on the Options menu and check "Enter Debugger on Error"
8. Type `2 b'
=>
Debugger entered--Lisp error: (cl-assertion-failed ((looking-at diff-hunk-header-re) nil))
  cl--assertion-failed((looking-at diff-hunk-header-re))
  diff--iterate-hunks(975 #f(compiled-function (beg end) #<bytecode 0x55bd99118e1ddef>))
  diff--font-lock-syntax(975)
  font-lock-fontify-keywords-region(1 975 nil)
  font-lock-default-fontify-region(1 975 nil)
  font-lock-fontify-region(1 975)
  #f(compiled-function (beg end) #<bytecode -0x177a72732a745bc7>)(1 975)
  font-lock-ensure()
  mm-display-inline-fontify((#<buffer  *mm*-927541> ("text/x-diff") nil nil ("attachment" (filename . "ebrowse-emacs-27.2-fix.diff")) nil nil nil) diff-mode)
  mm-display-patch-inline((#<buffer  *mm*-927541> ("text/x-diff") nil nil ("attachment" (filename . "ebrowse-emacs-27.2-fix.diff")) nil nil nil))
  mm-display-inline((#<buffer  *mm*-927541> ("text/x-diff") nil nil ("attachment" (filename . "ebrowse-emacs-27.2-fix.diff")) nil nil nil))
  gnus-mm-display-part((#<buffer  *mm*-927541> ("text/x-diff") nil nil ("attachment" (filename . "ebrowse-emacs-27.2-fix.diff")) nil nil nil))
  gnus-article-view-part(2)
  funcall-interactively(gnus-article-view-part 2)
  call-interactively(gnus-article-view-part nil nil)
  command-execute(gnus-article-view-part)

The assertion fails when point is at the beginning of the last line in
the following excerpt from the diff (in buffer " *temp*")

  *** /var/home/janstranik/src/emacs-27.2/lib-src/ebrowse.c~	2021-01-28 11:52:16.000000000 -0600
  --- /var/home/janstranik/src/emacs-27.2/lib-src/ebrowse.c	2021-09-24 09:31:49.136287028 -0500
  ***************
  *** 1924,1931 ****

This happens because diff-beginning-of-hunk calls re-search-forward on
diff-hunk-header-re, which puts point at the end the line "*** 1924,1931
****" and then calls (forward-line 0), putting point at the beginning of
that line.  But then (looking-at diff-hunk-header-re) returns nil,
raising the assertion in diff--iterate-hunks.  Replacing (forward-line
0) in diff-beginning-of-hunk with (forward-line -1) makes the assertion
succeed.

I'm not sure if this is a bug or if the diff is malformed.  But evidence
that the diff is not malformed is that if the diff in the article is
saved to a file (by typing `2 K o' in the *Summary* buffer), then
visiting that file in diff-mode with -Q does not raise an assertion
failure.

In GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.31, cairo version 1.17.4)
 of 2022-01-18 built on strobelfs2
Repository revision: 68472c12e7acdb6e9f55a10eecf02a4ace26465a
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12101003
System Description: Linux From Scratch r11.0-115

Configured using:
 'configure --with-xwidgets 'CFLAGS=-Og -g3'
 PKG_CONFIG_PATH=/opt/qt5/lib/pkgconfig'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBSYSTEMD LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG
SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM
XPM XWIDGETS GTK3 ZLIB