* bug#45375: cc-mode indentation sometimes doesn't work @ 2020-12-22 23:02 Herman, Géza 2021-02-12 21:17 ` Basil L. Contovounesios 0 siblings, 1 reply; 6+ messages in thread From: Herman, Géza @ 2020-12-22 23:02 UTC (permalink / raw) To: 45375 On current master (6af31fd71ff1a403c199c479577bcc145a547db1) indentation of C/C++ files sometimes doesn't work. I've bisected it: commit "9022df7027 Optimise c-parse-state for large buffers with few (if any) braces." introduced this behavior. This is how to reproduce: check out 9022df70270243f211c54ccd66800320148b8434, and execute "emacs -Q xdisp.c". Jump to line 2989 with M-g M-g 2989, move the cursor to the end of line of "Lisp_Object retval;", and press enter. The cursor will be moved to the correct place (correctly indented, cursor will be placed below the 'L' character of the previous line). Then push enter at end of line of "va_list ap;". For me, cursor will jump to the beginning of the line, it won't be indented. If I keep pressing enters, the next failure will be at "va_end (ap);". I'm not sure whether this exact steps reproduces for everyone, but it happened me 5 of 5 trials. If I don't press enter at the first line ("Lisp_Object retval;"), the problem doesn't happen for any of this function lines. But it will happen for somewhere else, if I keep trying (move around the file, press enter at random places: if will fail sooner or later). For my configuration (without -Q), this problem happens quite frequently during editing C++ code. ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#45375: cc-mode indentation sometimes doesn't work 2020-12-22 23:02 bug#45375: cc-mode indentation sometimes doesn't work Herman, Géza @ 2021-02-12 21:17 ` Basil L. Contovounesios 2021-02-13 14:39 ` bug#46400: " Alan Mackenzie 0 siblings, 1 reply; 6+ messages in thread From: Basil L. Contovounesios @ 2021-02-12 21:17 UTC (permalink / raw) To: Géza Herman; +Cc: Alan Mackenzie, 45375 reassign 45375 emacs,cc-mode quit [CCed CC Mode maintainer.] Herman@debbugs.gnu.org, Géza <geza.herman@gmail.com> writes: > On current master (6af31fd71ff1a403c199c479577bcc145a547db1) indentation of > C/C++ files sometimes doesn't work. I've bisected it: commit "9022df7027 > Optimise c-parse-state for large buffers with few (if any) braces." introduced > this behavior. > > This is how to reproduce: check out 9022df70270243f211c54ccd66800320148b8434, > and execute "emacs -Q xdisp.c". Jump to line 2989 with M-g M-g 2989, move the > cursor to the end of line of "Lisp_Object retval;", and press enter. The cursor > will be moved to the correct place (correctly indented, cursor will be placed > below the 'L' character of the previous line). Then push enter at end of line of > "va_list ap;". For me, cursor will jump to the beginning of the line, it won't > be indented. If I keep pressing enters, the next failure will be at "va_end > (ap);". I'm not sure whether this exact steps reproduces for everyone, but it > happened me 5 of 5 trials. If I don't press enter at the first line > ("Lisp_Object retval;"), the problem doesn't happen for any of this function > lines. But it will happen for somewhere else, if I keep trying (move around the > file, press enter at random places: if will fail sooner or later). > > For my configuration (without -Q), this problem happens quite frequently during > editing C++ code. I tried following your recipe (the lines in xdisp.c have since moved around a bit), but was unable to reproduce the issue. Can you still reproduce it on your end? Thanks, -- Basil ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#46400: bug#45375: cc-mode indentation sometimes doesn't work 2021-02-12 21:17 ` Basil L. Contovounesios @ 2021-02-13 14:39 ` Alan Mackenzie 2021-02-13 18:43 ` Herman, Géza 0 siblings, 1 reply; 6+ messages in thread From: Alan Mackenzie @ 2021-02-13 14:39 UTC (permalink / raw) To: Basil L. Contovounesios; +Cc: acm, 46400, Géza Herman, 45375 Hello, Basil, Géza and Konstantin. Sorry I missed this bug report in December, and thanks, Basil, for drawing it to my attention. On Fri, Feb 12, 2021 at 21:17:56 +0000, Basil L. Contovounesios wrote: > reassign 45375 emacs,cc-mode > quit > [CCed CC Mode maintainer.] > Herman@debbugs.gnu.org, Géza <geza.herman@gmail.com> writes: > > On current master (6af31fd71ff1a403c199c479577bcc145a547db1) indentation of > > C/C++ files sometimes doesn't work. I've bisected it: commit "9022df7027 > > Optimise c-parse-state for large buffers with few (if any) braces." introduced > > this behavior. > > This is how to reproduce: check out 9022df70270243f211c54ccd66800320148b8434, > > and execute "emacs -Q xdisp.c". Jump to line 2989 with M-g M-g 2989, move the > > cursor to the end of line of "Lisp_Object retval;", and press enter. The cursor > > will be moved to the correct place (correctly indented, cursor will be placed > > below the 'L' character of the previous line). Then push enter at end of line of > > "va_list ap;". For me, cursor will jump to the beginning of the line, it won't > > be indented. If I keep pressing enters, the next failure will be at "va_end > > (ap);". I'm not sure whether this exact steps reproduces for everyone, but it > > happened me 5 of 5 trials. If I don't press enter at the first line > > ("Lisp_Object retval;"), the problem doesn't happen for any of this function > > lines. But it will happen for somewhere else, if I keep trying (move around the > > file, press enter at random places: if will fail sooner or later). > > For my configuration (without -Q), this problem happens quite frequently during > > editing C++ code. > I tried following your recipe (the lines in xdisp.c have since moved > around a bit), but was unable to reproduce the issue. > Can you still reproduce it on your end? I can reproduce it easily on the indicated commit, and I have found where the problem is. It's in the handling of the c-state-cache (the cache which tracks the positions of certain braces/brackets/parentheses). Fixing it could be quite tricky, particularly given the need to retain optimisation for the case that the above commit "fixed". I am fairly, but not absolutely, sure that this is the same bug as 46400, but the bug scenario here is easier to reproduce than the other one, so I will concentrate on this bug first. Maybe we can join the bug reports later. > Thanks, > -- > Basil -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#46400: bug#45375: cc-mode indentation sometimes doesn't work 2021-02-13 14:39 ` bug#46400: " Alan Mackenzie @ 2021-02-13 18:43 ` Herman, Géza 2021-02-14 11:11 ` Alan Mackenzie 0 siblings, 1 reply; 6+ messages in thread From: Herman, Géza @ 2021-02-13 18:43 UTC (permalink / raw) To: Alan Mackenzie, Basil L. Contovounesios; +Cc: 46400, 45375 Hi all, >> Can you still reproduce it on your end? > I'm using a ~3-week-old native-comp branch, this bug (#45375) doesn't happen anymore for me. Note that the bisect gave a different commit for #46400, so maybe the issues are different, even though the symptoms are very similar (same?). Thank you for looking at this! Geza ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#45375: cc-mode indentation sometimes doesn't work 2021-02-13 18:43 ` Herman, Géza @ 2021-02-14 11:11 ` Alan Mackenzie 2021-02-23 11:32 ` bug#46400: " Alan Mackenzie 0 siblings, 1 reply; 6+ messages in thread From: Alan Mackenzie @ 2021-02-14 11:11 UTC (permalink / raw) To: Herman, Géza; +Cc: Basil L. Contovounesios, 46400, 45375 Hello, Géza. On Sat, Feb 13, 2021 at 19:43:31 +0100, Herman, Géza wrote: > Hi all, > >> Can you still reproduce it on your end? > I'm using a ~3-week-old native-comp branch, this bug (#45375) doesn't > happen anymore for me. The bug was caused by an error in the handling of a cache (the "c-state-cache" which tracks the position of certain braces/brackets/parenthese). I can assure you the error is still there, even if it isn't currently triggering very often. > Note that the bisect gave a different commit for #46400, so maybe the > issues are different, even though the symptoms are very similar (same?). In bug #46400, I think Konstantin's bisecting threw up the wrong commit, since cache bugs tend to be very slippery to pin down. > Thank you for looking at this! A pleasure! I intend to commit the patch below in a few days time, if I don't hear back from anybody that it's giving trouble. This patch fixes the bug when applied to that commit from December (9022df70270243f211c54ccd66800320148b8434). It should apply cleanly to master. > Geza Hello, Konstantin. >> I don't think the bug was introduced by the commit you cite, more >> likely that commit triggered the bug which was lying in wait elsewhere. >> I've been working on this bug for several hours, so far, and have found >> that the "c-state-cache" (which records the positions of certain >> braces, brackets and parentheses) becomes corrupt while running your >> `test' function. I'm trying to track down where and how this >> corruption happens. >> Also relevant is that the bug seems to be being triggered by the >> apostrophe in >> bar("Couldn't open %s", to); >> ^ >> .. At least, if I take that apostrophe away, I don't see the bug >> symptoms any more. Actually, I was mistaken on this front - the apostrophe had nothing to do with it. >> So, please bear with me some while longer. I am working on the bug. > D: Oh, this is cool! Sure, thank you very much for looking into it! I'm > definitely not in hurry, I was just kinda being afraid that the report > could've gotten through the cracks. I'm happy to hear that wasn't the > case � It was indeed a bug in the c-state-cache handling, and I now have a patch to fix it. After applying the patch, the `test' function no longer produces a newline without indentation. There is something complicated going on with `undo', so that `test' sometimes reports there is no more undo data, but the indentation left on new lines is always correct. As I said above, I intend to commit the patch below in a few days time. Please feel free to apply it (to master) and test it out. I would be happy to hear of anything to do with this bug which is still not working. diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 68dadcc272..653c4332b6 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -4314,38 +4314,29 @@ c-invalidate-state-cache-1 (setq c-state-nonlit-pos-cache-limit (1- here))) (c-truncate-lit-pos-cache here) - ;; `c-state-cache': - ;; Case 1: if `here' is in a literal containing point-min, everything - ;; becomes (or is already) nil. - (if (or (null c-state-cache-good-pos) - (< here (c-state-get-min-scan-pos))) - (setq c-state-cache nil - c-state-cache-good-pos nil - c-state-min-scan-pos nil) - - ;; Truncate `c-state-cache' and set `c-state-cache-good-pos' to a value - ;; below `here'. To maintain its consistency, we may need to insert a new - ;; brace pair. - (let ((here-bol (c-point 'bol here)) - too-high-pa ; recorded {/(/[ next above or just below here, or nil. - dropped-cons) ; was the last removed element a brace pair? - ;; The easy bit - knock over-the-top bits off `c-state-cache'. - (while (and c-state-cache - (>= (c-state-cache-top-paren) here)) - (setq dropped-cons (consp (car c-state-cache)) - too-high-pa (c-state-cache-top-lparen) - c-state-cache (cdr c-state-cache))) - - ;; Do we need to add in an earlier brace pair, having lopped one off? - (if (and dropped-cons - (<= too-high-pa here)) - (c-append-lower-brace-pair-to-state-cache too-high-pa here here-bol)) - (if (and c-state-cache-good-pos (< here c-state-cache-good-pos)) - (setq c-state-cache-good-pos - (or (save-excursion - (goto-char here) - (c-literal-start)) - here))))) + (cond + ;; `c-state-cache': + ;; Case 1: if `here' is in a literal containing point-min, everything + ;; becomes (or is already) nil. + ((or (null c-state-cache-good-pos) + (< here (c-state-get-min-scan-pos))) + (setq c-state-cache nil + c-state-cache-good-pos nil + c-state-min-scan-pos nil)) + + ;; Case 2: `here' is below `c-state-cache-good-pos', so we need to amend + ;; the entire `c-state-cache' data. + ((< here c-state-cache-good-pos) + (let* ((res (c-remove-stale-state-cache-backwards here)) + (good-pos (car res)) + (scan-backward-pos (cadr res)) + (scan-forward-p (car (cddr res)))) + (if scan-backward-pos + (c-append-lower-brace-pair-to-state-cache scan-backward-pos here)) + (setq c-state-cache-good-pos + (if scan-forward-p + (c-append-to-state-cache good-pos here) + good-pos))))) ;; The brace-pair desert marker: (when (car c-state-brace-pair-desert) -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply related [flat|nested] 6+ messages in thread
* bug#46400: bug#45375: cc-mode indentation sometimes doesn't work 2021-02-14 11:11 ` Alan Mackenzie @ 2021-02-23 11:32 ` Alan Mackenzie 0 siblings, 0 replies; 6+ messages in thread From: Alan Mackenzie @ 2021-02-23 11:32 UTC (permalink / raw) To: Herman, Géza; +Cc: Basil L. Contovounesios, 45375-done, 46400-done Hello, Géza. On Sun, Feb 14, 2021 at 11:11:28 +0000, Alan Mackenzie wrote: > On Sat, Feb 13, 2021 at 19:43:31 +0100, Herman, Géza wrote: [ .... ] > In bug #46400, I think Konstantin's bisecting threw up the wrong commit, > since cache bugs tend to be very slippery to pin down. > > Thank you for looking at this! > A pleasure! I intend to commit the patch below in a few days time, if I > don't hear back from anybody that it's giving trouble. This patch fixes > the bug when applied to that commit from December > (9022df70270243f211c54ccd66800320148b8434). It should apply cleanly to > master. I have now applied the patch to all the relevant places, and I am closing the bugs with this post. [ .... ] > > Geza -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-02-23 11:32 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-12-22 23:02 bug#45375: cc-mode indentation sometimes doesn't work Herman, Géza 2021-02-12 21:17 ` Basil L. Contovounesios 2021-02-13 14:39 ` bug#46400: " Alan Mackenzie 2021-02-13 18:43 ` Herman, Géza 2021-02-14 11:11 ` Alan Mackenzie 2021-02-23 11:32 ` bug#46400: " Alan Mackenzie
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).