GNU bug report logs - #61481
CC Mode 5.35.2 (C/*l); _Generic unsupported

Previous Next

Package: cc-mode;

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

Date: Mon, 13 Feb 2023 15:29:01 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 61481 in the body.
You can then email your comments to 61481 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#61481; Package cc-mode. (Mon, 13 Feb 2023 15:29:01 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. (Mon, 13 Feb 2023 15:29:01 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); _Generic unsupported
Date: Mon, 13 Feb 2023 23:25:43 +0800
Package: cc-mode

2011 Standard C has a feature that works like `switch', except on the
type of an expression and with different syntax.

Today, I had to figure out how to port some code written with that in
mind to ANSI C, and surprisingly enough, found that CC Mode does not
support that feature at all.

Code making use of _Generic looks more or less like this:

{
  const char *typename = _Generic ((expr),
				   const char *:
				     "const char *",
				   int:
				     "int",
				   unsigned long:
				     "unsigned long"
				   default:
				     NULL);
}

where `typename' is set to an appropriate value based on the type of the
expression ``expr''.

CC Mode already works remarkably well, but it should be taught to indent
the cases separately from the values.

Emacs  : GNU Emacs 29.0.60 (build 1, x86_64-pc-linux-gnu)
 of 2022-12-24
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)

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#61481; Package cc-mode. (Thu, 16 Feb 2023 13:16:02 GMT) Full text and rfc822 format available.

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

From: Alan Mackenzie <acm <at> muc.de>
To: Po Lu <luangruo <at> yahoo.com>
Cc: 61481 <at> debbugs.gnu.org
Subject: Re: bug#61481: CC Mode 5.35.2 (C/*l); _Generic unsupported
Date: Thu, 16 Feb 2023 13:15:36 +0000
[Message part 1 (text/plain, inline)]
Hello, Po.

On Mon, Feb 13, 2023 at 23:25:43 +0800, Po Lu via CC-Mode-help wrote:
> Package: cc-mode

> 2011 Standard C has a feature that works like `switch', except on the
> type of an expression and with different syntax.

Yuck!  How on Earth did something like this get included in the
standard?  It's not used often (I wasn't aware of it until three days
ago), it's wholly unlike anything else in C, and just takes up effort
from compiler and editor maintainers.

> Today, I had to figure out how to port some code written with that in
> mind to ANSI C, and surprisingly enough, found that CC Mode does not
> support that feature at all.

:-)

> Code making use of _Generic looks more or less like this:

> {
>   const char *typename = _Generic ((expr),
> 				   const char *:
> 				     "const char *",
> 				   int:
> 				     "int",
> 				   unsigned long:
> 				     "unsigned long"
> 				   default:
> 				     NULL);
> }

> where `typename' is set to an appropriate value based on the type of the
> expression ``expr''.

> CC Mode already works remarkably well, but it should be taught to indent
> the cases separately from the values.

Thanks!

I've made a first patch for this, which is fairly crude.  It handles
only the indentation, not the fontification, which will be more
difficult.

Would you please try out the attached patch, and let me know how well it
does the job.  Thanks!

[ .... ]

-- 
Alan Mackenzie (Nuremberg, Germany).

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

Information forwarded to bug-cc-mode <at> gnu.org:
bug#61481; Package cc-mode. (Fri, 17 Feb 2023 02:37:02 GMT) Full text and rfc822 format available.

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

From: Po Lu <luangruo <at> yahoo.com>
To: Alan Mackenzie <acm <at> muc.de>
Cc: 61481 <at> debbugs.gnu.org
Subject: Re: bug#61481: CC Mode 5.35.2 (C/*l); _Generic unsupported
Date: Fri, 17 Feb 2023 10:33:45 +0800
Alan Mackenzie <acm <at> muc.de> writes:

> Hello, Po.
>
> On Mon, Feb 13, 2023 at 23:25:43 +0800, Po Lu via CC-Mode-help wrote:
>> Package: cc-mode
>
>> 2011 Standard C has a feature that works like `switch', except on the
>> type of an expression and with different syntax.
>
> Yuck!  How on Earth did something like this get included in the
> standard?  It's not used often (I wasn't aware of it until three days
> ago), it's wholly unlike anything else in C, and just takes up effort
> from compiler and editor maintainers.
>
>> Today, I had to figure out how to port some code written with that in
>> mind to ANSI C, and surprisingly enough, found that CC Mode does not
>> support that feature at all.
>
> :-)
>
>> Code making use of _Generic looks more or less like this:
>
>> {
>>   const char *typename = _Generic ((expr),
>> 				   const char *:
>> 				     "const char *",
>> 				   int:
>> 				     "int",
>> 				   unsigned long:
>> 				     "unsigned long"
>> 				   default:
>> 				     NULL);
>> }
>
>> where `typename' is set to an appropriate value based on the type of the
>> expression ``expr''.
>
>> CC Mode already works remarkably well, but it should be taught to indent
>> the cases separately from the values.
>
> Thanks!
>
> I've made a first patch for this, which is fairly crude.  It handles
> only the indentation, not the fontification, which will be more
> difficult.
>
> Would you please try out the attached patch, and let me know how well it
> does the job.  Thanks!
>
> [ .... ]

Thanks, Alan.

I finished working on that code by now, so I have nothing to test it on.
If it works for you, please install, thanks.




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

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

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

From: Alan Mackenzie <acm <at> muc.de>
To: Po Lu <luangruo <at> yahoo.com>
Cc: 61481-done <at> debbugs.gnu.org
Subject: Re: bug#61481: CC Mode 5.35.2 (C/*l); _Generic unsupported
Date: Fri, 17 Feb 2023 09:28:49 +0000
Hello, Po.

On Fri, Feb 17, 2023 at 10:33:45 +0800, Po Lu wrote:
> Alan Mackenzie <acm <at> muc.de> writes:

[ .... ]

> > I've made a first patch for this, which is fairly crude.  It handles
> > only the indentation, not the fontification, which will be more
> > difficult.

> > Would you please try out the attached patch, and let me know how well it
> > does the job.  Thanks!

> > [ .... ]

> Thanks, Alan.

> I finished working on that code by now, so I have nothing to test it on.
> If it works for you, please install, thanks.

OK.  I've enhanced it a fair bit since yesterday, in particular, the
types now get fontified as types.

I've committed that 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. (Fri, 17 Mar 2023 11:24:04 GMT) Full text and rfc822 format available.

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

Previous Next


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