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.
This commit is contained in:
Alan Mackenzie 2016-01-08 22:42:47 +00:00
parent d57724a879
commit 457738ffba
2 changed files with 33 additions and 16 deletions

View file

@ -654,23 +654,35 @@ right side of it."
;; Wrappers for common scan-lists cases, mainly because it's almost ;; Wrappers for common scan-lists cases, mainly because it's almost
;; impossible to get a feel for how that function works. ;; impossible to get a feel for how that function works.
(defmacro c-go-list-forward () (defmacro c-go-list-forward (&optional pos limit)
"Move backward across one balanced group of parentheses. "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.
Return POINT when we succeed, NIL when we fail. In the latter case, leave A LIMIT for the search may be given. The start position is assumed to be
point unmoved." before it."
`(c-safe (let ((endpos (scan-lists (point) 1 0))) (let ((res `(c-safe (goto-char (scan-lists ,(or pos `(point)) 1 0)) (point))))
(goto-char endpos) (if limit
endpos))) `(save-restriction
(if ,limit
(narrow-to-region (point-min) ,limit))
,res)
res)))
(defmacro c-go-list-backward () (defmacro c-go-list-backward (&optional pos limit)
"Move backward across one balanced group of parentheses. "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.
Return POINT when we succeed, NIL when we fail. In the latter case, leave A LIMIT for the search may be given. The start position is assumed to be
point unmoved." after it."
`(c-safe (let ((endpos (scan-lists (point) -1 0))) (let ((res `(c-safe (goto-char (scan-lists ,(or pos `(point)) -1 0)) (point))))
(goto-char endpos) (if limit
endpos))) `(save-restriction
(if ,limit
(narrow-to-region ,limit (point-max)))
,res)
res)))
(defmacro c-up-list-forward (&optional pos limit) (defmacro c-up-list-forward (&optional pos limit)
"Return the first position after the list sexp containing POS, "Return the first position after the list sexp containing POS,

View file

@ -5688,8 +5688,8 @@ comment at the start of cc-engine.el for more info."
(c-backward-token-2) (c-backward-token-2)
(setq c-restricted-<>-arglists (setq c-restricted-<>-arglists
(and (not (looking-at c-opt-<>-sexp-key)) (and (not (looking-at c-opt-<>-sexp-key))
(progn (c-backward-syntactic-ws) ; to < or , (progn (c-backward-syntactic-ws) ; to ( or ,
(and (memq (char-before) '(?< ?,)) (and (memq (char-before) '(?\( ?,)) ; what about <?
(not (eq (c-get-char-property (point) 'c-type) (not (eq (c-get-char-property (point) 'c-type)
'c-decl-arg-start))))))) 'c-decl-arg-start)))))))
(or (c-forward-<>-arglist nil) (or (c-forward-<>-arglist nil)
@ -9106,6 +9106,11 @@ comment at the start of cc-engine.el for more info."
(goto-char containing-sexp) (goto-char containing-sexp)
(if (or (save-excursion (if (or (save-excursion
(c-backward-syntactic-ws lim) (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))) (and (> (point) (or lim (point-min)))
(c-on-identifier))) (c-on-identifier)))
(and c-special-brace-lists (and c-special-brace-lists