unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
@ 2022-07-30 13:05 Alan Mackenzie
  2022-07-30 14:14 ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Alan Mackenzie @ 2022-07-30 13:05 UTC (permalink / raw)
  To: 56841; +Cc: Bill Sacks

Hello, Emacs.

This is (a version of) a bug reported by Bill Sacks <sacks@ucar.edu> in
the correspondence for bug #56818.  I am separating it from that bug,
since it is a distinct bug, despite having similar symptoms.  In
Emacs-28:

1. Start emacs -Q.
2. Insert the following file in C Mode:

void myfunc(

  ) {

}

3. In line 2 (the first blank line) type "<TAB>int somevar".
4. Note that somevar is not fontified.  This is a bug, given that the
  arglist to myfunc is terminated with a ) on line 3.
5. Do something (e.g. typing M-x) to cause a redisplay.  somevar gets
  its correct face.
6. Note that any insertion or deletion in L2 causes somevar to lose its
  fontification.  This is a bug.
7. (After 6).  Move point onto somevar and do C-u C-x =.  This shows
  that the face text property is set on the character despite the face
  not appearing on the screen.

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-07-30 13:05 bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line Alan Mackenzie
@ 2022-07-30 14:14 ` Eli Zaretskii
  2022-07-30 14:27   ` Alan Mackenzie
  2022-08-02 19:30   ` Alan Mackenzie
  0 siblings, 2 replies; 9+ messages in thread
From: Eli Zaretskii @ 2022-07-30 14:14 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 56841, sacks

> Cc: Bill Sacks <sacks@ucar.edu>
> Date: Sat, 30 Jul 2022 13:05:24 +0000
> From: Alan Mackenzie <acm@muc.de>
> 
> 1. Start emacs -Q.
> 2. Insert the following file in C Mode:
> 
> void myfunc(
> 
>   ) {
> 
> }
> 
> 3. In line 2 (the first blank line) type "<TAB>int somevar".
> 4. Note that somevar is not fontified.  This is a bug, given that the
>   arglist to myfunc is terminated with a ) on line 3.
> 5. Do something (e.g. typing M-x) to cause a redisplay.  somevar gets
>   its correct face.
> 6. Note that any insertion or deletion in L2 causes somevar to lose its
>   fontification.  This is a bug.
> 7. (After 6).  Move point onto somevar and do C-u C-x =.  This shows
>   that the face text property is set on the character despite the face
>   not appearing on the screen.

Are you saying this is not a bug in CC mode but somewhere else?  Or
are you saying that you don't yet know what is the culprit and will
investigate?





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-07-30 14:14 ` Eli Zaretskii
@ 2022-07-30 14:27   ` Alan Mackenzie
  2022-07-30 15:10     ` Eli Zaretskii
  2022-08-02 19:30   ` Alan Mackenzie
  1 sibling, 1 reply; 9+ messages in thread
From: Alan Mackenzie @ 2022-07-30 14:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 56841, sacks, acm

Hello, Eli.

On Sat, Jul 30, 2022 at 17:14:43 +0300, Eli Zaretskii wrote:
> > Cc: Bill Sacks <sacks@ucar.edu>
> > Date: Sat, 30 Jul 2022 13:05:24 +0000
> > From: Alan Mackenzie <acm@muc.de>

> > 1. Start emacs -Q.
> > 2. Insert the following file in C Mode:

> > void myfunc(

> >   ) {

> > }

> > 3. In line 2 (the first blank line) type "<TAB>int somevar".
> > 4. Note that somevar is not fontified.  This is a bug, given that the
> >   arglist to myfunc is terminated with a ) on line 3.
> > 5. Do something (e.g. typing M-x) to cause a redisplay.  somevar gets
> >   its correct face.
> > 6. Note that any insertion or deletion in L2 causes somevar to lose its
> >   fontification.  This is a bug.
> > 7. (After 6).  Move point onto somevar and do C-u C-x =.  This shows
> >   that the face text property is set on the character despite the face
> >   not appearing on the screen.

> Are you saying this is not a bug in CC mode but somewhere else?  Or
> are you saying that you don't yet know what is the culprit and will
> investigate?

It is most definitely a bug in CC Mode, and I'm looking at it at the
moment.

My feeling right now is that the fix will be too involved to go into the
release branch.

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-07-30 14:27   ` Alan Mackenzie
@ 2022-07-30 15:10     ` Eli Zaretskii
  2022-07-31 15:48       ` Alan Mackenzie
  0 siblings, 1 reply; 9+ messages in thread
From: Eli Zaretskii @ 2022-07-30 15:10 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 56841, sacks

> Date: Sat, 30 Jul 2022 14:27:53 +0000
> Cc: 56841@debbugs.gnu.org, sacks@ucar.edu, acm@muc.de
> From: Alan Mackenzie <acm@muc.de>
> 
> > Are you saying this is not a bug in CC mode but somewhere else?  Or
> > are you saying that you don't yet know what is the culprit and will
> > investigate?
> 
> It is most definitely a bug in CC Mode, and I'm looking at it at the
> moment.

Thanks.

> My feeling right now is that the fix will be too involved to go into the
> release branch.

Let's talk when you have a fix.  But generally, this doesn't sound
like a too grave problem to me, especially since there's an easy way
of asking Emacs to fontify correctly.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-07-30 15:10     ` Eli Zaretskii
@ 2022-07-31 15:48       ` Alan Mackenzie
  2022-07-31 15:53         ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Alan Mackenzie @ 2022-07-31 15:48 UTC (permalink / raw)
  To: Eli Zaretskii, sacks; +Cc: 56841, acm

Hello, Eli and Bill.

On Sat, Jul 30, 2022 at 18:10:12 +0300, Eli Zaretskii wrote:
> > Date: Sat, 30 Jul 2022 14:27:53 +0000
> > Cc: 56841@debbugs.gnu.org, sacks@ucar.edu, acm@muc.de
> > From: Alan Mackenzie <acm@muc.de>

> > > Are you saying this is not a bug in CC mode but somewhere else?  Or
> > > are you saying that you don't yet know what is the culprit and will
> > > investigate?

> > It is most definitely a bug in CC Mode, and I'm looking at it at the
> > moment.

> Thanks.

> > My feeling right now is that the fix will be too involved to go into the
> > release branch.

> Let's talk when you have a fix.  But generally, this doesn't sound
> like a too grave problem to me, especially since there's an easy way
> of asking Emacs to fontify correctly.

Here's a proposed version of the fix, which seems to work.  The diff is
probably best perused with diff -b.  The patch will apply to both the master
branch and Emacs-28.1.


CC Mode: Fontify args correctly when arglist closing ) is not on the same line

This should fix bug #56841.

* lisp/progmodes/cc-engine.el (c-forward-declarator): Fix an off-by-one
comparing the position after a c-forward-name with a limit.

* lisp/progmodes/cc-mode.el (c-fl-decl-end): Handle correctly point starting
inside a literal.  Insert a missing c-backward-syntactic-ws in the handling of
C++ attributes.  Better handle point starting inside a [ or (.  Tidy up the
handling of syntactic whitespace at the end of the buffer.



diff -r e4e62074b8a6 cc-engine.el
--- a/cc-engine.el	Sat Jul 30 09:15:53 2022 +0000
+++ b/cc-engine.el	Sun Jul 31 15:39:26 2022 +0000
@@ -9576,7 +9576,7 @@
 	 (or (= paren-depth 0)
 	     (c-safe (goto-char (scan-lists (point) 1 paren-depth))))
 
-	 (<= (point) limit)
+	 (< (point) limit)
 
 	 ;; Skip over any trailing bit, such as "__attribute__".
 	 (progn
diff -r e4e62074b8a6 cc-mode.el
--- a/cc-mode.el	Sat Jul 30 09:15:53 2022 +0000
+++ b/cc-mode.el	Sun Jul 31 15:39:26 2022 +0000
@@ -2412,49 +2412,59 @@
       (and (/= new-pos pos) new-pos))))
 
 (defun c-fl-decl-end (pos)
-  ;; If POS is inside a declarator, return the end of the token that follows
-  ;; the declarator, otherwise return nil.  POS being in a literal does not
-  ;; count as being in a declarator (on pragmatic grounds).  POINT is not
-  ;; preserved.
+  ;; If POS is inside a declarator, return the end of the paren pair that
+  ;; terminates it, or the token that follows the declarator, otherwise return
+  ;; nil.  If there is no such token, the end of the last token in the buffer
+  ;; is used.  POS being in a literal is now (2022-07) handled correctly.
+  ;; POINT is not preserved.
   (goto-char pos)
   (let ((lit-start (c-literal-start))
 	(lim (c-determine-limit 1000))
 	enclosing-attribute pos1)
-    (unless lit-start
-      (c-backward-syntactic-ws
-       lim)
-      (when (setq enclosing-attribute (c-enclosing-c++-attribute))
-	(goto-char (car enclosing-attribute))) ; Only happens in C++ Mode.
-      (when (setq pos1 (c-on-identifier))
-	(goto-char pos1)
-	(let ((lim (save-excursion
-		     (and (c-beginning-of-macro)
-			  (progn (c-end-of-macro) (point))))))
-	  (and (c-forward-declarator lim)
-	       (if (eq (char-after) ?\()
-		   (and
-		    (c-go-list-forward nil lim)
-		    (progn (c-forward-syntactic-ws lim)
-			   (not (eobp)))
-		    (progn
-		      (if (looking-at c-symbol-char-key)
-			  ;; Deal with baz (foo((bar)) type var), where
-			  ;; foo((bar)) is not semantically valid.  The result
-			  ;; must be after var).
-			  (and
-			   (goto-char pos)
-			   (setq pos1 (c-on-identifier))
-			   (goto-char pos1)
-			   (progn
-			     (c-backward-syntactic-ws lim)
-			     (eq (char-before) ?\())
-			   (c-fl-decl-end (1- (point))))
-			(c-backward-syntactic-ws lim)
-			(point))))
-		 (and (progn (c-forward-syntactic-ws lim)
-			     (not (eobp)))
+    (if lit-start
+	(goto-char lit-start))
+    (c-backward-syntactic-ws lim)
+    (when (setq enclosing-attribute (c-enclosing-c++-attribute))
+      (goto-char (car enclosing-attribute)) ; Only happens in C++ Mode.
+      (c-backward-syntactic-ws lim))
+    (while (and (> (point) lim)
+		(memq (char-before) '(?\[ ?\()))
+      (backward-char)
+      (c-backward-syntactic-ws lim))
+    (when (setq pos1 (c-on-identifier))
+      (goto-char pos1)
+      (let ((lim (save-excursion
+		   (and (c-beginning-of-macro)
+			(progn (c-end-of-macro) (point))))))
+	(and (c-forward-declarator lim)
+	     (if (eq (char-after) ?\()
+		 (and
+		  (c-go-list-forward nil lim)
+		  (progn (c-forward-syntactic-ws lim)
+			 (not (eobp)))
+		  (progn
+		    (if (looking-at c-symbol-char-key)
+			;; Deal with baz (foo((bar)) type var), where
+			;; foo((bar)) is not semantically valid.  The result
+			;; must be after var).
+			(and
+			 (goto-char pos)
+			 (setq pos1 (c-on-identifier))
+			 (goto-char pos1)
+			 (progn
+			   (c-backward-syntactic-ws lim)
+			   (eq (char-before) ?\())
+			 (c-fl-decl-end (1- (point))))
 		      (c-backward-syntactic-ws lim)
-		      (point)))))))))
+		      (point))))
+	       (if (progn (c-forward-syntactic-ws lim)
+			  (not (eobp)))
+		   (c-forward-over-token)
+		 (let ((lit-start (c-literal-start)))
+		   (when lit-start
+		       (goto-char lit-start))
+		   (c-backward-syntactic-ws)))
+	       (and (>= (point) pos) (point))))))))
 
 (defun c-change-expand-fl-region (_beg _end _old-len)
   ;; Expand the region (c-new-BEG c-new-END) to an after-change font-lock


-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-07-31 15:48       ` Alan Mackenzie
@ 2022-07-31 15:53         ` Eli Zaretskii
  0 siblings, 0 replies; 9+ messages in thread
From: Eli Zaretskii @ 2022-07-31 15:53 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 56841, sacks, acm

> Date: Sun, 31 Jul 2022 15:48:56 +0000
> Cc: 56841@debbugs.gnu.org, acm@muc.de
> From: Alan Mackenzie <acm@muc.de>
> 
> > Let's talk when you have a fix.  But generally, this doesn't sound
> > like a too grave problem to me, especially since there's an easy way
> > of asking Emacs to fontify correctly.
> 
> Here's a proposed version of the fix, which seems to work.  The diff is
> probably best perused with diff -b.  The patch will apply to both the master
> branch and Emacs-28.1.

Thanks.  I guess this should go to master.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-07-30 14:14 ` Eli Zaretskii
  2022-07-30 14:27   ` Alan Mackenzie
@ 2022-08-02 19:30   ` Alan Mackenzie
  2022-08-22 16:08     ` Bill Sacks
  1 sibling, 1 reply; 9+ messages in thread
From: Alan Mackenzie @ 2022-08-02 19:30 UTC (permalink / raw)
  To: sacks; +Cc: 56841, Eli Zaretskii

Hello again, Bill.

On Sat, Jul 30, 2022 at 17:14:43 +0300, Eli Zaretskii wrote:
> > Cc: Bill Sacks <sacks@ucar.edu>
> > Date: Sat, 30 Jul 2022 13:05:24 +0000
> > From: Alan Mackenzie <acm@muc.de>

> > 1. Start emacs -Q.
> > 2. Insert the following file in C Mode:

> > void myfunc(

> >   ) {

> > }

> > 3. In line 2 (the first blank line) type "<TAB>int somevar".
> > 4. Note that somevar is not fontified.  This is a bug, given that the
> >   arglist to myfunc is terminated with a ) on line 3.
> > 5. Do something (e.g. typing M-x) to cause a redisplay.  somevar gets
> >   its correct face.
> > 6. Note that any insertion or deletion in L2 causes somevar to lose its
> >   fontification.  This is a bug.
> > 7. (After 6).  Move point onto somevar and do C-u C-x =.  This shows
> >   that the face text property is set on the character despite the face
> >   not appearing on the screen.

This bug, although the symptoms were similar to the other bug you
reported, was an entirely different bug, more difficult to fix.

I now have a patch for it, and would ask you to apply the patch to your
Emacs 28.1 and byte compile the files in it, as before.  (As before,
help is available from me by private email.)  Then please test it on
your actual C code and let us know how it went.  Thanks!



diff -r e4e62074b8a6 cc-engine.el
--- a/cc-engine.el	Sat Jul 30 09:15:53 2022 +0000
+++ b/cc-engine.el	Tue Aug 02 19:14:15 2022 +0000
@@ -9576,7 +9576,7 @@
 	 (or (= paren-depth 0)
 	     (c-safe (goto-char (scan-lists (point) 1 paren-depth))))
 
-	 (<= (point) limit)
+	 (< (point) limit)
 
 	 ;; Skip over any trailing bit, such as "__attribute__".
 	 (progn
diff -r e4e62074b8a6 cc-mode.el
--- a/cc-mode.el	Sat Jul 30 09:15:53 2022 +0000
+++ b/cc-mode.el	Tue Aug 02 19:14:15 2022 +0000
@@ -2412,49 +2412,59 @@
       (and (/= new-pos pos) new-pos))))
 
 (defun c-fl-decl-end (pos)
-  ;; If POS is inside a declarator, return the end of the token that follows
-  ;; the declarator, otherwise return nil.  POS being in a literal does not
-  ;; count as being in a declarator (on pragmatic grounds).  POINT is not
-  ;; preserved.
+  ;; If POS is inside a declarator, return the position of the end of the
+  ;; paren pair that terminates it, or of the end of the token that follows
+  ;; the declarator, otherwise return nil.  If there is no such token, the end
+  ;; of the last token in the buffer is used.  POS being in a literal is now
+  ;; (2022-07) handled correctly.  POINT is not preserved.
   (goto-char pos)
   (let ((lit-start (c-literal-start))
 	(lim (c-determine-limit 1000))
 	enclosing-attribute pos1)
-    (unless lit-start
-      (c-backward-syntactic-ws
-       lim)
-      (when (setq enclosing-attribute (c-enclosing-c++-attribute))
-	(goto-char (car enclosing-attribute))) ; Only happens in C++ Mode.
-      (when (setq pos1 (c-on-identifier))
-	(goto-char pos1)
-	(let ((lim (save-excursion
-		     (and (c-beginning-of-macro)
-			  (progn (c-end-of-macro) (point))))))
-	  (and (c-forward-declarator lim)
-	       (if (eq (char-after) ?\()
-		   (and
-		    (c-go-list-forward nil lim)
-		    (progn (c-forward-syntactic-ws lim)
-			   (not (eobp)))
-		    (progn
-		      (if (looking-at c-symbol-char-key)
-			  ;; Deal with baz (foo((bar)) type var), where
-			  ;; foo((bar)) is not semantically valid.  The result
-			  ;; must be after var).
-			  (and
-			   (goto-char pos)
-			   (setq pos1 (c-on-identifier))
-			   (goto-char pos1)
-			   (progn
-			     (c-backward-syntactic-ws lim)
-			     (eq (char-before) ?\())
-			   (c-fl-decl-end (1- (point))))
-			(c-backward-syntactic-ws lim)
-			(point))))
-		 (and (progn (c-forward-syntactic-ws lim)
-			     (not (eobp)))
+    (if lit-start
+	(goto-char lit-start))
+    (c-backward-syntactic-ws lim)
+    (when (setq enclosing-attribute (c-enclosing-c++-attribute))
+      (goto-char (car enclosing-attribute)) ; Only happens in C++ Mode.
+      (c-backward-syntactic-ws lim))
+    (while (and (> (point) lim)
+		(memq (char-before) '(?\[ ?\()))
+      (backward-char)
+      (c-backward-syntactic-ws lim))
+    (when (setq pos1 (c-on-identifier))
+      (goto-char pos1)
+      (let ((lim (save-excursion
+		   (and (c-beginning-of-macro)
+			(progn (c-end-of-macro) (point))))))
+	(and (c-forward-declarator lim)
+	     (if (and (eq (char-after) ?\()
+		      (c-go-list-forward nil lim))
+		 (and
+		  (progn (c-forward-syntactic-ws lim)
+			 (not (eobp)))
+		  (progn
+		    (if (looking-at c-symbol-char-key)
+			;; Deal with baz (foo((bar)) type var), where
+			;; foo((bar)) is not semantically valid.  The result
+			;; must be after var).
+			(and
+			 (goto-char pos)
+			 (setq pos1 (c-on-identifier))
+			 (goto-char pos1)
+			 (progn
+			   (c-backward-syntactic-ws lim)
+			   (eq (char-before) ?\())
+			 (c-fl-decl-end (1- (point))))
 		      (c-backward-syntactic-ws lim)
-		      (point)))))))))
+		      (point))))
+	       (if (progn (c-forward-syntactic-ws lim)
+			  (not (eobp)))
+		   (c-forward-over-token)
+		 (let ((lit-start (c-literal-start)))
+		   (when lit-start
+		       (goto-char lit-start))
+		   (c-backward-syntactic-ws)))
+	       (and (>= (point) pos) (point))))))))
 
 (defun c-change-expand-fl-region (_beg _end _old-len)
   ;; Expand the region (c-new-BEG c-new-END) to an after-change font-lock


-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-08-02 19:30   ` Alan Mackenzie
@ 2022-08-22 16:08     ` Bill Sacks
  2022-08-24 15:10       ` Alan Mackenzie
  0 siblings, 1 reply; 9+ messages in thread
From: Bill Sacks @ 2022-08-22 16:08 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 56841, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 5874 bytes --]

Thank you very much for this fix, Alan. I have now tested it both with 
my test case and in more realistic code, and it seems to fix the issues 
I was encountering – thank you!

Sorry for the delay on getting back to you about this.

Bill

Alan Mackenzie wrote on 8/2/22 1:30 PM:
> Hello again, Bill.
>
> On Sat, Jul 30, 2022 at 17:14:43 +0300, Eli Zaretskii wrote:
>>> Cc: Bill Sacks <sacks@ucar.edu>
>>> Date: Sat, 30 Jul 2022 13:05:24 +0000
>>> From: Alan Mackenzie <acm@muc.de>
>>> 1. Start emacs -Q.
>>> 2. Insert the following file in C Mode:
>>> void myfunc(
>>>    ) {
>>> }
>>> 3. In line 2 (the first blank line) type "<TAB>int somevar".
>>> 4. Note that somevar is not fontified.  This is a bug, given that the
>>>    arglist to myfunc is terminated with a ) on line 3.
>>> 5. Do something (e.g. typing M-x) to cause a redisplay.  somevar gets
>>>    its correct face.
>>> 6. Note that any insertion or deletion in L2 causes somevar to lose its
>>>    fontification.  This is a bug.
>>> 7. (After 6).  Move point onto somevar and do C-u C-x =.  This shows
>>>    that the face text property is set on the character despite the face
>>>    not appearing on the screen.
> This bug, although the symptoms were similar to the other bug you
> reported, was an entirely different bug, more difficult to fix.
>
> I now have a patch for it, and would ask you to apply the patch to your
> Emacs 28.1 and byte compile the files in it, as before.  (As before,
> help is available from me by private email.)  Then please test it on
> your actual C code and let us know how it went.  Thanks!
>
>
>
> diff -r e4e62074b8a6 cc-engine.el
> --- a/cc-engine.el	Sat Jul 30 09:15:53 2022 +0000
> +++ b/cc-engine.el	Tue Aug 02 19:14:15 2022 +0000
> @@ -9576,7 +9576,7 @@
>   	 (or (= paren-depth 0)
>   	     (c-safe (goto-char (scan-lists (point) 1 paren-depth))))
>   
> -	 (<= (point) limit)
> +	 (< (point) limit)
>   
>   	 ;; Skip over any trailing bit, such as "__attribute__".
>   	 (progn
> diff -r e4e62074b8a6 cc-mode.el
> --- a/cc-mode.el	Sat Jul 30 09:15:53 2022 +0000
> +++ b/cc-mode.el	Tue Aug 02 19:14:15 2022 +0000
> @@ -2412,49 +2412,59 @@
>         (and (/= new-pos pos) new-pos))))
>   
>   (defun c-fl-decl-end (pos)
> -  ;; If POS is inside a declarator, return the end of the token that follows
> -  ;; the declarator, otherwise return nil.  POS being in a literal does not
> -  ;; count as being in a declarator (on pragmatic grounds).  POINT is not
> -  ;; preserved.
> +  ;; If POS is inside a declarator, return the position of the end of the
> +  ;; paren pair that terminates it, or of the end of the token that follows
> +  ;; the declarator, otherwise return nil.  If there is no such token, the end
> +  ;; of the last token in the buffer is used.  POS being in a literal is now
> +  ;; (2022-07) handled correctly.  POINT is not preserved.
>     (goto-char pos)
>     (let ((lit-start (c-literal-start))
>   	(lim (c-determine-limit 1000))
>   	enclosing-attribute pos1)
> -    (unless lit-start
> -      (c-backward-syntactic-ws
> -       lim)
> -      (when (setq enclosing-attribute (c-enclosing-c++-attribute))
> -	(goto-char (car enclosing-attribute))) ; Only happens in C++ Mode.
> -      (when (setq pos1 (c-on-identifier))
> -	(goto-char pos1)
> -	(let ((lim (save-excursion
> -		     (and (c-beginning-of-macro)
> -			  (progn (c-end-of-macro) (point))))))
> -	  (and (c-forward-declarator lim)
> -	       (if (eq (char-after) ?\()
> -		   (and
> -		    (c-go-list-forward nil lim)
> -		    (progn (c-forward-syntactic-ws lim)
> -			   (not (eobp)))
> -		    (progn
> -		      (if (looking-at c-symbol-char-key)
> -			  ;; Deal with baz (foo((bar)) type var), where
> -			  ;; foo((bar)) is not semantically valid.  The result
> -			  ;; must be after var).
> -			  (and
> -			   (goto-char pos)
> -			   (setq pos1 (c-on-identifier))
> -			   (goto-char pos1)
> -			   (progn
> -			     (c-backward-syntactic-ws lim)
> -			     (eq (char-before) ?\())
> -			   (c-fl-decl-end (1- (point))))
> -			(c-backward-syntactic-ws lim)
> -			(point))))
> -		 (and (progn (c-forward-syntactic-ws lim)
> -			     (not (eobp)))
> +    (if lit-start
> +	(goto-char lit-start))
> +    (c-backward-syntactic-ws lim)
> +    (when (setq enclosing-attribute (c-enclosing-c++-attribute))
> +      (goto-char (car enclosing-attribute)) ; Only happens in C++ Mode.
> +      (c-backward-syntactic-ws lim))
> +    (while (and (> (point) lim)
> +		(memq (char-before) '(?\[ ?\()))
> +      (backward-char)
> +      (c-backward-syntactic-ws lim))
> +    (when (setq pos1 (c-on-identifier))
> +      (goto-char pos1)
> +      (let ((lim (save-excursion
> +		   (and (c-beginning-of-macro)
> +			(progn (c-end-of-macro) (point))))))
> +	(and (c-forward-declarator lim)
> +	     (if (and (eq (char-after) ?\()
> +		      (c-go-list-forward nil lim))
> +		 (and
> +		  (progn (c-forward-syntactic-ws lim)
> +			 (not (eobp)))
> +		  (progn
> +		    (if (looking-at c-symbol-char-key)
> +			;; Deal with baz (foo((bar)) type var), where
> +			;; foo((bar)) is not semantically valid.  The result
> +			;; must be after var).
> +			(and
> +			 (goto-char pos)
> +			 (setq pos1 (c-on-identifier))
> +			 (goto-char pos1)
> +			 (progn
> +			   (c-backward-syntactic-ws lim)
> +			   (eq (char-before) ?\())
> +			 (c-fl-decl-end (1- (point))))
>   		      (c-backward-syntactic-ws lim)
> -		      (point)))))))))
> +		      (point))))
> +	       (if (progn (c-forward-syntactic-ws lim)
> +			  (not (eobp)))
> +		   (c-forward-over-token)
> +		 (let ((lit-start (c-literal-start)))
> +		   (when lit-start
> +		       (goto-char lit-start))
> +		   (c-backward-syntactic-ws)))
> +	       (and (>= (point) pos) (point))))))))
>   
>   (defun c-change-expand-fl-region (_beg _end _old-len)
>     ;; Expand the region (c-new-BEG c-new-END) to an after-change font-lock
>
>


[-- Attachment #2: Type: text/html, Size: 6710 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line
  2022-08-22 16:08     ` Bill Sacks
@ 2022-08-24 15:10       ` Alan Mackenzie
  0 siblings, 0 replies; 9+ messages in thread
From: Alan Mackenzie @ 2022-08-24 15:10 UTC (permalink / raw)
  To: Bill Sacks; +Cc: Eli Zaretskii, 56841-done

Hello, Bill.

On Mon, Aug 22, 2022 at 10:08:48 -0600, Bill Sacks wrote:
> Thank you very much for this fix, Alan. I have now tested it both with 
> my test case and in more realistic code, and it seems to fix the issues 
> I was encountering – thank you!

Thanks for the testing!

> Sorry for the delay on getting back to you about this.

No problem!  I've now committed the fix to the master branch of Emacs at
savannah, and I'm closing the bug with this post.

> Bill

[ .... ]

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-08-24 15:10 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-30 13:05 bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line Alan Mackenzie
2022-07-30 14:14 ` Eli Zaretskii
2022-07-30 14:27   ` Alan Mackenzie
2022-07-30 15:10     ` Eli Zaretskii
2022-07-31 15:48       ` Alan Mackenzie
2022-07-31 15:53         ` Eli Zaretskii
2022-08-02 19:30   ` Alan Mackenzie
2022-08-22 16:08     ` Bill Sacks
2022-08-24 15:10       ` 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).