Package: cc-mode

(From "emacs -Q".) In an empty C++ buffer, type [#include SPC <ab> C-p
BACKSPACE C-e RET], or (for a more realistic example), correct
"#include <asio/asio.hpp>" to "#include <asio.hpp>" like this:

 ...asio.hpp             ;; self-insert-command
 >                       ;; c-electric-lt-gt
 M-b                     ;; backward-word
 M-b                     ;; backward-word
 <C-backspace>           ;; backward-kill-word
 M->                     ;; end-of-buffer
 <return>                ;; newline

The new line is indented one level (expected zero levels). This
corrects itself after doing M-x normal mode.

Reproduced below is the story so far, which comes after a discussion
of unrelated matters at bug#36397.

On Tue, 23 Jul 2019 at 14:10, Alan Mackenzie <acm@muc.de> wrote:

    On Mon, Jul 22, 2019 at 20:47:22 +0100, Richard Copley wrote:

    [ .... ]

    This was an error in the macro cache handling.  After the deletion
    of the >, the cache failed to adjust its upper bound downwards by
    one.  Thus the cache was still representing that the beginning of
    the new line was inside the macro bounds.

    The following patch should fix this.  Would you please do the
    usual with it.

    Just as a matter of interest, how on earth did you manage to
    stumble across the key sequence (above) which triggers this bug?

(The patch, by Alan, is elided by Richard in this email opening the bug report.)

Emacs  : GNU Emacs 27.0.50 (build 1, x86_64-w64-mingw32)
 of 2019-07-23
Package: CC Mode 5.34 (C/*l)
Buffer Style: gnu
c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties 1-bit)

current state:
==============
(setq
 c-basic-offset 2
 c-comment-only-line-offset '(0 . 0)
 c-indent-comment-alist '((anchored-comment column . 0) (end-block space . 1)
 (cpp-end-block space . 2))
 c-indent-comments-syntactically-p nil
 c-block-comment-prefix ""
 c-comment-prefix-regexp '((pike-mode . "//+!?\\|\\**") (awk-mode . "#+")
  (other . "//+\\|\\**"))
 c-doc-comment-style '((java-mode . javadoc) (pike-mode . autodoc)
      (c-mode . gtkdoc) (c++-mode . gtkdoc))
 c-cleanup-list '(scope-operator)
 c-hanging-braces-alist '((substatement-open before after)
 (arglist-cont-nonempty))
 c-hanging-colons-alist nil
 c-hanging-semi&comma-criteria '(c-semi&comma-inside-parenlist)
 c-backslash-column 48
 c-backslash-max-column 72
 c-special-indent-hook '(c-gnu-impose-minimum)
 c-label-minimum-indentation 1
 c-offsets-alist '((inexpr-class . +)
  (inexpr-statement . +)
  (lambda-intro-cont . +)
  (inlambda . 0)
  (template-args-cont c-lineup-template-args +)
  (incomposition . +)
  (inmodule . +)
  (innamespace . +)
  (inextern-lang . +)
  (composition-close . 0)
  (module-close . 0)
  (namespace-close . 0)
  (extern-lang-close . 0)
  (composition-open . 0)
  (module-open . 0)
  (namespace-open . 0)
  (extern-lang-open . 0)
  (objc-method-call-cont
   c-lineup-ObjC-method-call-colons
   c-lineup-ObjC-method-call
   +
   )
  (objc-method-args-cont . c-lineup-ObjC-method-args)
  (objc-method-intro . [0])
  (friend . 0)
  (cpp-define-intro c-lineup-cpp-define +)
  (cpp-macro-cont . +)
  (cpp-macro . [0])
  (inclass . +)
  (stream-op . c-lineup-streamop)
  (arglist-cont-nonempty
   c-lineup-gcc-asm-reg
   c-lineup-arglist
   )
  (arglist-cont c-lineup-gcc-asm-reg 0)
  (comment-intro
   c-lineup-knr-region-comment
   c-lineup-comment
   )
  (catch-clause . 0)
  (else-clause . 0)
  (do-while-closure . 0)
  (access-label . -)
  (case-label . 0)
  (substatement . +)
  (statement-case-intro . +)
  (statement . 0)
  (brace-entry-open . 0)
  (brace-list-entry . 0)
  (brace-list-close . 0)
  (block-close . 0)
  (block-open . 0)
  (inher-cont . c-lineup-multi-inher)
  (inher-intro . +)
  (member-init-cont . c-lineup-multi-inher)
  (member-init-intro . +)
  (annotation-var-cont . +)
  (annotation-top-cont . 0)
  (topmost-intro . 0)
  (knr-argdecl . 0)
  (func-decl-cont . +)
  (inline-close . 0)
  (class-close . 0)
  (class-open . 0)
  (defun-block-intro . +)
  (defun-close . 0)
  (defun-open . 0)
  (c . c-lineup-C-comments)
  (string . c-lineup-dont-change)
  (topmost-intro-cont
   first
   c-lineup-topmost-intro-cont
   c-lineup-gnu-DEFUN-intro-cont
   )
  (brace-list-intro
   first
   c-lineup-2nd-brace-entry-in-arglist
   c-lineup-class-decl-init-+
   +
   )
  (brace-list-open . +)
  (inline-open . 0)
  (arglist-close . c-lineup-arglist)
  (arglist-intro . c-lineup-arglist-intro-after-paren)
  (statement-cont . +)
  (statement-case-open . +)
  (label . 0)
  (substatement-label . 0)
  (substatement-open . +)
  (knr-argdecl-intro . 5)
  (statement-block-intro . +)
  )
 c-buffer-is-cc-mode 'c-mode
 c-tab-always-indent t
 c-syntactic-indentation t
 c-syntactic-indentation-in-macros t
 c-ignore-auto-fill '(string cpp code)
 c-auto-align-backslashes t
 c-backspace-function 'backward-delete-char-untabify
 c-delete-function 'delete-char
 c-electric-pound-behavior nil
 c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "gnu"))
 c-enable-xemacs-performance-kludge-p nil
 c-old-style-variable-behavior nil
 defun-prompt-regexp nil
 tab-width 8
 comment-column 32
 parse-sexp-ignore-comments t
 parse-sexp-lookup-properties t
 auto-fill-function nil
 comment-multi-line t
 comment-start-skip "\\(//+\\|/\\*+\\)\\s *"
 fill-prefix nil
 fill-column 70
 paragraph-start "[ ]*\\(//+\\|\\**\\)[ ]*$\\|^\f"
 adaptive-fill-mode t
 adaptive-fill-regexp "[ ]*\\(//+\\|\\**\\)[ ]*\\([ ]*\\([-–!|#%;>*·•‣⁃◦]+[ ]*\\)*\\)"
 )