CC Mode: Don't do c-backward-syntactic-ws following a forward movement

This was happening in, e.g., c-forward-type, which moves over whitespace at
the end of the scanned type.  This WS movement can exit a comment or a macro,
such that a c-backward-syntactic-ws does not return to the desired point, but
to before the entire comment/macro.

* lisp/progmodes/cc-engine.el (c-forward-keyword-prefixed-id)
(c-forward-id-comma-list, c-forward-noise-clause, c-forward-keyword-clause)
(c-forward-name, c-forward-type): Add a new &optional parameter `stop-at-end'
which when non-nil means "do not move over syntactic WS after performing the
main job", and adapt the internals of these macros and functions accordingly.
(c-forward-declarator, c-forward-decl-or-cast-1): In the calls to
c-forward-type and c-forward-name, set the stop-at-end argument to t, and call
c-forward-sytactic-ws later.
This commit is contained in:
Alan Mackenzie 2023-01-23 20:25:53 +00:00
parent 3e62ddc0d8
commit 29a8a1885d

View file

@ -8288,10 +8288,17 @@ multi-line strings (but not C++, for example)."
(setq c-record-ref-identifiers
(cons range c-record-ref-identifiers))))))
(defmacro c-forward-keyword-prefixed-id (type)
(defmacro c-forward-keyword-prefixed-id (type &optional stop-at-end)
;; Used internally in `c-forward-keyword-clause' to move forward
;; over a type (if TYPE is 'type) or a name (otherwise) which
;; possibly is prefixed by keywords and their associated clauses.
;; Point should be at the type/name or a preceding keyword at the start of
;; the macro, and it is left at the first token following the type/name,
;; or (when STOP-AT-END is non-nil) immediately after that type/name.
;;
;; Note that both parameters are evaluated at compile time, not run time,
;; so they must be constants.
;;
;; Try with a type/name first to not trip up on those that begin
;; with a keyword. Return t if a known or found type is moved
;; over. The point is clobbered if nil is returned. If range
@ -8300,51 +8307,84 @@ multi-line strings (but not C++, for example)."
;;
;; This macro might do hidden buffer changes.
(declare (debug t))
`(let (res)
`(let (res pos)
(setq c-last-identifier-range nil)
(while (if (setq res ,(if (eq type 'type)
'(c-forward-type)
'(c-forward-name)))
nil
(cond ((looking-at c-keywords-regexp)
(c-forward-keyword-clause 1))
((and c-opt-cpp-prefix
(looking-at c-noise-macro-with-parens-name-re))
(c-forward-noise-clause)))))
`(c-forward-type nil ,stop-at-end)
`(c-forward-name ,stop-at-end)))
(progn
(setq pos (point))
nil)
(and
(cond ((looking-at c-keywords-regexp)
(c-forward-keyword-clause 1 t))
((and c-opt-cpp-prefix
(looking-at c-noise-macro-with-parens-name-re))
(c-forward-noise-clause t)))
(progn
(setq pos (point))
(c-forward-syntactic-ws)
t))))
(when (memq res '(t known found prefix maybe))
(when c-record-type-identifiers
,(if (eq type 'type)
'(c-record-type-id c-last-identifier-range)
'(c-record-ref-id c-last-identifier-range)))
,(if (eq type 'type)
'(c-record-type-id c-last-identifier-range)
'(c-record-ref-id c-last-identifier-range)))
(when pos
(goto-char pos)
,(unless stop-at-end
`(c-forward-syntactic-ws)))
t)))
(defmacro c-forward-id-comma-list (type update-safe-pos)
(defmacro c-forward-id-comma-list (type update-safe-pos &optional stop-at-end)
;; Used internally in `c-forward-keyword-clause' to move forward
;; over a comma separated list of types or names using
;; `c-forward-keyword-prefixed-id'.
;; `c-forward-keyword-prefixed-id'. Point should start at the first token
;; after the already scanned type/name, or (if STOP-AT-END is non-nil)
;; immediately after that type/name. Point is left either before or
;; after the whitespace following the last type/name in the list, depending
;; on whether STOP-AT-END is non-nil or nil. The return value is without
;; significance.
;;
;; Note that all three parameters are evaluated at compile time, not run
;; time, so they must be constants.
;;
;; This macro might do hidden buffer changes.
(declare (debug t))
`(while (and (progn
,(when update-safe-pos
'(setq safe-pos (point)))
(eq (char-after) ?,))
(progn
(forward-char)
(c-forward-syntactic-ws)
(c-forward-keyword-prefixed-id ,type)))))
`(let ((pos (point)))
(while (and (progn
,(when update-safe-pos
`(setq safe-pos (point)))
(setq pos (point))
(c-forward-syntactic-ws)
(eq (char-after) ?,))
(progn
(forward-char)
(setq pos (point))
(c-forward-syntactic-ws)
(c-forward-keyword-prefixed-id ,type t))))
(goto-char pos)
,(unless stop-at-end
`(c-forward-syntactic-ws))))
(defun c-forward-noise-clause ()
(defun c-forward-noise-clause (&optional stop-at-end)
;; Point is at a c-noise-macro-with-parens-names macro identifier. Go
;; forward over this name, any parenthesis expression which follows it, and
;; any syntactic WS, ending up at the next token or EOB. If there is an
;; any syntactic WS, ending up either at the next token or EOB or (when
;; STOP-AT-END is non-nil) directly after the clause. If there is an
;; unbalanced paren expression, leave point at it. Always Return t.
(or (zerop (c-forward-token-2))
(goto-char (point-max)))
(if (and (eq (char-after) ?\()
(c-go-list-forward))
(let (pos)
(or (c-forward-over-token)
(goto-char (point-max)))
(setq pos (point))
(c-forward-syntactic-ws)
(when (and (eq (char-after) ?\()
(c-go-list-forward))
(setq pos (point)))
(goto-char pos)
(unless stop-at-end
(c-forward-syntactic-ws))
t)
t))
(defun c-forward-noise-clause-not-macro-decl (maybe-parens)
;; Point is at a noise macro identifier, which, when MAYBE-PARENS is
@ -8378,11 +8418,12 @@ multi-line strings (but not C++, for example)."
(goto-char here)
nil)))
(defun c-forward-keyword-clause (match)
(defun c-forward-keyword-clause (match &optional stop-at-end)
;; Submatch MATCH in the current match data is assumed to surround a
;; token. If it's a keyword, move over it and any immediately
;; following clauses associated with it, stopping at the start of
;; the next token. t is returned in that case, otherwise the point
;; following clauses associated with it, stopping either at the start
;; of the next token, or (when STOP-AT-END is non-nil) at the end
;; of the clause. t is returned in that case, otherwise the point
;; stays and nil is returned. The kind of clauses that are
;; recognized are those specified by `c-type-list-kwds',
;; `c-ref-list-kwds', `c-colon-type-list-kwds',
@ -8412,19 +8453,23 @@ multi-line strings (but not C++, for example)."
(when kwd-sym
(goto-char (match-end match))
(c-forward-syntactic-ws)
(setq safe-pos (point))
(c-forward-syntactic-ws)
(cond
((and (c-keyword-member kwd-sym 'c-type-list-kwds)
(c-forward-keyword-prefixed-id type))
(c-forward-keyword-prefixed-id type t))
;; There's a type directly after a keyword in `c-type-list-kwds'.
(c-forward-id-comma-list type t))
(setq safe-pos (point))
(c-forward-syntactic-ws)
(c-forward-id-comma-list type t t))
((and (c-keyword-member kwd-sym 'c-ref-list-kwds)
(c-forward-keyword-prefixed-id ref))
(c-forward-keyword-prefixed-id ref t))
;; There's a name directly after a keyword in `c-ref-list-kwds'.
(c-forward-id-comma-list ref t))
(setq safe-pos (point))
(c-forward-syntactic-ws)
(c-forward-id-comma-list ref t t))
((and (c-keyword-member kwd-sym 'c-paren-any-kwds)
(eq (char-after) ?\())
@ -8444,20 +8489,20 @@ multi-line strings (but not C++, for example)."
(goto-char (match-end 0)))))
(goto-char pos)
(c-forward-syntactic-ws)
(setq safe-pos (point))))
(setq safe-pos (point)))
(c-forward-syntactic-ws))
((and (c-keyword-member kwd-sym 'c-<>-sexp-kwds)
(eq (char-after) ?<)
(c-forward-<>-arglist (c-keyword-member kwd-sym 'c-<>-type-kwds)))
(c-forward-syntactic-ws)
(setq safe-pos (point)))
(setq safe-pos (point))
(c-forward-syntactic-ws))
((and (c-keyword-member kwd-sym 'c-nonsymbol-sexp-kwds)
(not (looking-at c-symbol-start))
(c-safe (c-forward-sexp) t))
(c-forward-syntactic-ws)
(setq safe-pos (point)))
(setq safe-pos (point))
(c-forward-syntactic-ws))
((and (c-keyword-member kwd-sym 'c-protection-kwds)
(or (null c-post-protection-token)
@ -8467,8 +8512,8 @@ multi-line strings (but not C++, for example)."
(not (c-end-of-current-token))))))
(if c-post-protection-token
(goto-char (match-end 0)))
(c-forward-syntactic-ws)
(setq safe-pos (point))))
(setq safe-pos (point))
(c-forward-syntactic-ws)))
(when (c-keyword-member kwd-sym 'c-colon-type-list-kwds)
(if (eq (char-after) ?:)
@ -8477,8 +8522,10 @@ multi-line strings (but not C++, for example)."
(progn
(forward-char)
(c-forward-syntactic-ws)
(when (c-forward-keyword-prefixed-id type)
(c-forward-id-comma-list type t)))
(when (c-forward-keyword-prefixed-id type t)
(setq safe-pos (point))
(c-forward-syntactic-ws)
(c-forward-id-comma-list type t t)))
;; Not at the colon, so stop here. But the identifier
;; ranges in the type list later on should still be
;; recorded.
@ -8488,15 +8535,18 @@ multi-line strings (but not C++, for example)."
;; this one, we move forward to the colon following the
;; clause matched above.
(goto-char safe-pos)
(c-forward-syntactic-ws)
(c-forward-over-colon-type-list))
(progn
(c-forward-syntactic-ws)
(c-forward-keyword-prefixed-id type))
(c-forward-keyword-prefixed-id type t))
;; There's a type after the `c-colon-type-list-re' match
;; after a keyword in `c-colon-type-list-kwds'.
(c-forward-id-comma-list type nil))))
(goto-char safe-pos)
(unless stop-at-end
(c-forward-syntactic-ws))
t)))
;; cc-mode requires cc-fonts.
@ -8827,11 +8877,12 @@ multi-line strings (but not C++, for example)."
(/= (point) start))))
(defun c-forward-name ()
;; Move forward over a complete name if at the beginning of one,
;; stopping at the next following token. A keyword, as such,
;; doesn't count as a name. If the point is not at something that
;; is recognized as a name then it stays put.
(defun c-forward-name (&optional stop-at-end)
;; Move forward over a complete name if at the beginning of one, stopping
;; either at the next following token or (when STOP-AT-END is non-nil) at
;; the end of the name. A keyword, as such, doesn't count as a name. If
;; the point is not at something that is recognized as a name then it stays
;; put.
;;
;; A name could be something as simple as "foo" in C or something as
;; complex as "X<Y<class A<int>::B, BIT_MAX >> b>, ::operator<> ::
@ -8853,7 +8904,7 @@ multi-line strings (but not C++, for example)."
;;
;; This function might do hidden buffer changes.
(let ((pos (point)) (start (point)) res id-start id-end
(let ((pos (point)) pos2 pos3 (start (point)) res id-start id-end
;; Turn off `c-promote-possible-types' here since we might
;; call `c-forward-<>-arglist' and we don't want it to promote
;; every suspect thing in the arglist to a type. We're
@ -8895,7 +8946,7 @@ multi-line strings (but not C++, for example)."
(c-forward-syntactic-ws lim+)
(cond ((eq (char-before id-end) ?e)
;; Got "... ::template".
(let ((subres (c-forward-name)))
(let ((subres (c-forward-name t)))
(when subres
(setq pos (point)
res subres))))
@ -8907,7 +8958,7 @@ multi-line strings (but not C++, for example)."
(and (eq (c-forward-token-2) 0)
(not (eq (char-after) ?\())))))
;; Got a cast operator.
(when (c-forward-type)
(when (c-forward-type nil t)
(setq pos (point)
res 'operator)
;; Now we should match a sequence of either
@ -8931,8 +8982,8 @@ multi-line strings (but not C++, for example)."
(forward-char)
t)))))
(while (progn
(c-forward-syntactic-ws lim+)
(setq pos (point))
(c-forward-syntactic-ws lim+)
(and
(<= (point) lim+)
(looking-at c-opt-type-modifier-key)))
@ -8947,30 +8998,34 @@ multi-line strings (but not C++, for example)."
;; operator"" has an (?)optional tag after it.
(progn
(goto-char (match-end 0))
(setq pos2 (point))
(c-forward-syntactic-ws lim+)
(when (c-on-identifier)
(c-forward-token-2 1 nil lim+)))
(goto-char (match-end 0))
(c-forward-syntactic-ws lim+))
(setq pos (point)
(c-forward-over-token nil lim+)))
(goto-char (match-end 0))
(setq pos2 (point))
(c-forward-syntactic-ws lim+))
(setq pos pos2
res 'operator)))
nil)
;; `id-start' is equal to `id-end' if we've jumped over
;; an identifier that doesn't end with a symbol token.
;; That can occur e.g. for Java import directives on the
;; That can occur e.g. for Java import directives of the
;; form "foo.bar.*".
(when (and id-start (/= id-start id-end))
(setq c-last-identifier-range
(cons id-start id-end)))
(goto-char id-end)
(setq pos (point))
(c-forward-syntactic-ws lim+)
(setq pos (point)
res t)))
(setq res t)))
(progn
(goto-char pos)
(c-forward-syntactic-ws lim+)
(setq pos3 (point))
(when (or c-opt-identifier-concat-key
c-recognize-<>-arglists)
@ -8981,7 +9036,6 @@ multi-line strings (but not C++, for example)."
;; cases with tricky syntactic whitespace that aren't
;; covered in `c-identifier-key'.
(goto-char (match-end 0))
(c-forward-syntactic-ws lim+)
t)
((and c-recognize-<>-arglists
@ -8993,11 +9047,12 @@ multi-line strings (but not C++, for example)."
;; `lim+'.
(setq lim+ (c-determine-+ve-limit 500))
(setq pos2 (point))
(c-forward-syntactic-ws lim+)
(unless (eq (char-after) ?\()
(setq c-last-identifier-range nil)
(c-add-type start (1+ pos)))
(setq pos (point))
(c-add-type start (1+ pos3)))
(setq pos pos2)
(if (and c-opt-identifier-concat-key
(looking-at c-opt-identifier-concat-key))
@ -9007,7 +9062,7 @@ multi-line strings (but not C++, for example)."
(progn
(when (and c-record-type-identifiers id-start)
(c-record-ref-id (cons id-start id-end)))
(forward-char 2)
(goto-char (match-end 0))
(c-forward-syntactic-ws lim+)
t)
@ -9019,11 +9074,14 @@ multi-line strings (but not C++, for example)."
)))))
(goto-char pos)
(unless stop-at-end
(c-forward-syntactic-ws lim+))
res))
(defun c-forward-type (&optional brace-block-too)
(defun c-forward-type (&optional brace-block-too stop-at-end)
;; Move forward over a type spec if at the beginning of one,
;; stopping at the next following token. The keyword "typedef"
;; stopping at the next following token (if STOP-AT-END is nil) or
;; at the end of the type spec (otherwise). The keyword "typedef"
;; isn't part of a type spec here.
;;
;; BRACE-BLOCK-TOO, when non-nil, means move over the brace block in
@ -9072,6 +9130,7 @@ multi-line strings (but not C++, for example)."
(when (looking-at c-no-type-key)
(setq res 'no-id)))
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws)
(or (eq res 'no-id)
(setq res 'prefix))))
@ -9080,32 +9139,41 @@ multi-line strings (but not C++, for example)."
(cond
((looking-at c-typeof-key) ; e.g. C++'s "decltype".
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws)
(setq res (and (eq (char-after) ?\()
(c-safe (c-forward-sexp))
'decltype))
(if res
(c-forward-syntactic-ws)
(progn
(setq pos (point))
(c-forward-syntactic-ws))
(goto-char start)))
((looking-at c-type-prefix-key) ; e.g. "struct", "class", but NOT
; "typedef".
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws)
(while (cond
((looking-at c-decl-hangon-key)
(c-forward-keyword-clause 1))
(c-forward-keyword-clause 1 t)
(setq pos (point))
(c-forward-syntactic-ws))
((looking-at c-pack-key)
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws))
((and c-opt-cpp-prefix
(looking-at c-noise-macro-with-parens-name-re))
(c-forward-noise-clause))))
(c-forward-noise-clause t)
(setq pos (point))
(c-forward-syntactic-ws))))
(setq id-start (point))
(setq name-res (c-forward-name t))
(setq pos (point))
(setq name-res (c-forward-name))
(setq res (not (null name-res)))
(when (eq name-res t)
;; With some keywords the name can be used without the prefix, so we
@ -9113,21 +9181,21 @@ multi-line strings (but not C++, for example)."
(when (save-excursion
(goto-char post-prefix-pos)
(looking-at c-self-contained-typename-key))
(c-add-type pos (save-excursion
(c-backward-syntactic-ws)
(point))))
(c-add-type id-start
(point)))
(when (and c-record-type-identifiers
c-last-identifier-range)
(c-record-type-id c-last-identifier-range)))
(c-forward-syntactic-ws)
(when (and brace-block-too
(memq res '(t nil))
(eq (char-after) ?\{)
(save-excursion
(c-safe
(progn (c-forward-sexp)
(c-forward-syntactic-ws)
(setq pos (point))))))
(goto-char pos)
(c-forward-syntactic-ws)
(setq res t))
(unless res (goto-char start))) ; invalid syntax
@ -9141,7 +9209,7 @@ multi-line strings (but not C++, for example)."
(if (looking-at c-identifier-start)
(save-excursion
(setq id-start (point)
name-res (c-forward-name))
name-res (c-forward-name t))
(when name-res
(setq id-end (point)
id-range c-last-identifier-range))))
@ -9154,8 +9222,9 @@ multi-line strings (but not C++, for example)."
(>= (save-excursion
(save-match-data
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws)
(setq pos (point))))
pos))
id-end)
(setq res nil)))))
;; Looking at a primitive or known type identifier. We've
@ -9163,7 +9232,7 @@ multi-line strings (but not C++, for example)."
;; known type match only is a prefix of another name.
(setq id-end (match-end 1))
(when (and c-record-type-identifiers
(or c-promote-possible-types (eq res t)))
(c-record-type-id (cons (match-beginning 1) (match-end 1))))
@ -9173,35 +9242,41 @@ multi-line strings (but not C++, for example)."
(looking-at c-opt-type-component-key)))
;; There might be more keywords for the type.
(let (safe-pos)
(c-forward-keyword-clause 1)
(c-forward-keyword-clause 1 t)
(while (progn
(setq safe-pos (point))
(c-forward-syntactic-ws)
(looking-at c-opt-type-component-key))
(when (and c-record-type-identifiers
(looking-at c-primitive-type-key))
(c-record-type-id (cons (match-beginning 1)
(match-end 1))))
(c-forward-keyword-clause 1))
(c-forward-keyword-clause 1 t))
(if (looking-at c-primitive-type-key)
(progn
(when c-record-type-identifiers
(c-record-type-id (cons (match-beginning 1)
(match-end 1))))
(c-forward-keyword-clause 1)
(c-forward-keyword-clause 1 t)
(setq res t))
(goto-char safe-pos)
(setq res 'prefix)))
(unless (save-match-data (c-forward-keyword-clause 1))
(setq res 'prefix))
(setq pos (point)))
(if (save-match-data (c-forward-keyword-clause 1 t))
(setq pos (point))
(if pos
(goto-char pos)
(goto-char (match-end 1))
(c-forward-syntactic-ws)))))
(setq pos (point)))))
(c-forward-syntactic-ws))
((and (eq name-res t)
(eq res 'prefix)
(c-major-mode-is 'c-mode)
(save-excursion
(goto-char id-end)
(setq pos (point))
(c-forward-syntactic-ws)
(and (not (looking-at c-symbol-start))
(not (looking-at c-type-decl-prefix-key)))))
;; A C specifier followed by an implicit int, e.g.
@ -9213,13 +9288,11 @@ multi-line strings (but not C++, for example)."
(cond ((eq name-res t)
;; A normal identifier.
(goto-char id-end)
(setq pos (point))
(if (or res c-promote-possible-types)
(progn
(when (not (eq c-promote-possible-types 'just-one))
(c-add-type id-start (save-excursion
(goto-char id-end)
(c-backward-syntactic-ws)
(point))))
(c-add-type id-start id-end))
(when (and c-record-type-identifiers id-range)
(c-record-type-id id-range))
(unless res
@ -9233,6 +9306,7 @@ multi-line strings (but not C++, for example)."
((eq name-res 'template)
;; A template is sometimes a type.
(goto-char id-end)
(setq pos (point))
(c-forward-syntactic-ws)
(setq res
(if (eq (char-after) ?\()
@ -9258,6 +9332,7 @@ multi-line strings (but not C++, for example)."
(when c-opt-type-modifier-key
(while (looking-at c-opt-type-modifier-key) ; e.g. "const", "volatile"
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws)
(setq res t)))
@ -9268,11 +9343,13 @@ multi-line strings (but not C++, for example)."
(when c-opt-type-suffix-key ; e.g. "..."
(while (looking-at c-opt-type-suffix-key)
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws)))
;; Skip any "WS" identifiers (e.g. "final" or "override" in C++)
(while (looking-at c-type-decl-suffix-ws-ids-key)
(goto-char (match-end 1))
(setq pos (point))
(c-forward-syntactic-ws)
(setq res t))
@ -9296,8 +9373,9 @@ multi-line strings (but not C++, for example)."
(progn
(goto-char (match-end 1))
(c-forward-syntactic-ws)
(setq subres (c-forward-type))))
(setq subres (c-forward-type nil t))
(setq pos (point))))
(progn
;; If either operand certainly is a type then both are, but we
;; don't let the existence of the operator itself promote two
@ -9332,9 +9410,11 @@ multi-line strings (but not C++, for example)."
;; `nconc' doesn't mind that the tail of
;; `c-record-found-types' is t.
(nconc c-record-found-types
c-record-type-identifiers))))
c-record-type-identifiers)))))))
(goto-char pos))))
(goto-char pos)
(unless stop-at-end
(c-forward-syntactic-ws))
(when (and c-record-found-types (memq res '(known found)) id-range)
(setq c-record-found-types
@ -9737,7 +9817,7 @@ point unchanged and return nil."
;; (e.g. "," or ";" or "}").
(let ((here (point))
id-start id-end brackets-after-id paren-depth decorated
got-init arglist double-double-quote)
got-init arglist double-double-quote pos)
(or limit (setq limit (point-max)))
(if (and
(< (point) limit)
@ -9771,6 +9851,7 @@ point unchanged and return nil."
(eq (char-after (1+ (point))) ?\"))
(setq double-double-quote t))
(goto-char (match-end 0))
(setq pos (point))
(c-forward-syntactic-ws limit)
(setq got-identifier t)
nil)
@ -9783,7 +9864,10 @@ point unchanged and return nil."
;; prefix only if it specifies a member pointer.
(progn
(setq id-start (point))
(when (c-forward-name)
(when (c-forward-name t)
(setq pos (point))
(c-forward-syntactic-ws limit)
(if (save-match-data
(looking-at "\\(::\\)"))
;; We only check for a trailing "::" and
@ -9812,10 +9896,12 @@ point unchanged and return nil."
(setq id-start (point)))
(cond
((or got-identifier
(c-forward-name))
(save-excursion
(c-backward-syntactic-ws)
(setq id-end (point))))
(c-forward-name t))
(setq id-end
(or pos
(point)))
(c-forward-syntactic-ws limit)
t)
(accept-anon
(setq id-start nil id-end nil)
t)
@ -10569,11 +10655,11 @@ This function might do hidden buffer changes."
(or got-identifier
(and (looking-at c-identifier-start)
(setq pos (point))
(setq got-identifier (c-forward-name))
(setq got-identifier (c-forward-name t))
(save-excursion
(c-backward-syntactic-ws)
(c-simple-skip-symbol-backward)
(setq identifier-start (point)))
(progn (c-forward-syntactic-ws) t)
(setq name-start pos))
(when (looking-at "[0-9]")
(setq got-number t)) ; We probably have an arithmetic expression.
@ -10796,8 +10882,7 @@ This function might do hidden buffer changes."
type-start
(progn
(goto-char type-start)
(c-forward-type)
(c-backward-syntactic-ws)
(c-forward-type nil t)
(point)))))))))
;; Got a declaration of the form "foo bar (gnu);" or "bar
;; (gnu);" where we've recognized "bar" as the type and "gnu"
@ -11121,8 +11206,7 @@ This function might do hidden buffer changes."
(space-after-type
(save-excursion
(goto-char type-start)
(and (c-forward-type)
(progn (c-backward-syntactic-ws) t)
(and (c-forward-type nil t)
(or (eolp)
(memq (char-after) '(?\ ?\t)))))))
(when (not (eq (not space-before-id)