bug#81539: 29.3; text-property-search-backward skips a matching region

Scott Guest <[email protected]> Sun, 2 Aug 2026 21:20:07 -0700
Newsgroups gmane.emacs.bugs
Message-ID <CA+Mt--=mdcGXJbknmQfFDp8CqzzQuhjvgzMYCaYx2ztNcANZ6Q@mail.gmail.com>
`text-property-search-backward' can skip a matching property region when it
is followed by a one-character non-matching region.

Run this command:

  emacs -Q --batch --eval "(progn (require 'text-property-search)
(with-temp-buffer (insert \"zxx-y\") (put-text-property 1 2 'p 'z)
(put-text-property 2 4 'p 'x) (put-text-property 5 6 'p 'y) (goto-char
(point-min)) (message \"forward:  %S\" (text-property-search-forward
'p 'x t)) (goto-char (point-max)) (message \"backward: %S\"
(text-property-search-backward 'p 'x t))))"

The output is:

  forward:  #s(prop-match 2 4 x)
  backward: nil

The backward result should also describe [2,4).  Predicate t means that the
property value must be `equal' to x, and both characters in [2,4) have that
value.  The region is wholly before point, which is at point-max.

The skip occurs in the non-matching branch of
`text-property-search-backward'.  After it examines position 4,
`previous-single-property-change' returns 2, but point remains at 4.  The
next loop iteration repeats the call from position 4 and then examines
position 1, skipping [2,4).

This is distinct from Bug#58937: the matching region here is two characters
wide; it is the following non-matching region that is one character wide.

Reproduced in Emacs 29.3 and in Emacs 32.0.50 master at
1095d63d28fcdfd64a723efaaa4b965e5d846159.