Subject: bug#48992: cc-mode initialize list indentation bug

From: Alan Mackenzie <[email-masked]>
Date: Sat, 21 Aug 2021 17:57:33 +0000

Hello, Binbowang.

On Sun, Jun 13, 2021 at 07:29:55 +0800, 王斌波 wrote:
> class A {
> public:
>   static std::set<int> setA;
> };

> std::set<int> A::setA {
>   1,
>     2,
>     3
> }

> The indentation in setA initialize list is not correct. I want it like the following.
> class A {
> public:
>   static std::set<int> setA;
> };

> std::set<int> A::setA {
>   1,
>   2,
>   3
> }

The indentation was indeed incorrect.  CC Mode was mis-analysing the
brace list as a function.  I think the patch attached should fix this.

Would you please apply the patch to your CC Mode (in directory
..../emacs/lisp/progmodes), byte compile that file, load it into your
Emacs and try it out on your real C++ source code.  Then please let me
know if the bug is indeed fixed.  (If you would like any help with the
patching or byte compilation, feel free to send me private email.)

> In GNU Emacs 27.1 (build 1, x86_64-w64-mingw32)
>  of 2020-08-22 built on CIRROCUMULUS
> Repository revision: 86d8d76aa36037184db0b2897c434cdaab1a9ae8
> Repository branch: HEAD
> Windowing system distributor 'Microsoft Corp.', version 10.0.19042
> System Description: Microsoft Windows 10 Pro (v10.0.2009.19042.1052)

[ .... ]

-- 
Alan Mackenzie (Nuremberg, Germany).

diff -r 92a4592886a1 cc-engine.el
--- a/cc-engine.el	Sun Apr 25 17:26:38 2021 +0000
+++ b/cc-engine.el	Sat Aug 21 17:38:30 2021 +0000
@@ -11882,12 +11882,15 @@
 	  pos2 in-paren parens-before-brace
 	  paren-state paren-pos)
 
-      (setq res (c-backward-token-2 1 t lim))
+      (setq res
+	    (or (progn (c-backward-syntactic-ws)
+		       (c-back-over-compound-identifier))
+		(c-backward-token-2 1 t lim)))
       ;; Checks to do only on the first sexp before the brace.
       ;; Have we a C++ initialization, without an "="?
       (if (and (c-major-mode-is 'c++-mode)
 	       (cond
-		((and (or (not (eq res 0))
+		((and (or (not (memq res '(t 0)))
 			  (eq (char-after) ?,))
 		      (setq paren-state (c-parse-state))
 		      (setq paren-pos (c-pull-open-brace paren-state))
@@ -11911,7 +11914,7 @@
 		(t nil))
 	       (save-excursion
 		 (cond
-		  ((or (not (eq res 0))
+		  ((or (not (memq res '(t 0)))
 		       (eq (char-after) ?,))
 		   (and (setq paren-state (c-parse-state))
 			(setq paren-pos (c-pull-open-brace paren-state))