* bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function. @ 2021-03-29 12:47 Jianbin Kang 2021-05-12 21:57 ` Lars Ingebrigtsen ` (2 more replies) 0 siblings, 3 replies; 5+ messages in thread From: Jianbin Kang @ 2021-03-29 12:47 UTC (permalink / raw) To: 47468 [-- Attachment #1: Type: text/plain, Size: 1015 bytes --] 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. My emacs version is 27.1. I can reproduce the problem in both Linux and Windows with 'emacs -Q'. [-- Attachment #2: Type: text/html, Size: 1320 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function. 2021-03-29 12:47 bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function Jianbin Kang @ 2021-05-12 21:57 ` Lars Ingebrigtsen 2021-05-15 14:57 ` Alan Mackenzie 2021-05-19 20:49 ` Vladimir Lichevsky 2 siblings, 0 replies; 5+ messages in thread From: Lars Ingebrigtsen @ 2021-05-12 21:57 UTC (permalink / raw) To: Jianbin Kang; +Cc: Alan Mackenzie, 47468 [-- Attachment #1: Type: text/plain, Size: 1066 bytes --] Jianbin Kang <kjbmail@gmail.com> writes: > 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. I can reproduce this in Emacs 28, too. Poking around a bit, it seems like it's getting tripped up by the "a->name" bit? Changing that to a.name (for instance) makes it recognise the second form as a lambda function... However, the first form is indented wrong for me in Emacs 28: [-- Attachment #2: Type: image/png, Size: 25838 bytes --] [-- Attachment #3: Type: text/plain, Size: 245 bytes --] This is indented correctly in Emacs 27.1, so it seems like this has regressed between Emacs 27.1 and Emacs 28. I've added Alan to the CCs. -- (domestic pets only, the antidote for overdose, milk.) bloggy blog: http://lars.ingebrigtsen.no ^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function. 2021-03-29 12:47 bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function Jianbin Kang 2021-05-12 21:57 ` Lars Ingebrigtsen @ 2021-05-15 14:57 ` Alan Mackenzie 2021-08-15 19:51 ` Alan Mackenzie 2021-05-19 20:49 ` Vladimir Lichevsky 2 siblings, 1 reply; 5+ messages in thread From: Alan Mackenzie @ 2021-05-15 14:57 UTC (permalink / raw) To: Jianbin Kang; +Cc: acm, Lars Ingebrigtsen, 47468 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). ^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function. 2021-05-15 14:57 ` Alan Mackenzie @ 2021-08-15 19:51 ` Alan Mackenzie 0 siblings, 0 replies; 5+ messages in thread From: Alan Mackenzie @ 2021-08-15 19:51 UTC (permalink / raw) To: Jianbin Kang; +Cc: acm, Lars Ingebrigtsen, 47468-done Hello, Jianbin and Lars. Some while has passed since the bug was opened, and since the patch I suggested seems to fix it, I am now closing this bug. -- Alan Mackenzie (Nuremberg, Germany). On Sat, May 15, 2021 at 14:57:45 +0000, Alan Mackenzie wrote: > 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). ^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function. 2021-03-29 12:47 bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function Jianbin Kang 2021-05-12 21:57 ` Lars Ingebrigtsen 2021-05-15 14:57 ` Alan Mackenzie @ 2021-05-19 20:49 ` Vladimir Lichevsky 2 siblings, 0 replies; 5+ messages in thread From: Vladimir Lichevsky @ 2021-05-19 20:49 UTC (permalink / raw) To: 47468 Not the original poster, but I tried this patch on recent build of Emacs from master branch (commit 567c31121fdef6bdc8b645999a6ca1d994378c89) and it looks like the patch fixes the bug. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-08-15 19:51 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-03-29 12:47 bug#47468: 27.1; cc-mode: Got incorrect indentaton for C++ lambda function Jianbin Kang 2021-05-12 21:57 ` Lars Ingebrigtsen 2021-05-15 14:57 ` Alan Mackenzie 2021-08-15 19:51 ` Alan Mackenzie 2021-05-19 20:49 ` Vladimir Lichevsky
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).