From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.bugs Subject: bug#56841: Emacs-28 C Mode: Fontification errors when arglist closing ) is on next line Date: Tue, 2 Aug 2022 19:30:43 +0000 Message-ID: References: <83a68q6624.fsf@gnu.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="21089"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 56841@debbugs.gnu.org, Eli Zaretskii To: sacks@ucar.edu Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Aug 02 21:31:48 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oIxcK-0005Ik-CR for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 02 Aug 2022 21:31:48 +0200 Original-Received: from localhost ([::1]:50896 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oIxcJ-0001Xi-7H for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 02 Aug 2022 15:31:47 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:48874) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oIxbb-0001WB-4k for bug-gnu-emacs@gnu.org; Tue, 02 Aug 2022 15:31:04 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:55367) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1oIxba-0007SF-MZ for bug-gnu-emacs@gnu.org; Tue, 02 Aug 2022 15:31:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1oIxba-0007u6-Gv for bug-gnu-emacs@gnu.org; Tue, 02 Aug 2022 15:31:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 02 Aug 2022 19:31:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56841 X-GNU-PR-Package: emacs Original-Received: via spool by 56841-submit@debbugs.gnu.org id=B56841.165946865630370 (code B ref 56841); Tue, 02 Aug 2022 19:31:02 +0000 Original-Received: (at 56841) by debbugs.gnu.org; 2 Aug 2022 19:30:56 +0000 Original-Received: from localhost ([127.0.0.1]:45116 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oIxbT-0007tm-Gk for submit@debbugs.gnu.org; Tue, 02 Aug 2022 15:30:55 -0400 Original-Received: from colin.muc.de ([193.149.48.1]:17781 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1oIxbO-0007tU-NU for 56841@debbugs.gnu.org; Tue, 02 Aug 2022 15:30:54 -0400 Original-Received: (qmail 12285 invoked by uid 3782); 2 Aug 2022 19:30:44 -0000 Original-Received: from acm.muc.de (p4fe15cce.dip0.t-ipconnect.de [79.225.92.206]) (using STARTTLS) by colin.muc.de (tmda-ofmipd) with ESMTP; Tue, 02 Aug 2022 21:30:43 +0200 Original-Received: (qmail 18463 invoked by uid 1000); 2 Aug 2022 19:30:43 -0000 Content-Disposition: inline In-Reply-To: <83a68q6624.fsf@gnu.org> X-Submission-Agent: TMDA/1.3.x (Ph3nix) X-Primary-Address: acm@muc.de X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:238580 Archived-At: Hello again, Bill. On Sat, Jul 30, 2022 at 17:14:43 +0300, Eli Zaretskii wrote: > > Cc: Bill Sacks > > Date: Sat, 30 Jul 2022 13:05:24 +0000 > > From: Alan Mackenzie > > 1. Start emacs -Q. > > 2. Insert the following file in C Mode: > > void myfunc( > > ) { > > } > > 3. In line 2 (the first blank line) type "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).