diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 0964c04b899..0c338fa3868 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -327,6 +327,8 @@ comment at the start of cc-engine.el for more info." (when (or (null lim) (>= here lim)) (save-match-data + ;; Note the similarity of the code here to some in + ;; `c-backward-sws'. (while (progn (while (eq (char-before (1- (point))) ?\\) @@ -2461,17 +2463,34 @@ comment at the start of cc-engine.el for more info." (/= cmt-skip-pos simple-ws-beg) (c-beginning-of-macro)) ;; Inside a cpp directive. See if it should be skipped over. - (let ((cpp-beg (point))) + (let ((cpp-beg (point)) + pause pos) - ;; Move back over all line continuations in the region skipped - ;; over by `c-backward-comments'. If we go past it then we - ;; started inside the cpp directive. + ;; Move back over all line continuations and block comments in + ;; the region skipped over by `c-backward-comments'. If we go + ;; past it then we started inside the cpp directive. (goto-char simple-ws-beg) (beginning-of-line) - (while (and (> (point) cmt-skip-pos) - (progn (backward-char) - (eq (char-before) ?\\))) - (beginning-of-line)) + ;; Note the similarity of the code here to some in + ;; `c-beginning-of-macro'. + (setq pause (point)) + (while + (progn + (while (and (> (point) cmt-skip-pos) + (progn (backward-char) + (eq (char-before) ?\\))) + (beginning-of-line)) + (setq pos (point)) + (when (and c-last-c-comment-end-on-line-re + (re-search-forward + c-last-c-comment-end-on-line-re pause t)) + (goto-char (match-end 1)) + (if (c-backward-single-comment) + (progn + (beginning-of-line) + (setq pause (point))) + (goto-char pos) + nil)))) (if (< (point) cmt-skip-pos) ;; Don't move past the cpp directive if we began inside