From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Konstantin Kharlamov Newsgroups: gmane.emacs.bugs Subject: bug#33163: Adding a " in c++-mode fills the whole file with red Date: Sun, 28 Oct 2018 14:21:11 +0300 Message-ID: References: <20181028104906.70695.qmail@mail.muc.de> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1540725610 30301 195.159.176.226 (28 Oct 2018 11:20:10 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 28 Oct 2018 11:20:10 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 Cc: 33163@debbugs.gnu.org To: Alan Mackenzie Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Oct 28 12:20:05 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 1gGj6z-0007m3-2n for geb-bug-gnu-emacs@m.gmane.org; Sun, 28 Oct 2018 12:20:05 +0100 Original-Received: from localhost ([::1]:39645 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gGj95-0006qq-9F for geb-bug-gnu-emacs@m.gmane.org; Sun, 28 Oct 2018 07:22:15 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:38649) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gGj8x-0006qk-3C for bug-gnu-emacs@gnu.org; Sun, 28 Oct 2018 07:22:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gGj8t-0001OQ-Ue for bug-gnu-emacs@gnu.org; Sun, 28 Oct 2018 07:22:07 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:42490) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gGj8t-0001MK-Lo; Sun, 28 Oct 2018 07:22:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1gGj8s-0003Sd-93; Sun, 28 Oct 2018 07:22:03 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Konstantin Kharlamov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org, bug-cc-mode@gnu.org Resent-Date: Sun, 28 Oct 2018 11:22:02 +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.154072568913262 (code B ref 33163); Sun, 28 Oct 2018 11:22:02 +0000 Original-Received: (at 33163) by debbugs.gnu.org; 28 Oct 2018 11:21:29 +0000 Original-Received: from localhost ([127.0.0.1]:46748 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGj8K-0003Rp-Jb for submit@debbugs.gnu.org; Sun, 28 Oct 2018 07:21:28 -0400 Original-Received: from forward101j.mail.yandex.net ([5.45.198.241]:59788) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gGj8H-0003Rb-PX for 33163@debbugs.gnu.org; Sun, 28 Oct 2018 07:21:26 -0400 Original-Received: from mxback16j.mail.yandex.net (mxback16j.mail.yandex.net [IPv6:2a02:6b8:0:1619::92]) by forward101j.mail.yandex.net (Yandex) with ESMTP id 4F5B22E81125; Sun, 28 Oct 2018 14:21:19 +0300 (MSK) Original-Received: from smtp3p.mail.yandex.net (smtp3p.mail.yandex.net [2a02:6b8:0:1472:2741:0:8b6:8]) by mxback16j.mail.yandex.net (nwsmtp/Yandex) with ESMTP id QrNm2yw6qL-LJNCNHYi; Sun, 28 Oct 2018 14:21:19 +0300 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1540725679; bh=3T6du5D3H2Ka/MXwzB4cky8HMDYmXCnUaKIhTdPD9GY=; h=Subject:To:Cc:References:From:Message-ID:Date:In-Reply-To; b=WCC3UvGa6miaYHmZ/bzFCIFBBidezVvCGxUBqzNs3hnV8RE3d7s2dTlQMduoEJxSx DOmGnwpNx8FvsHnqxh6lAMTRzOIjPRGV04qAR/D60I4zPezHz2CdSMDRMhzlV/wz/c GpnGRqUbRHHPNc7T/dhKhj13XUzp3CBZeLV8GV38= Original-Received: by smtp3p.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id zGTj2jfAzR-LIiWJrSA; Sun, 28 Oct 2018 14:21:18 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client certificate not present) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1540725678; bh=3T6du5D3H2Ka/MXwzB4cky8HMDYmXCnUaKIhTdPD9GY=; h=Subject:To:Cc:References:From:Message-ID:Date:In-Reply-To; b=NQlChaToB+CFtauhvcEPQgQd8Uq3Dzicd6sVgXOp4qTUgLQ1+SB0MFmLKzATcNEXP aaepX0F2/nDJ6rCHCR1A8rqg3p7iMaoiNsLNFdtNnGGCHeeYz0pqPgp+VO77WIR3Ac xEw+4AOV4cBPesIb/MDYrwgLUOiqp54iBMDdbLpA= Authentication-Results: smtp3p.mail.yandex.net; dkim=pass header.i=@yandex.ru In-Reply-To: <20181028104906.70695.qmail@mail.muc.de> Content-Language: en-US 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:151740 Archived-At: On 10/28/18 1:49 PM, Alan Mackenzie wrote: > 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… until 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 = []()-> 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…` is not red. > >> # Actual > >> The line with `auto foo…` (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! Thank you for the quick patch! I tried to do some editing and navigating, and all seems well. More real testing I can only do on Monday, so I guess I'll reply somewhere on Monday evening. > >> # 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)))) > > - ((< 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 getting > ;; 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)))) > > - (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)))) > > @@ -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))) > >