changeset 50273:ea06392567c0

(c-parse-state): Added kludge to avoid an infinite loop when Emacs' open-paren-in-column-zero rule kicks in and causes the sexp functions to misbehave.
author Martin Stjernholm <mast@lysator.liu.se>
date Sun, 23 Mar 2003 01:58:30 +0000
parents c5e286e85257
children a617ca0d5d85
files lisp/progmodes/cc-engine.el
diffstat 1 files changed, 10 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/cc-engine.el	Sun Mar 23 01:09:49 2003 +0000
+++ b/lisp/progmodes/cc-engine.el	Sun Mar 23 01:58:30 2003 +0000
@@ -1144,7 +1144,7 @@
     (let* ((here (point))
 	   (c-macro-start (c-query-macro-start))
 	   (in-macro-start (or c-macro-start (point)))
-	   old-state last-pos pairs pos)
+	   old-state last-pos pairs pos save-pos)
       ;; Somewhat ugly use of c-check-state-cache to get rid of the
       ;; part of the state cache that is after point.  Can't use
       ;; c-whack-state-after for the same reasons as in that function.
@@ -1225,7 +1225,8 @@
       (narrow-to-region (point-min) here)
       (while pos
 	;; Find the balanced brace pairs.
-	(setq pairs nil)
+	(setq save-pos pos
+	      pairs nil)
 	(while (and (setq last-pos (c-down-list-forward pos))
 		    (setq pos (c-up-list-forward last-pos)))
 	  (if (eq (char-before last-pos) ?{)
@@ -1269,7 +1270,13 @@
 	      (progn
 		(setq pos (c-up-list-backward pos)
 		      c-state-cache nil)
-		(unless pos
+		(when (or (not pos)
+			  ;; Emacs (up to at least 21.2) can get confused by
+			  ;; open parens in column zero inside comments: The
+			  ;; sexp functions can then misbehave and bring us
+			  ;; back to the same point again.  Check this so that
+			  ;; we don't get an infinite loop.
+			  (>= pos save-pos))
 		  (setq pos last-pos
 			c-parsing-error
 			(format "Unbalanced close paren at line %d"