GNU bug report logs - #61144
CC Mode 5.35.2 (C/*l); Incorrect fontification (but different from last time)

Previous Next

Package: cc-mode;

Reported by: Po Lu <luangruo <at> yahoo.com>

Date: Sun, 29 Jan 2023 11:02: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 61144 in the body.
You can then email your comments to 61144 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#61144; Package cc-mode. (Sun, 29 Jan 2023 11:02:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Po Lu <luangruo <at> yahoo.com>:
New bug report received and forwarded. Copy sent to bug-cc-mode <at> gnu.org. (Sun, 29 Jan 2023 11:02:02 GMT) Full text and rfc822 format available.

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

From: Po Lu <luangruo <at> yahoo.com>
To: bug-gnu-emacs <at> gnu.org
Subject: CC Mode 5.35.2 (C/*l); Incorrect fontification (but different from
 last time)
Date: Sun, 29 Jan 2023 19:00:47 +0800
Package: cc-mode

Emacs  : GNU Emacs 30.0.50 (build 41, x86_64-pc-linux-gnu)
 of 2023-01-29
Package: CC Mode 5.35.2 (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 category-properties 1-bit)

Insert the following text in a C Mode buffer:

static sfnt_f26dot6
sfnt_mul_f26dot6 (sfnt_f26dot6 a, sfnt_f26dot6 b)
{
#ifdef INT64_MAX
  return (sfnt_f26dot6) ((int64_t) a * b + (1 << 5) >> 6);
#else
  int negative;
  unsigned short al, bl, ah, bh;
  unsigned int lowlong, midlong, hilong;

  negative = 0;

  /* Compensate for complement and determine if the result will be
     negative.  */

  if (a < 0)
    {
      a = -a;
      negative = 1;
    }

  if (b < 0)
    {
      b = -b;
      negative ^= true;
    }

  /* Load low and high words from A and B.  */
  al = a & 0xffff;
  bl = b & 0xffff;
  ah = a >> 16;
  bh = b >> 16;

  /* Multiply the various bits separately.  */
  midlong = (unsigned int) al * bh;
#endif
}

In ``al * bh'', al is fontified as a type, and bh an identifier.

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 "[ 	]*\\(//+\\|\\**\\)[ 	]*\\([ 	]*\\([-–!|#%;>*·•‣⁃◦]+[ 	]*\\)*\\)"
 )




Information forwarded to bug-cc-mode <at> gnu.org:
bug#61144; Package cc-mode. (Mon, 30 Jan 2023 21:54:02 GMT) Full text and rfc822 format available.

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

From: Alan Mackenzie <acm <at> muc.de>
To: Po Lu <luangruo <at> yahoo.com>
Cc: 61144 <at> debbugs.gnu.org
Subject: Re: bug#61144: CC Mode 5.35.2 (C/*l); Incorrect fontification (but
 different from last time)
Date: Mon, 30 Jan 2023 21:53:11 +0000
[Message part 1 (text/plain, inline)]
Hello, Po.

On Sun, Jan 29, 2023 at 19:00:47 +0800, Po Lu via CC-Mode-help wrote:
> Package: cc-mode

> Emacs  : GNU Emacs 30.0.50 (build 41, x86_64-pc-linux-gnu)
>  of 2023-01-29
> Package: CC Mode 5.35.2 (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 category-properties 1-bit)

> Insert the following text in a C Mode buffer:

> static sfnt_f26dot6
> sfnt_mul_f26dot6 (sfnt_f26dot6 a, sfnt_f26dot6 b)
> {
> #ifdef INT64_MAX
>   return (sfnt_f26dot6) ((int64_t) a * b + (1 << 5) >> 6);
> #else
>   int negative;
>   unsigned short al, bl, ah, bh;
>   unsigned int lowlong, midlong, hilong;

>   negative = 0;

>   /* Compensate for complement and determine if the result will be
>      negative.  */

>   if (a < 0)
>     {
>       a = -a;
>       negative = 1;
>     }

>   if (b < 0)
>     {
>       b = -b;
>       negative ^= true;
>     }

>   /* Load low and high words from A and B.  */
>   al = a & 0xffff;
>   bl = b & 0xffff;
>   ah = a >> 16;
>   bh = b >> 16;

>   /* Multiply the various bits separately.  */
>   midlong = (unsigned int) al * bh;
> #endif
> }

> In ``al * bh'', al is fontified as a type, and bh an identifier.

Yes.  foo * bar is a difficult case, since it can either be a
multiplication or a declaration of bar as a pointer to foo.  There is no
reliable way to distinguish these two cases without a full parser.  No
doubt c-ts-mode will do better here.

In another similar case, I have disambiguated these with "whitespace
asymmetry" - If there's WS both before and after the "*" or neither,
it's treated as a multiplication.  Otherwise it's a declaration.

I've extended this heuristic to treat the case in your test file.  Would
you try out the attached patch, please (it applies cleanly to the master
branch).  I would be in favour of putting the patch into the release
branch, but given the patch is ~90 lines long, Eli might object.

Anyhow, please try it out, and let me know what you think about it.
Thanks!

[ .... ]

-- 
Alan Mackenzie (Nuremberg, Germany).

[diff.20230130.diff (text/plain, attachment)]

Information forwarded to bug-cc-mode <at> gnu.org:
bug#61144; Package cc-mode. (Tue, 31 Jan 2023 01:24:01 GMT) Full text and rfc822 format available.

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

From: Po Lu <luangruo <at> yahoo.com>
To: Alan Mackenzie <acm <at> muc.de>
Cc: 61144 <at> debbugs.gnu.org
Subject: Re: bug#61144: CC Mode 5.35.2 (C/*l); Incorrect fontification (but
 different from last time)
Date: Tue, 31 Jan 2023 09:23:01 +0800
Alan Mackenzie <acm <at> muc.de> writes:

> Hello, Po.
>
> On Sun, Jan 29, 2023 at 19:00:47 +0800, Po Lu via CC-Mode-help wrote:
>> Package: cc-mode
>
>> Emacs  : GNU Emacs 30.0.50 (build 41, x86_64-pc-linux-gnu)
>>  of 2023-01-29
>> Package: CC Mode 5.35.2 (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 category-properties 1-bit)
>
>> Insert the following text in a C Mode buffer:
>
>> static sfnt_f26dot6
>> sfnt_mul_f26dot6 (sfnt_f26dot6 a, sfnt_f26dot6 b)
>> {
>> #ifdef INT64_MAX
>>   return (sfnt_f26dot6) ((int64_t) a * b + (1 << 5) >> 6);
>> #else
>>   int negative;
>>   unsigned short al, bl, ah, bh;
>>   unsigned int lowlong, midlong, hilong;
>
>>   negative = 0;
>
>>   /* Compensate for complement and determine if the result will be
>>      negative.  */
>
>>   if (a < 0)
>>     {
>>       a = -a;
>>       negative = 1;
>>     }
>
>>   if (b < 0)
>>     {
>>       b = -b;
>>       negative ^= true;
>>     }
>
>>   /* Load low and high words from A and B.  */
>>   al = a & 0xffff;
>>   bl = b & 0xffff;
>>   ah = a >> 16;
>>   bh = b >> 16;
>
>>   /* Multiply the various bits separately.  */
>>   midlong = (unsigned int) al * bh;
>> #endif
>> }
>
>> In ``al * bh'', al is fontified as a type, and bh an identifier.
>
> Yes.  foo * bar is a difficult case, since it can either be a
> multiplication or a declaration of bar as a pointer to foo.  There is no
> reliable way to distinguish these two cases without a full parser.  No
> doubt c-ts-mode will do better here.
>
> In another similar case, I have disambiguated these with "whitespace
> asymmetry" - If there's WS both before and after the "*" or neither,
> it's treated as a multiplication.  Otherwise it's a declaration.
>
> I've extended this heuristic to treat the case in your test file.  Would
> you try out the attached patch, please (it applies cleanly to the master
> branch).  I would be in favour of putting the patch into the release
> branch, but given the patch is ~90 lines long, Eli might object.
>
> Anyhow, please try it out, and let me know what you think about it.
> Thanks!
>
> [ .... ]

Thank you, this works here.




Reply sent to Alan Mackenzie <acm <at> muc.de>:
You have taken responsibility. (Fri, 03 Feb 2023 21:02:02 GMT) Full text and rfc822 format available.

Notification sent to Po Lu <luangruo <at> yahoo.com>:
bug acknowledged by developer. (Fri, 03 Feb 2023 21:02:02 GMT) Full text and rfc822 format available.

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

From: Alan Mackenzie <acm <at> muc.de>
To: Po Lu <luangruo <at> yahoo.com>
Cc: 61144-done <at> debbugs.gnu.org
Subject: Re: bug#61144: CC Mode 5.35.2 (C/*l); Incorrect fontification (but
 different from last time)
Date: Fri, 3 Feb 2023 21:01:06 +0000
Hello, Po.

On Tue, Jan 31, 2023 at 09:23:01 +0800, Po Lu wrote:
> Alan Mackenzie <acm <at> muc.de> writes:

> > On Sun, Jan 29, 2023 at 19:00:47 +0800, Po Lu via CC-Mode-help wrote:
> >> Package: cc-mode

> >> Emacs  : GNU Emacs 30.0.50 (build 41, x86_64-pc-linux-gnu)
> >>  of 2023-01-29
> >> Package: CC Mode 5.35.2 (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 category-properties 1-bit)

[ .... ]

> > Anyhow, please try it out, and let me know what you think about it.
> > Thanks!

> > [ .... ]

> Thank you, this works here.

Thanks!  I've committed the patch and I'm closing the bug with this post.

-- 
Alan Mackenzie (Nuremberg, Germany).




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

This bug report was last modified 2 years and 112 days ago.

Previous Next


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