Fix C-M-a in a C function finding the start of a macro preceding it.

Also amend some pertinent documentation.  This fixes bug #23818.

* lisp/progmodes/cc-engine.el (c-beginning-of-decl-1): Also check for a
virtual semicolon at a place where we check for other types of statement ends.

* lisp/progmodes/cc-vars.el (c-macro-nacmes-with-semicolon): Remove from the
doc string the bit saying that the variable is a prototype and liable to
change.

* doc/misc/cc-mode.texi (Macros with ;): Enhance, stating that configuring
macros with semicolon can prevent C-M-a missing the beginning of defun.
This commit is contained in:
Alan Mackenzie 2016-06-29 20:17:39 +00:00
parent 4a2a1eba09
commit 681d3f1f58
3 changed files with 7 additions and 7 deletions

View file

@ -6727,9 +6727,11 @@ Macros which needn't (or mustn't) be followed by a semicolon when you
invoke them, @dfn{macros with semicolons}, are very common. These can
cause @ccmode{} to parse the next line wrongly as a
@code{statement-cont} (@pxref{Function Symbols}) and thus mis-indent
it.
it. At the top level, a macro invocation before a defun start can
cause, for example, @code{c-beginning-of-defun} (@kbd{C-M-a}) not to
find the correct start of the current function.
You can prevent this by specifying which macros have semicolons. It
You can prevent these by specifying which macros have semicolons. It
doesn't matter whether or not such a macro has a parameter list:
@defopt c-macro-names-with-semicolon

View file

@ -9298,7 +9298,8 @@ comment at the start of cc-engine.el for more info."
(/= last-stmt-start (point))
(progn
(c-backward-syntactic-ws lim)
(not (memq (char-before) '(?\; ?} ?: nil))))
(not (or (memq (char-before) '(?\; ?} ?: nil))
(c-at-vsemi-p))))
(save-excursion
(backward-char)
(not (looking-at "\\s(")))

View file

@ -1702,10 +1702,7 @@ the regular expression must match only valid identifiers.
If you change this variable's value, call the function
`c-make-macros-with-semi-re' to set the necessary internal
variables.
Note that currently \(2008-11-04) this variable is a prototype,
and is likely to disappear or change its form soon.")
variables.")
(make-variable-buffer-local 'c-macro-names-with-semicolon)
(put 'c-macro-names-with-semicolon 'safe-local-variable
#'c-string-or-string-list-p)