Subject: Re: bug#11448: 24.1.50; Strange indentation level in C macro

From: Alan Mackenzie <[email-masked]>
Date: Sat, 1 Jun 2013 13:56:09 +0000

Hi, Michael!

On Thu, May 30, 2013 at 10:46:20PM -0400, Michael Welsh Duggan wrote:
> I'd like to bump this issue.

Sorry, I missed this one last year.

> I looked into it a little, and it looks like several of the macros
> before the point in question are being marked as c-in-sws, which
> doesn't seem right to me.  The code ends up evaluating
> `c-beginning-of-macro' in a buffer that is narrowed such that the
> beginning of the macro that it is trying to find the beginning of is
> cut off.

Yes, sort of.  I think the c-in-sws properties are right.

What I think is throwing it off is the calculation of a search limit
(effectively a buffer narrowing) in `c-guess-basic-syntax'.  That limit
was erroneously at a random position, but it actually needs to be at a
"syntactically neutral" position.

I put that limit calculation in as part of a large optimisation for a
~3,500 line macro which was causing scrolling to go very slowly.  Taking
it out again doesn't seem to slow it down all that badly.  So, out it
comes!

> The resulting indentation problem isn't horrible, but the bug that leads
> to this problem is subtle enough that it could be causing other problems
> in similar situations.

Yes.  Thanks for the bug report.  Could you try out this patch please.
I think it fixes the bug:

diff -r ce17d1595c2f cc-engine.el
--- a/cc-engine.el	Tue May 28 15:00:49 2013 +0000
+++ b/cc-engine.el	Sat Jun 01 13:52:38 2013 +0000
@@ -9396,10 +9396,6 @@
 			  containing-sexp nil)))
 	      (setq lim (1+ containing-sexp))))
 	(setq lim (point-min)))
-      (when (c-beginning-of-macro)
-	(goto-char indent-point)
-	(let ((lim1 (c-determine-limit 2000)))
-	  (setq lim (max lim lim1))))
 
       ;; If we're in a parenthesis list then ',' delimits the
       ;; "statements" rather than being an operator (with the

> -- 
> Michael Duggan

-- 
Alan Mackenzie (Nuremberg, Germany).