From: Alan Mackenzie Date: Wed, 29 Jun 2016 20:17:39 +0000 (+0000) Subject: Fix C-M-a in a C function finding the start of a macro preceding it. X-Git-Tag: emacs-26.0.90~1840^2~143 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=681d3f1f582d9b549f41ef1eacff42abb98f878d;p=emacs.git 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. --- diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi index 82f8cbc2e33..f311ec8a3a5 100644 --- a/doc/misc/cc-mode.texi +++ b/doc/misc/cc-mode.texi @@ -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 diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 4bc4056081b..75f07e334d2 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -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("))) diff --git a/lisp/progmodes/cc-vars.el b/lisp/progmodes/cc-vars.el index f03aec2804b..7a6f4baaa73 100644 --- a/lisp/progmodes/cc-vars.el +++ b/lisp/progmodes/cc-vars.el @@ -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)