From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.bugs Subject: bug#33163: Adding a " in c++-mode fills the whole file with red Date: 28 Oct 2018 10:49:06 -0000 Organization: muc.de e.V. Message-ID: <20181028104906.70695.qmail@mail.muc.de> References: <4ffd5027-1201-6a7b-6e82-645a99465404@yandex.ru> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Trace: blaine.gmane.org 1540723690 29450 195.159.176.226 (28 Oct 2018 10:48:10 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 28 Oct 2018 10:48:10 +0000 (UTC) User-Agent: tin/2.4.2-20171224 ("Lochhead") (UNIX) (FreeBSD/11.2-RELEASE-p4 (amd64)) Cc: acm@muc.de, 33163@debbugs.gnu.org To: Konstantin Kharlamov Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Oct 28 11:48:06 2018 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGic1-0007XR-LH for geb-bug-gnu-emacs@m.gmane.org; Sun, 28 Oct 2018 11:48:05 +0100 Original-Received: from localhost ([::1]:39601 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gGie8-0006CU-09 for geb-bug-gnu-emacs@m.gmane.org; Sun, 28 Oct 2018 06:50:16 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:34596) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gGie2-0006A7-4q for bug-gnu-emacs@gnu.org; Sun, 28 Oct 2018 06:50:11 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gGidw-0001ke-Nv for bug-gnu-emacs@gnu.org; Sun, 28 Oct 2018 06:50:09 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:42476) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gGidu-0001jB-6r; Sun, 28 Oct 2018 06:50:04 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gGidu-0002cM-1k; Sun, 28 Oct 2018 06:50:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org, bug-cc-mode@gnu.org Resent-Date: Sun, 28 Oct 2018 10:50:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 33163 X-GNU-PR-Package: emacs,cc-mode X-GNU-PR-Keywords: Original-Received: via spool by 33163-submit@debbugs.gnu.org id=B33163.15407237499991 (code B ref 33163); Sun, 28 Oct 2018 10:50:01 +0000 Original-Received: (at 33163) by debbugs.gnu.org; 28 Oct 2018 10:49:09 +0000 Original-Received: from localhost ([127.0.0.1]:46734 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGid2-0002b4-Uz for submit@debbugs.gnu.org; Sun, 28 Oct 2018 06:49:09 -0400 Original-Received: from colin.muc.de ([193.149.48.1]:37232 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1gGid1-0002aw-I8 for 33163@debbugs.gnu.org; Sun, 28 Oct 2018 06:49:08 -0400 Original-Received: (qmail 70696 invoked by uid 3782); 28 Oct 2018 10:49:06 -0000 In-Reply-To: X-Newsgroups: gnu.emacs.bug X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:151739 Archived-At: In article you wrote= : > This long-standing problem appears occasionally, and only disappears if > you kill the buffer completely, then reopen the file. I never got to > report it because I never could find steps to reproduce it=E2=80=A6 unt= il now > :) Nvm the non-sense code, I reduced testcase as far as I managed. > # Steps to reproduce: > 1. Save the following text in `test.cpp` > int main() { > puts(It's"); > auto foo =3D []()-> void { }; > puts("It's"); > } > 2. Open `emacs -Q ./test.cpp` > 3. Now, the text lacks a quote in the first `puts(It's");`. Add it so > it looks like `puts("It's");`. Essentially, if you'd compile it with > g++, it lacks any syntax error besides `puts` being undeclared. > # Expected > The line with `auto foo=E2=80=A6` is not red. > # Actual > The line with `auto foo=E2=80=A6` (in particular) becomes red. Thanks for taking the trouble to report this bug. Thanks even more for condensing it down to a minimal test case. The following patch should fix it. Would you please apply the patch, recompile .../lisp/progmodes/cc-mode.el, load the new file in to your Emacs (or restart Emacs), then try it out on your real C++ code. Then please let me know whether it's working or not, and if not, how it's going wrong. Thanks! > # Additional information > Emacs version GNU Emacs 27.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ > Version 3.22.30) of 2018-10-01, build with -flto. diff -r 2f7029fa229d cc-mode.el --- a/cc-mode.el Sun Oct 14 20:01:07 2018 +0000 +++ b/cc-mode.el Sun Oct 28 10:20:38 2018 +0000 @@ -1216,21 +1216,21 @@ (if (eq beg-literal-type 'string) (setq c-new-BEG (min (car beg-limits) c-new-BEG)))) =20 - ((< c-new-END (point-max)) - (goto-char (1+ c-new-END)) ; might be a newline. + ((< end (point-max)) + (goto-char (1+ end)) ; might be a newline. ;; In the following regexp, the initial \n caters for a newline ge= tting ;; joined to a preceding \ by the removal of what comes between. (re-search-forward "[\n\r]?\\(\\\\\\(.\\|\n\\|\r\\)\\|[^\\\n\r]\\)= *" nil t) ;; We're at an EOLL or point-max. - (setq c-new-END (min (1+ (point)) (point-max))) - (goto-char c-new-END) - (if (equal (c-get-char-property (1- (point)) 'syntax-table) '(15)) - (if (memq (char-before) '(?\n ?\r)) + (setq c-new-END (max c-new-END (min (1+ (point)) (point-max)))) + (if (equal (c-get-char-property (point) 'syntax-table) '(15)) + (if (memq (char-after) '(?\n ?\r)) ;; Normally terminated invalid string. - (progn + (let ((eoll-1 (point))) + (forward-char) (backward-sexp) - (c-clear-char-property (1- c-new-END) 'syntax-table) + (c-clear-char-property eoll-1 'syntax-table) (c-clear-char-property (point) 'syntax-table)) ;; Opening " at EOB. (c-clear-char-property (1- (point)) 'syntax-table)) @@ -1238,7 +1238,7 @@ ;; Opening " on last line of text (without EOL). (c-clear-char-property (point) 'syntax-table)))) =20 - (t (goto-char c-new-END) + (t (goto-char end) ; point-max (if (c-search-backward-char-property 'syntax-table '(15) c-new-BEG) (c-clear-char-property (point) 'syntax-table)))) =20 @@ -1327,9 +1327,9 @@ (while (progn (setq s (parse-partial-sexp (point) c-new-END nil nil s 'syntax-table)) - (and (not (nth 3 s)) - (< (point) c-new-END) - (not (memq (char-before) c-string-delims))))) + (and (< (point) c-new-END) + (or (not (nth 3 s)) + (not (memq (char-before) c-string-delims)= ))))) ;; We're at the start of a string. (memq (char-before) c-string-delims))) (if (c-unescaped-nls-in-string-p (1- (point))) --=20 Alan Mackenzie (Nuremberg, Germany).