GNU bug report logs - #46951
CC Mode 5.35.1 (C++/l); c-state-cache inconsistency

Previous Next

Package: cc-mode;

Reported by: Michael Welsh Duggan <md5i <at> md5i.com>

Date: Fri, 5 Mar 2021 21:16:02 UTC

Severity: normal

Done: Alan Mackenzie <acm <at> muc.de>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 46951 in the body.
You can then email your comments to 46951 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-cc-mode <at> gnu.org:
bug#46951; Package cc-mode. (Fri, 05 Mar 2021 21:16:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Michael Welsh Duggan <md5i <at> md5i.com>:
New bug report received and forwarded. Copy sent to bug-cc-mode <at> gnu.org. (Fri, 05 Mar 2021 21:16:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Michael Welsh Duggan <md5i <at> md5i.com>
To: submit <at> debbugs.gnu.org
Subject: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency
Date: Fri, 05 Mar 2021 16:15:20 -0500
[Message part 1 (text/plain, inline)]
Package: cc-mode

I run cc-mode with c parse state debugging turned on.  In the course of
normal usage, I found a file that reliably triggers a cache state
inconsistency.  (This is a courtesy report.  I'm not actually
encountering any bad cc-mode behavior right now.)

Reproducer:

emacs -Q
C-x C-f test.h RET
M-x c-toggle-parse-state-cache RET
M-x what-line
C-v
M-x what-line


The resulting log in *Messages*:

c-debug-parse-state enabled
Line 1
c-parse-state inconsistency at 2465: using cache: (2462 (1208 . 1674)), from scratch: (2462 (1863 . 2060)).  POINT-MIN: 1
Old state:
(setq c-state-cache '(2233 2219 2150 (1863 . 2060))  c-state-cache-good-pos 2151  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 1769)  c-state-old-cpp-end (copy-marker 2432)  c-parse-state-point 2244)
c-parse-state inconsistency at 2524: using cache: (2509 (1208 . 1674)), from scratch: (2509 (1863 . 2060)).  POINT-MIN: 1
Old state:
(setq c-state-cache '(2462 (1208 . 1674))  c-state-cache-good-pos 2433  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 2434)  c-state-old-cpp-end (copy-marker 2482)  c-parse-state-point 2465)
c-parse-state inconsistency at 2600: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)).  POINT-MIN: 1
Old state:
(setq c-state-cache '(2509 (1208 . 1674))  c-state-cache-good-pos 2483  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 2483)  c-state-old-cpp-end (copy-marker 2541)  c-parse-state-point 2524)
c-parse-state inconsistency at 2610: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)).  POINT-MIN: 1
Old state:
(setq c-state-cache '(2592 (1208 . 1674))  c-state-cache-good-pos 2566  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 2543)  c-state-old-cpp-end (copy-marker 2634)  c-parse-state-point 2600)
Line 32

[test.h (text/x-chdr, attachment)]
[Message part 3 (text/plain, inline)]

Emacs  : GNU Emacs 28.0.50 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo version 1.16.0)
 of 2021-03-05
Package: CC Mode 5.35.1 (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 '(t 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 "[ 	]*\\(//+\\|\\**\\)[ 	]*\\([ 	]*\\([-–!|#%;>*·•‣⁃◦]+[ 	]*\\)*\\)"
 )

-- 
Michael Welsh Duggan
(md5i <at> md5i.com)

Information forwarded to bug-cc-mode <at> gnu.org:
bug#46951; Package cc-mode. (Sat, 06 Mar 2021 14:55:01 GMT) Full text and rfc822 format available.

Message #8 received at 46951 <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Michael Welsh Duggan <md5i <at> md5i.com>
Cc: 46951 <at> debbugs.gnu.org
Subject: Re: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency
Date: Sat, 6 Mar 2021 14:54:20 +0000
Hello, Michael.

On Fri, Mar 05, 2021 at 16:15:20 -0500, Michael Welsh Duggan wrote:
> Package: cc-mode

> I run cc-mode with c parse state debugging turned on.  In the course of
> normal usage, I found a file that reliably triggers a cache state
> inconsistency.  (This is a courtesy report.  I'm not actually
> encountering any bad cc-mode behavior right now.)

> Reproducer:

> emacs -Q
> C-x C-f test.h RET
> M-x c-toggle-parse-state-cache RET
> M-x what-line
> C-v
> M-x what-line


> The resulting log in *Messages*:

> c-debug-parse-state enabled
> Line 1
> c-parse-state inconsistency at 2465: using cache: (2462 (1208 . 1674)), from scratch: (2462 (1863 . 2060)).  POINT-MIN: 1
> Old state:
> (setq c-state-cache '(2233 2219 2150 (1863 . 2060))  c-state-cache-good-pos 2151  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 1769)  c-state-old-cpp-end (copy-marker 2432)  c-parse-state-point 2244)
> c-parse-state inconsistency at 2524: using cache: (2509 (1208 . 1674)), from scratch: (2509 (1863 . 2060)).  POINT-MIN: 1
> Old state:
> (setq c-state-cache '(2462 (1208 . 1674))  c-state-cache-good-pos 2433  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 2434)  c-state-old-cpp-end (copy-marker 2482)  c-parse-state-point 2465)
> c-parse-state inconsistency at 2600: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)).  POINT-MIN: 1
> Old state:
> (setq c-state-cache '(2509 (1208 . 1674))  c-state-cache-good-pos 2483  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 2483)  c-state-old-cpp-end (copy-marker 2541)  c-parse-state-point 2524)
> c-parse-state inconsistency at 2610: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)).  POINT-MIN: 1
> Old state:
> (setq c-state-cache '(2592 (1208 . 1674))  c-state-cache-good-pos 2566  c-state-nonlit-pos-cache nil  c-state-nonlit-pos-cache-limit 1  c-state-brace-pair-desert '(1 . 1208)  c-state-point-min 1  c-state-point-min-lit-type nil  c-state-point-min-lit-start nil  c-state-min-scan-pos 1  c-state-old-cpp-beg (copy-marker 2543)  c-state-old-cpp-end (copy-marker 2634)  c-parse-state-point 2600)
> Line 32

Indeed, yes.  Thanks for the report.

The following patch (which applies cleanly to the Emacs master branch)
should fix the bug.  I will be applying it to the master branch this
afternoon.  Please feel free to test it, but if I don't hear from you,
I'll assume the bug can be closed.

Thanks again!



diff -r d6f1f920c51c cc-engine.el
--- a/cc-engine.el	Wed Mar 03 11:44:18 2021 +0000
+++ b/cc-engine.el	Sat Mar 06 14:50:58 2021 +0000
@@ -3801,12 +3801,14 @@
 		     (point)))
 	     (bra			; Position of "{".
 	      ;; Don't start scanning in the middle of a CPP construct unless
-	      ;; it contains HERE - these constructs, in Emacs, are "commented
-	      ;; out" with category properties.
-	      (if (eq (c-get-char-property macro-start-or-from 'category)
-			'c-cpp-delimiter)
-		    macro-start-or-from
-		  from))
+	      ;; it contains HERE.
+	      (if (and (not (eq macro-start-or-from from))
+		       (< macro-start-or-from here) ; Might not be needed.
+		       (progn (goto-char macro-start-or-from)
+			      (c-end-of-macro)
+			      (>= (point) here)))
+		  from
+		macro-start-or-from))
 	     ce)			; Position of "}"
 	(or upper-lim (setq upper-lim from))
 




[ .... ]

> -- 
> Michael Welsh Duggan
> (md5i <at> md5i.com)

-- 
Alan Mackenzie (Nuremberg, Germany).




Information forwarded to bug-cc-mode <at> gnu.org:
bug#46951; Package cc-mode. (Sat, 06 Mar 2021 16:08:01 GMT) Full text and rfc822 format available.

Message #11 received at 46951 <at> debbugs.gnu.org (full text, mbox):

From: Michael Welsh Duggan <mwd <at> md5i.com>
To: Alan Mackenzie <acm <at> muc.de>
Cc: 46951 <at> debbugs.gnu.org
Subject: Re: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency
Date: Sat, 06 Mar 2021 11:07:25 -0500
Alan Mackenzie <acm <at> muc.de> writes:

> The following patch (which applies cleanly to the Emacs master branch)
> should fix the bug.  I will be applying it to the master branch this
> afternoon.  Please feel free to test it, but if I don't hear from you,
> I'll assume the bug can be closed.

I can confirm that this fixes this case.

-- 
Michael Welsh Duggan
(md5i <at> md5i.com)




Reply sent to Alan Mackenzie <acm <at> muc.de>:
You have taken responsibility. (Sat, 06 Mar 2021 16:54:02 GMT) Full text and rfc822 format available.

Notification sent to Michael Welsh Duggan <md5i <at> md5i.com>:
bug acknowledged by developer. (Sat, 06 Mar 2021 16:54:02 GMT) Full text and rfc822 format available.

Message #16 received at 46951-done <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Michael Welsh Duggan <mwd <at> md5i.com>
Cc: 46951-done <at> debbugs.gnu.org
Subject: Re: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency
Date: Sat, 6 Mar 2021 16:53:25 +0000
Hello, Michael.

On Sat, Mar 06, 2021 at 11:07:25 -0500, Michael Welsh Duggan wrote:
> Alan Mackenzie <acm <at> muc.de> writes:

> > The following patch (which applies cleanly to the Emacs master branch)
> > should fix the bug.  I will be applying it to the master branch this
> > afternoon.  Please feel free to test it, but if I don't hear from you,
> > I'll assume the bug can be closed.

> I can confirm that this fixes this case.

That's great, thanks very much!

I'm closing the bug with this post.

> -- 
> Michael Welsh Duggan
> (md5i <at> md5i.com)

-- 
Alan Mackenzie (Nuremberg, Germany).




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sun, 04 Apr 2021 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 4 years and 74 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.