Subject: bug#61481: closed (Re: bug#61481: CC Mode 5.35.2 (C/*l); _Generic unsupported)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 17 Feb 2023 09:29:02 +0000

Your bug report

#61481: CC Mode 5.35.2 (C/*l); _Generic unsupported

which was filed against the cc-mode package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
61481: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=61481
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#61481: CC Mode 5.35.2 (C/*l); _Generic unsupported
From: Alan Mackenzie <[email-masked]>
To: Po Lu <[email-masked]>
Cc: [email-masked]
Date: Fri, 17 Feb 2023 09:28:49 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello, Po.

On Fri, Feb 17, 2023 at 10:33:45 +0800, Po Lu wrote:
> Alan Mackenzie <[email-masked]> 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).

Subject: CC Mode 5.35.2 (C/*l); _Generic unsupported
From: Po Lu <[email-masked]>
To: [email-masked]
Date: Mon, 13 Feb 2023 23:25:43 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

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