Subject: bug#63285: Acknowledgement (30.0.50; CC Mode: K&R argument declaration misdetection after parenthesized type)

From: Olivier Certner <[email-masked]>
Date: Thu, 04 May 2023 23:57:14 +0200

Proposed fix.  Applies on master (b28d44d4226497c4b258).

-- 
Olivier Certner

>From 249226b450b88c423b8d395c220ddf5a00ef9332 Mon Sep 17 00:00:00 2001
From: Olivier Certner <[email-masked]>
Date: Wed, 3 May 2023 11:44:43 +0200
Subject: [PATCH] CC Mode: Fix K&R argument declaration misdetection after
 parenthesized type

* lisp/progmodes/cc-engine.el (c-in-knr-argdecl): When trying to loop
over candidate declarations (between the function declaration's
identifier list's end and point) to check whether the names of their
identifiers correspond with that of the identifier list, actually fail
as soon as stumbling on something other than a declaration instead of
silently succeeding, which causes some constructs to be erroneously
recognized as K&R argument declarations.

(Bug#63285)
---
 lisp/progmodes/cc-engine.el | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 8b34daf03c2..0d9f0fec03b 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -12039,17 +12039,25 @@ c-in-knr-argdecl
 		       ;; Each time around the following checks one
 		       ;; declaration (which may contain several identifiers).
 		       (while (and
-			       (consp (setq decl-or-cast
+			       (or
+				(and
+				 (consp
+				  (setq decl-or-cast
 					    (c-forward-decl-or-cast-1
 					     after-prec-token
 					     nil ; Or 'arglist ???
 					     nil)))
-			       (memq (char-after) '(?\; ?\,))
-			       (goto-char (car decl-or-cast))
-			       (save-excursion
-				 (setq semi-position+1
-				       (c-syntactic-re-search-forward
-					";" (+ (point) 1000) t)))
+				 (memq (char-after) '(?\; ?\,))
+				 (goto-char (car decl-or-cast))
+				 (save-excursion
+				   (setq semi-position+1
+					 (1+ (or
+					      (c-syntactic-re-search-forward
+					       ";" (point) t)
+					      (1- (point-max)))))))
+				;; Can't parse declarations correctly,
+				;; bail out.
+				(throw 'knr nil))
 			       (c-do-declarators
 				semi-position+1 t nil nil
 				(lambda (id-start id-end _next _not-top
-- 
2.39.2