]> code.delx.au - gnu-emacs/commitdiff
Correctly analyze brace arguments in templated C++ function declarations.
authorAlan Mackenzie <acm@muc.de>
Fri, 8 Jan 2016 22:42:47 +0000 (22:42 +0000)
committerAlan Mackenzie <acm@muc.de>
Fri, 8 Jan 2016 22:42:47 +0000 (22:42 +0000)
* lisp/progmodes/cc-defs.el (c-go-list-forward, c-go-list-backward): add
POS and LIMIT parameters, like the other c-go-list-* functions have.

* lisp/progmodes/cc-engine.el (c-restore-<>-properties): Check backwards
for a ?\( rather than a ?<.  (c-looking-at-inexpr-block): Handle names
followed by template specifiers.

lisp/progmodes/cc-defs.el
lisp/progmodes/cc-engine.el

index 77e949c59d40a279a98cd5fbd90b64800e755cc7..000995c5b5332cea6b0850fad53a96c88d2110a2 100644 (file)
@@ -654,23 +654,35 @@ right side of it."
 ;; Wrappers for common scan-lists cases, mainly because it's almost
 ;; impossible to get a feel for how that function works.
 
-(defmacro c-go-list-forward ()
-  "Move backward across one balanced group of parentheses.
-
-Return POINT when we succeed, NIL when we fail.  In the latter case, leave
-point unmoved."
-  `(c-safe (let ((endpos (scan-lists (point) 1 0)))
-            (goto-char endpos)
-            endpos)))
-
-(defmacro c-go-list-backward ()
-  "Move backward across one balanced group of parentheses.
-
-Return POINT when we succeed, NIL when we fail.  In the latter case, leave
-point unmoved."
-  `(c-safe (let ((endpos (scan-lists (point) -1 0)))
-            (goto-char endpos)
-            endpos)))
+(defmacro c-go-list-forward (&optional pos limit)
+  "Move forward across one balanced group of parentheses starting at POS or
+point.  Return POINT when we succeed, NIL when we fail.  In the latter case,
+leave point unmoved.
+
+A LIMIT for the search may be given.  The start position is assumed to be
+before it."
+  (let ((res `(c-safe (goto-char (scan-lists ,(or pos `(point)) 1 0)) (point))))
+    (if limit
+       `(save-restriction
+          (if ,limit
+              (narrow-to-region (point-min) ,limit))
+          ,res)
+      res)))
+
+(defmacro c-go-list-backward (&optional pos limit)
+  "Move backward across one balanced group of parentheses starting at POS or
+point.  Return POINT when we succeed, NIL when we fail.  In the latter case,
+leave point unmoved.
+
+A LIMIT for the search may be given.  The start position is assumed to be
+after it."
+  (let ((res `(c-safe (goto-char (scan-lists ,(or pos `(point)) -1 0)) (point))))
+    (if limit
+       `(save-restriction
+          (if ,limit
+              (narrow-to-region ,limit (point-max)))
+          ,res)
+      res)))
 
 (defmacro c-up-list-forward (&optional pos limit)
   "Return the first position after the list sexp containing POS,
index 3301d4159230400edccb874787d5d53ee528e074..98699df0caba62998e2e40630f1bd31d06823338 100644 (file)
@@ -5688,8 +5688,8 @@ comment at the start of cc-engine.el for more info."
        (c-backward-token-2)
        (setq c-restricted-<>-arglists
             (and (not (looking-at c-opt-<>-sexp-key))
-                 (progn (c-backward-syntactic-ws) ; to < or ,
-                        (and (memq (char-before) '(?< ?,))
+                 (progn (c-backward-syntactic-ws) ; to ( or ,
+                        (and (memq (char-before) '(?\( ?,)) ; what about <?
                              (not (eq (c-get-char-property (point) 'c-type)
                                       'c-decl-arg-start)))))))
       (or (c-forward-<>-arglist nil)
@@ -9106,6 +9106,11 @@ comment at the start of cc-engine.el for more info."
            (goto-char containing-sexp)
            (if (or (save-excursion
                      (c-backward-syntactic-ws lim)
+                     (while (and (eq (char-before) ?>)
+                                 (c-get-char-property (1- (point))
+                                                      'syntax-table)
+                                 (c-go-list-backward nil lim))
+                       (c-backward-syntactic-ws lim))
                      (and (> (point) (or lim (point-min)))
                           (c-on-identifier)))
                    (and c-special-brace-lists