GNU bug report logs -
#47468
27.1; cc-mode: Got incorrect indentaton for C++ lambda function.
Previous Next
Reported by: Jianbin Kang <kjbmail <at> gmail.com>
Date: Mon, 29 Mar 2021 14:46:02 UTC
Severity: normal
Found in version 27.1
Done: Alan Mackenzie <acm <at> muc.de>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Hello, Jianbin.
Thank you indeed for taking the trouble to report this bug, and thank
you even more for cutting the test case down to a concise, easy to work
with file.
On Mon, Mar 29, 2021 at 20:47:52 +0800, Jianbin Kang wrote:
> The c++ file to reproduce it:
> ```c++
> #include <stdio.h>
> #include <functional>
> struct PP {
> const char * name;
> };
> static void print(const char *name, std::function<void(const char *)> f)
> {
> f(name);
> }
> int main(int argc, char *argv[])
> {
> PP A = { "Jim" };
> PP *a = &A;
> print(A.name, [](const char *name) {
> printf("%s\n", name); // Syntactic ((inlambda) ...
> });
> print(a->name, [=](const char *name) {
> printf("%s\n", name); // Syntactic((arglist-cont-nonempty
> ...
> });
> return 0;
> }
> ```
> If I put cursor in lambda body of first print call, and run
> 'c-show-syntactic-information', it shows 'Syntactic analysis: ((inlambda)
> (defun-block-intro 258))', which is correct and I get good indentation.
> But in second print call, I get 'Syntactic analysis:
> ((arglist-cont-nonempty 337 342) (statement-block-intro 337))' and the
> indentation is bad.
Yes. What is happening is that CC Mode is falsely recognising the -> in
a->name as the trailing return type of the lambda expression.
I think the following patch should fix it. Could I ask you, please, to
apply this patch to ..../emacs/lisp/progmodes/cc-engine.el, byte-compile
the file, and try it out on your real C++ source code. In the unlikely
event you want help with the patching or byte-compilation, feel free to
send me private email. After this, please either confirm to us that the
problem is fixed, or tell us what is still not working. Thanks!
diff -r 92a4592886a1 cc-engine.el
--- a/cc-engine.el Sun Apr 25 17:26:38 2021 +0000
+++ b/cc-engine.el Sat May 15 14:51:56 2021 +0000
@@ -12269,7 +12269,7 @@
(save-excursion
(while
(progn
- (c-syntactic-skip-backward "^;=}>" closest-lim t)
+ (c-syntactic-skip-backward "^;=,}>" closest-lim t)
(and (eq (char-before) ?>)
(c-backward-token-2)
(not (looking-at c-haskell-op-re)))))
> My emacs version is 27.1. I can reproduce the problem in both Linux and
> Windows with 'emacs -Q'.
--
Alan Mackenzie (Nuremberg, Germany).
This bug report was last modified 3 years and 338 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.