From: Alan Mackenzie <acm@muc.de>
Date: Thu, 25 Feb 2016 09:31:23 +0000 (+0000)
Subject: Make double-click-1 work with unbalanced parens in CC Mode.  Fixes bug#5560.
X-Git-Tag: emacs-25.0.92~37
X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=95f5a4337c9092ab81d57d8ab5f341fc182d10cd;p=emacs.git

Make double-click-1 work with unbalanced parens in CC Mode.  Fixes bug#5560.

* lisp/mouse.el (mouse-start-end): check the syntax of alleged parens with
`syntax-after' to ensure syntax-table text properties are respected.
---

diff --git a/lisp/mouse.el b/lisp/mouse.el
index 85ffc43d0dc..fa355ffeb71 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -931,20 +931,29 @@ If MODE is 2 then do the same for lines."
               (= start end)
 	      (char-after start)
               (= (char-syntax (char-after start)) ?\())
-	 (list start
-	       (save-excursion
-		 (goto-char start)
-		 (forward-sexp 1)
-		 (point))))
+         (if (/= (syntax-class (syntax-after start)) 4) ; raw syntax code for ?\(
+             ;; This happens in CC Mode when unbalanced parens in CPP
+             ;; constructs are given punctuation syntax with
+             ;; syntax-table text properties.  (2016-02-21).
+             (signal 'scan-error (list "Containing expression ends prematurely"
+                                       start start))
+           (list start
+                 (save-excursion
+                   (goto-char start)
+                   (forward-sexp 1)
+                   (point)))))
         ((and (= mode 1)
               (= start end)
 	      (char-after start)
               (= (char-syntax (char-after start)) ?\)))
-	 (list (save-excursion
-		 (goto-char (1+ start))
-		 (backward-sexp 1)
-		 (point))
-	       (1+ start)))
+         (if (/= (syntax-class (syntax-after start)) 5) ; raw syntax code for ?\)
+             ;; See above comment about CC Mode.
+             (signal 'scan-error (list "Unbalanced parentheses" start start))
+           (list (save-excursion
+                   (goto-char (1+ start))
+                   (backward-sexp 1)
+                   (point))
+                 (1+ start))))
 	((and (= mode 1)
               (= start end)
 	      (char-after start)