unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#7918: [PATCH] cc-mode: only the first clause of a for-loop should be checked for declarations
@ 2011-01-26  6:36 Daniel Colascione
  2016-02-26  6:18 ` Lars Ingebrigtsen
       [not found] ` <handler.7918.D7918.146160769022226.notifdone@debbugs.gnu.org>
  0 siblings, 2 replies; 16+ messages in thread
From: Daniel Colascione @ 2011-01-26  6:36 UTC (permalink / raw)
  To: 7918

[-- Attachment #1: Type: text/plain, Size: 127 bytes --]

// This code has no variable declarations

void foo() {
    for (; (DWORD) a * b ;)
        ;

    for (; a * b ;)
        ;
}

[-- Attachment #2: fix-for.patch --]
[-- Type: text/plain, Size: 3799 bytes --]

=== modified file 'lisp/progmodes/cc-fonts.el'
--- lisp/progmodes/cc-fonts.el	2010-12-07 12:15:28 +0000
+++ lisp/progmodes/cc-fonts.el	2011-01-25 11:10:00 +0000
@@ -1080,7 +1080,8 @@
 	  ;; o - '<> if the arglist is of angle bracket type;
 	  ;; o - 'arglist if it's some other arglist;
 	  ;; o - nil, if not in an arglist at all.  This includes the
-	  ;;   parenthesised condition which follows "if", "while", etc.
+	  ;;   parenthesised condition which follows "if", "while", etc.,
+	  ;;   but not "for", which is 'arglist after `;'.
 	  context
 	  ;; The position of the next token after the closing paren of
 	  ;; the last detected cast.
@@ -1109,7 +1110,7 @@
 	  ;; `c-forward-decl-or-cast-1' and `c-forward-label' for
 	  ;; later fontification.
 	  (c-record-type-identifiers t)
-	  label-type
+	  label-type paren-state most-enclosing-brace
 	  c-record-ref-identifiers
 	  ;; Make `c-forward-type' calls mark up template arglists if
 	  ;; it finds any.  That's necessary so that we later will
@@ -1171,7 +1172,6 @@
 				 'font-lock-function-name-face))))
 	  (c-font-lock-function-postfix limit))
 
-	 
 	 (setq start-pos (point))
 	 (when
 	     ;; The result of the `if' condition below is true when we don't recognize a
@@ -1189,7 +1189,31 @@
 	    ;; (e.g. "for (").
 	    (let ((type (and (> match-pos (point-min))
 			     (c-get-char-property (1- match-pos) 'c-type))))
-	      (cond ((not (memq (char-before match-pos) '(?\( ?, ?\[ ?<)))
+	      (cond
+               (;; Try to not fontify the second and third clauses of
+		;; `for' statements as declarations.
+		(and (or (eq (char-before match-pos) ?\;)
+			 (save-excursion
+			   ;; Catch things like for(; (DWORD)(int) x &
+			   ;; y; ) without invoking the full might of
+			   ;; c-beginning-of-statement-1.
+			   (goto-char match-pos)
+			   (while (eq (char-before) ?\))
+			     (c-go-list-backward)
+			     (c-backward-syntactic-ws))
+			   (eq (char-before) ?\;)))
+		     
+                     (setq paren-state (c-parse-state))
+                     (setq most-enclosing-brace
+                           (c-most-enclosing-brace paren-state))
+		     (eq (char-after most-enclosing-brace) ?\())
+		
+                ;; After a ";" in a for-block. A declaration can never
+                ;; begin after a `;' if the most enclosing paren is a
+                ;; `('.
+		(setq context 'arglist
+                      c-restricted-<>-arglists t))
+               ((not (memq (char-before match-pos) '(?\( ?, ?\[ ?<)))
 		     (setq context nil
 			   c-restricted-<>-arglists nil))
 		    ;; A control flow expression
@@ -1252,7 +1276,7 @@
 		;; Are we at a declarator?  Try to go back to the declaration
 		;; to check this.  Note that `c-beginning-of-decl-1' is slow,
 		;; so we cache its result between calls.
-		(let (paren-state bod-res encl-pos is-typedef)
+		(let (bod-res encl-pos is-typedef)
 		  (goto-char start-pos)
 		  (save-excursion
 		    (unless (and decl-search-lim
@@ -1318,20 +1342,7 @@
 		;; Back up to the type to fontify the declarator(s).
 		(goto-char (car decl-or-cast))
 
-		(let ((decl-list
-		       (if context
-			   ;; Should normally not fontify a list of
-			   ;; declarators inside an arglist, but the first
-			   ;; argument in the ';' separated list of a "for"
-			   ;; statement is an exception.
-			   (when (eq (char-before match-pos) ?\()
-			     (save-excursion
-			       (goto-char (1- match-pos))
-			       (c-backward-syntactic-ws)
-			       (and (c-simple-skip-symbol-backward)
-				    (looking-at c-paren-stmt-key))))
-			 t)))
-
+                (let ((decl-list (not context)))
 		  ;; Fix the `c-decl-id-start' or `c-decl-type-start' property
 		  ;; before the first declarator if it's a list.
 		  ;; `c-font-lock-declarators' handles the rest.


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2017-07-07 14:47 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-26  6:36 bug#7918: [PATCH] cc-mode: only the first clause of a for-loop should be checked for declarations Daniel Colascione
2016-02-26  6:18 ` Lars Ingebrigtsen
2016-02-26  6:31   ` Daniel Colascione
2016-02-26  6:33     ` Daniel Colascione
2016-03-01 18:02   ` Alan Mackenzie
2016-03-01 18:05     ` Daniel Colascione
2016-04-01 16:18       ` Alan Mackenzie
2016-04-25 18:04         ` Alan Mackenzie
     [not found] ` <handler.7918.D7918.146160769022226.notifdone@debbugs.gnu.org>
2017-06-29  1:06   ` npostavs
2017-07-03 19:09     ` Glenn Morris
2017-07-03 19:46       ` npostavs
2017-07-03 20:18         ` Alan Mackenzie
2017-07-05 15:55           ` Glenn Morris
2017-07-05 20:14             ` Alan Mackenzie
2017-07-06  1:39               ` Glenn Morris
2017-07-07 14:47                 ` Alan Mackenzie

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).