From: Alan Mackenzie Date: Fri, 8 Jan 2016 22:42:47 +0000 (+0000) Subject: Correctly analyze brace arguments in templated C++ function declarations. X-Git-Tag: emacs-25.0.90~231 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=457738ffba806a638ca3597741ecd103241790be;p=emacs.git Correctly analyze brace arguments in templated C++ function declarations. * 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. --- diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index 77e949c59d4..000995c5b53 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el @@ -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, diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 3301d415923..98699df0cab 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -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 -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