GNU bug report logs -
#61144
CC Mode 5.35.2 (C/*l); Incorrect fontification (but different from last time)
Previous Next
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.
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):
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):
[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):
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):
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.