From unknown Sat Jun 21 12:28:32 2025 X-Loop: help-debbugs@gnu.org Subject: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency Resent-From: Michael Welsh Duggan Original-Sender: "Debbugs-submit" Resent-CC: bug-cc-mode@gnu.org Resent-Date: Fri, 05 Mar 2021 21:16:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 46951 X-GNU-PR-Package: cc-mode X-GNU-PR-Keywords: To: 46951@debbugs.gnu.org X-Debbugs-Original-To: submit@debbugs.gnu.org Received: via spool by submit@debbugs.gnu.org id=B.161497893617980 (code B ref -1); Fri, 05 Mar 2021 21:16:02 +0000 Received: (at submit) by debbugs.gnu.org; 5 Mar 2021 21:15:36 +0000 Received: from localhost ([127.0.0.1]:35575 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIHnL-0004fw-Ex for submit@debbugs.gnu.org; Fri, 05 Mar 2021 16:15:36 -0500 Received: from md5i.com ([75.151.244.229]:40274) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIHnJ-0004fi-I8 for submit@debbugs.gnu.org; Fri, 05 Mar 2021 16:15:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=md5i.com; s=dkim; h=Content-Type:MIME-Version:Message-ID:Date:Subject:To:From:Sender: Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=jRMquugP4VZB/CuarEucSrMB+FWZCFI5/Ba2LxtvfjM=; b=y7/KtmT01A80jjbzjKIl4I7bcO RIgmmnHCliBArdoK77Z3/YXXMvRPQXWjWVbKvB/8HlJGatDic9p7lqmFEXHX9ynzON1ujpaiJk1FL Fqk75yc9ksYtT/erk5Zr0AlbD; Received: from abode.md5i.com ([192.168.177.1] helo=miko) by md5i.com with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94) (envelope-from ) id 1lIHnE-001rg5-6S for submit@debbugs.gnu.org; Fri, 05 Mar 2021 16:15:27 -0500 From: Michael Welsh Duggan Date: Fri, 05 Mar 2021 16:15:20 -0500 Message-ID: <87y2f1wbdj.fsf@md5i.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Package: cc-mode I run cc-mode with c parse state debugging turned on. In the course of normal usage, I found a file that reliably triggers a cache state inconsistency. (This is a courtesy report. I'm not actually encountering any bad cc-mode behavior right now.) Reproducer: emacs -Q C-x C-f test.h RET M-x c-toggle-parse-state-cache RET M-x what-line C-v M-x what-line The resulting log in *Messages*: c-debug-parse-state enabled Line 1 c-parse-state inconsistency at 2465: using cache: (2462 (1208 . 1674)), from scratch: (2462 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2233 2219 2150 (1863 . 2060)) c-state-cache-good-pos 2151 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 1769) c-state-old-cpp-end (copy-marker 2432) c-parse-state-point 2244) c-parse-state inconsistency at 2524: using cache: (2509 (1208 . 1674)), from scratch: (2509 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2462 (1208 . 1674)) c-state-cache-good-pos 2433 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2434) c-state-old-cpp-end (copy-marker 2482) c-parse-state-point 2465) c-parse-state inconsistency at 2600: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2509 (1208 . 1674)) c-state-cache-good-pos 2483 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2483) c-state-old-cpp-end (copy-marker 2541) c-parse-state-point 2524) c-parse-state inconsistency at 2610: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2592 (1208 . 1674)) c-state-cache-good-pos 2566 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2543) c-state-old-cpp-end (copy-marker 2634) c-parse-state-point 2600) Line 32 --=-=-= Content-Type: text/x-chdr Content-Disposition: attachment; filename=test.h // Copyright 2011 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef NINJA_TEST_H_ #define NINJA_TEST_H_ #include "disk_interface.h" #include "manifest_parser.h" #include "state.h" #include "util.h" // A tiny testing framework inspired by googletest, but much simpler and // faster to compile. It supports most things commonly used from googltest. The // most noticeable things missing: EXPECT_* and ASSERT_* don't support // streaming notes to them with operator<<, and for failing tests the lhs and // rhs are not printed. That's so that this header does not have to include // sstream, which slows down building ninja_test almost 20%. namespace testing { class Test { bool failed_; int assertion_failures_; public: Test() : failed_(false), assertion_failures_(0) {} virtual ~Test() {} virtual void SetUp() {} virtual void TearDown() {} virtual void Run() = 0; bool Failed() const { return failed_; } int AssertionFailures() const { return assertion_failures_; } void AddAssertionFailure() { assertion_failures_++; } bool Check(bool condition, const char* file, int line, const char* error); }; } void RegisterTest(testing::Test* (*)(), const char*); extern testing::Test* g_current_test; #define TEST_F_(x, y, name) \ struct y : public x { \ static testing::Test* Create() { return g_current_test = new y; } \ virtual void Run(); \ }; \ struct Register##y { \ Register##y() { RegisterTest(y::Create, name); } \ }; \ Register##y g_register_##y; \ void y::Run() #define TEST_F(x, y) TEST_F_(x, x##y, #x "." #y) #define TEST(x, y) TEST_F_(testing::Test, x##y, #x "." #y) #define EXPECT_EQ(a, b) \ g_current_test->Check(a == b, __FILE__, __LINE__, #a " == " #b) #define EXPECT_NE(a, b) \ g_current_test->Check(a != b, __FILE__, __LINE__, #a " != " #b) #define EXPECT_GT(a, b) \ g_current_test->Check(a > b, __FILE__, __LINE__, #a " > " #b) #define EXPECT_LT(a, b) \ g_current_test->Check(a < b, __FILE__, __LINE__, #a " < " #b) #define EXPECT_GE(a, b) \ g_current_test->Check(a >= b, __FILE__, __LINE__, #a " >= " #b) #define EXPECT_LE(a, b) \ g_current_test->Check(a <= b, __FILE__, __LINE__, #a " <= " #b) #define EXPECT_TRUE(a) \ g_current_test->Check(static_cast(a), __FILE__, __LINE__, #a) #define EXPECT_FALSE(a) \ g_current_test->Check(!static_cast(a), __FILE__, __LINE__, #a) #define ASSERT_EQ(a, b) \ if (!EXPECT_EQ(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_NE(a, b) \ if (!EXPECT_NE(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_GT(a, b) \ if (!EXPECT_GT(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_LT(a, b) \ if (!EXPECT_LT(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_GE(a, b) \ if (!EXPECT_GE(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_LE(a, b) \ if (!EXPECT_LE(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_TRUE(a) \ if (!EXPECT_TRUE(a)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_FALSE(a) \ if (!EXPECT_FALSE(a)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_NO_FATAL_FAILURE(a) \ { \ int fail_count = g_current_test->AssertionFailures(); \ a; \ if (fail_count != g_current_test->AssertionFailures()) { \ g_current_test->AddAssertionFailure(); \ return; \ } \ } // Support utilities for tests. struct Node; /// A base test fixture that includes a State object with a /// builtin "cat" rule. struct StateTestWithBuiltinRules : public testing::Test { StateTestWithBuiltinRules(); /// Add a "cat" rule to \a state. Used by some tests; it's /// otherwise done by the ctor to state_. void AddCatRule(State* state); /// Short way to get a Node by its path from state_. Node* GetNode(const string& path); State state_; }; void AssertParse(State* state, const char* input, ManifestParserOptions = ManifestParserOptions()); void AssertHash(const char* expected, uint64_t actual); void VerifyGraph(const State& state); /// An implementation of DiskInterface that uses an in-memory representation /// of disk state. It also logs file accesses and directory creations /// so it can be used by tests to verify disk access patterns. struct VirtualFileSystem : public DiskInterface { VirtualFileSystem() : now_(1) {} /// "Create" a file with contents. void Create(const string& path, const string& contents); /// Tick "time" forwards; subsequent file operations will be newer than /// previous ones. int Tick() { return ++now_; } // DiskInterface virtual TimeStamp Stat(const string& path, string* err) const; virtual bool WriteFile(const string& path, const string& contents); virtual bool MakeDir(const string& path); virtual Status ReadFile(const string& path, string* contents, string* err); virtual int RemoveFile(const string& path); /// An entry for a single in-memory file. struct Entry { int mtime; string stat_error; // If mtime is -1. string contents; }; vector directories_made_; vector files_read_; typedef map FileMap; FileMap files_; set files_removed_; set files_created_; /// A simple fake timestamp for file operations. int now_; }; struct ScopedTempDir { /// Create a temporary directory and chdir into it. void CreateAndEnter(const string& name); /// Clean up the temporary directory. void Cleanup(); /// The temp directory containing our dir. string start_dir_; /// The subdirectory name for our dir, or empty if it hasn't been set up. string temp_dir_name_; }; #endif // NINJA_TEST_H_ --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Emacs : GNU Emacs 28.0.50 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo = version 1.16.0) of 2021-03-05 Package: CC Mode 5.35.1 (C++//l) Buffer Style: gnu c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-st= ring-delim gen-comment-delim syntax-properties 1-bit) current state: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D (setq c-basic-offset 2 c-comment-only-line-offset '(0 . 0) c-indent-comment-alist '((anchored-comment column . 0) (end-block space . = 1) (cpp-end-block space . 2)) c-indent-comments-syntactically-p nil c-block-comment-prefix "" c-comment-prefix-regexp '((pike-mode . "//+!?\\|\\**") (awk-mode . "#+") (other . "//+\\|\\**")) c-doc-comment-style '((java-mode . javadoc) (pike-mode . autodoc) (c-mode . gtkdoc) (c++-mode . gtkdoc)) c-cleanup-list '(scope-operator) c-hanging-braces-alist '((substatement-open before after) (arglist-cont-nonempty)) c-hanging-colons-alist nil c-hanging-semi&comma-criteria '(c-semi&comma-inside-parenlist) c-backslash-column 48 c-backslash-max-column 72 c-special-indent-hook '(t c-gnu-impose-minimum) c-label-minimum-indentation 1 c-offsets-alist '((inexpr-class . +) (inexpr-statement . +) (lambda-intro-cont . +) (inlambda . 0) (template-args-cont c-lineup-template-args +) (incomposition . +) (inmodule . +) (innamespace . +) (inextern-lang . +) (composition-close . 0) (module-close . 0) (namespace-close . 0) (extern-lang-close . 0) (composition-open . 0) (module-open . 0) (namespace-open . 0) (extern-lang-open . 0) (objc-method-call-cont c-lineup-ObjC-method-call-colons c-lineup-ObjC-method-call + ) (objc-method-args-cont . c-lineup-ObjC-method-args) (objc-method-intro . [0]) (friend . 0) (cpp-define-intro c-lineup-cpp-define +) (cpp-macro-cont . +) (cpp-macro . [0]) (inclass . +) (stream-op . c-lineup-streamop) (arglist-cont-nonempty c-lineup-gcc-asm-reg c-lineup-arglist ) (arglist-cont c-lineup-gcc-asm-reg 0) (comment-intro c-lineup-knr-region-comment c-lineup-comment ) (catch-clause . 0) (else-clause . 0) (do-while-closure . 0) (access-label . -) (case-label . 0) (substatement . +) (statement-case-intro . +) (statement . 0) (brace-entry-open . 0) (brace-list-entry . 0) (brace-list-close . 0) (block-close . 0) (block-open . 0) (inher-cont . c-lineup-multi-inher) (inher-intro . +) (member-init-cont . c-lineup-multi-inher) (member-init-intro . +) (annotation-var-cont . +) (annotation-top-cont . 0) (topmost-intro . 0) (knr-argdecl . 0) (func-decl-cont . +) (inline-close . 0) (class-close . 0) (class-open . 0) (defun-block-intro . +) (defun-close . 0) (defun-open . 0) (c . c-lineup-C-comments) (string . c-lineup-dont-change) (topmost-intro-cont first c-lineup-topmost-intro-cont c-lineup-gnu-DEFUN-intro-cont ) (brace-list-intro first c-lineup-2nd-brace-entry-in-arglist c-lineup-class-decl-init-+ + ) (brace-list-open . +) (inline-open . 0) (arglist-close . c-lineup-arglist) (arglist-intro . c-lineup-arglist-intro-after-paren) (statement-cont . +) (statement-case-open . +) (label . 0) (substatement-label . 0) (substatement-open . +) (knr-argdecl-intro . 5) (statement-block-intro . +) ) c-buffer-is-cc-mode 'c++-mode c-tab-always-indent t c-syntactic-indentation t c-syntactic-indentation-in-macros t c-ignore-auto-fill '(string cpp code) c-auto-align-backslashes t c-backspace-function 'backward-delete-char-untabify c-delete-function 'delete-char c-electric-pound-behavior nil c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "gnu")) c-enable-xemacs-performance-kludge-p nil c-old-style-variable-behavior nil defun-prompt-regexp nil tab-width 8 comment-column 32 parse-sexp-ignore-comments t parse-sexp-lookup-properties t auto-fill-function nil comment-multi-line t comment-start-skip "\\(?://+\\|/\\*+\\)\\s *" fill-prefix nil fill-column 70 paragraph-start "[ ]*\\(//+\\|\\**\\)[ ]*$\\|^\f" adaptive-fill-mode t adaptive-fill-regexp "[ ]*\\(//+\\|\\**\\)[ ]*\\([ ]*\\([-=E2=80=93!|#%= ;>*=C2=B7=E2=80=A2=E2=80=A3=E2=81=83=E2=97=A6]+[ ]*\\)*\\)" ) --=20 Michael Welsh Duggan (md5i@md5i.com) --=-=-=-- From unknown Sat Jun 21 12:28:32 2025 X-Loop: help-debbugs@gnu.org Subject: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-cc-mode@gnu.org Resent-Date: Sat, 06 Mar 2021 14:55:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 46951 X-GNU-PR-Package: cc-mode X-GNU-PR-Keywords: To: Michael Welsh Duggan Cc: 46951@debbugs.gnu.org Received: via spool by 46951-submit@debbugs.gnu.org id=B46951.161504246920521 (code B ref 46951); Sat, 06 Mar 2021 14:55:01 +0000 Received: (at 46951) by debbugs.gnu.org; 6 Mar 2021 14:54:29 +0000 Received: from localhost ([127.0.0.1]:36352 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIYK5-0005Kv-Gb for submit@debbugs.gnu.org; Sat, 06 Mar 2021 09:54:29 -0500 Received: from colin.muc.de ([193.149.48.1]:20661 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1lIYK3-0005Kg-Uk for 46951@debbugs.gnu.org; Sat, 06 Mar 2021 09:54:28 -0500 Received: (qmail 17396 invoked by uid 3782); 6 Mar 2021 14:54:21 -0000 Received: from acm.muc.de (p2e5d58b7.dip0.t-ipconnect.de [46.93.88.183]) (using STARTTLS) by colin.muc.de (tmda-ofmipd) with ESMTP; Sat, 06 Mar 2021 15:54:20 +0100 Received: (qmail 5392 invoked by uid 1000); 6 Mar 2021 14:54:20 -0000 Date: Sat, 6 Mar 2021 14:54:20 +0000 Message-ID: References: <87y2f1wbdj.fsf@md5i.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87y2f1wbdj.fsf@md5i.com> X-Submission-Agent: TMDA/1.3.x (Ph3nix) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hello, Michael. On Fri, Mar 05, 2021 at 16:15:20 -0500, Michael Welsh Duggan wrote: > Package: cc-mode > I run cc-mode with c parse state debugging turned on. In the course of > normal usage, I found a file that reliably triggers a cache state > inconsistency. (This is a courtesy report. I'm not actually > encountering any bad cc-mode behavior right now.) > Reproducer: > emacs -Q > C-x C-f test.h RET > M-x c-toggle-parse-state-cache RET > M-x what-line > C-v > M-x what-line > The resulting log in *Messages*: > c-debug-parse-state enabled > Line 1 > c-parse-state inconsistency at 2465: using cache: (2462 (1208 . 1674)), from scratch: (2462 (1863 . 2060)). POINT-MIN: 1 > Old state: > (setq c-state-cache '(2233 2219 2150 (1863 . 2060)) c-state-cache-good-pos 2151 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 1769) c-state-old-cpp-end (copy-marker 2432) c-parse-state-point 2244) > c-parse-state inconsistency at 2524: using cache: (2509 (1208 . 1674)), from scratch: (2509 (1863 . 2060)). POINT-MIN: 1 > Old state: > (setq c-state-cache '(2462 (1208 . 1674)) c-state-cache-good-pos 2433 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2434) c-state-old-cpp-end (copy-marker 2482) c-parse-state-point 2465) > c-parse-state inconsistency at 2600: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)). POINT-MIN: 1 > Old state: > (setq c-state-cache '(2509 (1208 . 1674)) c-state-cache-good-pos 2483 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2483) c-state-old-cpp-end (copy-marker 2541) c-parse-state-point 2524) > c-parse-state inconsistency at 2610: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)). POINT-MIN: 1 > Old state: > (setq c-state-cache '(2592 (1208 . 1674)) c-state-cache-good-pos 2566 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2543) c-state-old-cpp-end (copy-marker 2634) c-parse-state-point 2600) > Line 32 Indeed, yes. Thanks for the report. The following patch (which applies cleanly to the Emacs master branch) should fix the bug. I will be applying it to the master branch this afternoon. Please feel free to test it, but if I don't hear from you, I'll assume the bug can be closed. Thanks again! diff -r d6f1f920c51c cc-engine.el --- a/cc-engine.el Wed Mar 03 11:44:18 2021 +0000 +++ b/cc-engine.el Sat Mar 06 14:50:58 2021 +0000 @@ -3801,12 +3801,14 @@ (point))) (bra ; Position of "{". ;; Don't start scanning in the middle of a CPP construct unless - ;; it contains HERE - these constructs, in Emacs, are "commented - ;; out" with category properties. - (if (eq (c-get-char-property macro-start-or-from 'category) - 'c-cpp-delimiter) - macro-start-or-from - from)) + ;; it contains HERE. + (if (and (not (eq macro-start-or-from from)) + (< macro-start-or-from here) ; Might not be needed. + (progn (goto-char macro-start-or-from) + (c-end-of-macro) + (>= (point) here))) + from + macro-start-or-from)) ce) ; Position of "}" (or upper-lim (setq upper-lim from)) [ .... ] > -- > Michael Welsh Duggan > (md5i@md5i.com) -- Alan Mackenzie (Nuremberg, Germany). From unknown Sat Jun 21 12:28:32 2025 X-Loop: help-debbugs@gnu.org Subject: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency Resent-From: Michael Welsh Duggan Original-Sender: "Debbugs-submit" Resent-CC: bug-cc-mode@gnu.org Resent-Date: Sat, 06 Mar 2021 16:08:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 46951 X-GNU-PR-Package: cc-mode X-GNU-PR-Keywords: To: Alan Mackenzie Cc: 46951@debbugs.gnu.org Received: via spool by 46951-submit@debbugs.gnu.org id=B46951.161504685528907 (code B ref 46951); Sat, 06 Mar 2021 16:08:01 +0000 Received: (at 46951) by debbugs.gnu.org; 6 Mar 2021 16:07:35 +0000 Received: from localhost ([127.0.0.1]:38138 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIZSo-0007WB-QA for submit@debbugs.gnu.org; Sat, 06 Mar 2021 11:07:35 -0500 Received: from md5i.com ([75.151.244.229]:46788) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIZSm-0007Vx-Hz for 46951@debbugs.gnu.org; Sat, 06 Mar 2021 11:07:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=md5i.com; s=dkim; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date:References: Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=16mcilQwbTXtF5t5eRIhTpNCbT9+rJgruSnrMuvg87I=; b=gQfZiRb7mUtr05nFDDVd8UC/sd ecdonPFDXAlOKRiRuaQSHB4P9OzeEoK8D4TN9m1Z2zr8YlktrsrT8Rlcp1idwS7cZsNxhf8x/gTUW 4QWZedetROUnKkeLOajvSPD/u; Received: from abode.md5i.com ([192.168.177.1] helo=miko) by md5i.com with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94) (envelope-from ) id 1lIZSg-001uhQ-4h; Sat, 06 Mar 2021 11:07:25 -0500 From: Michael Welsh Duggan References: <87y2f1wbdj.fsf@md5i.com> Date: Sat, 06 Mar 2021 11:07:25 -0500 In-Reply-To: (Alan Mackenzie's message of "Sat, 6 Mar 2021 14:54:20 +0000") Message-ID: <8735x8e05e.fsf@md5i.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Alan Mackenzie writes: > The following patch (which applies cleanly to the Emacs master branch) > should fix the bug. I will be applying it to the master branch this > afternoon. Please feel free to test it, but if I don't hear from you, > I'll assume the bug can be closed. I can confirm that this fixes this case. -- Michael Welsh Duggan (md5i@md5i.com) From unknown Sat Jun 21 12:28:32 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Michael Welsh Duggan Subject: bug#46951: closed (Re: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency) Message-ID: References: <87y2f1wbdj.fsf@md5i.com> X-Gnu-PR-Message: they-closed 46951 X-Gnu-PR-Package: cc-mode Reply-To: 46951@debbugs.gnu.org Date: Sat, 06 Mar 2021 16:54:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1615049642-714-1" This is a multi-part message in MIME format... ------------=_1615049642-714-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency which was filed against the cc-mode package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 46951@debbugs.gnu.org. --=20 46951: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D46951 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1615049642-714-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 46951-done) by debbugs.gnu.org; 6 Mar 2021 16:53:35 +0000 Received: from localhost ([127.0.0.1]:38173 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIaBK-0000As-Vl for submit@debbugs.gnu.org; Sat, 06 Mar 2021 11:53:35 -0500 Received: from colin.muc.de ([193.149.48.1]:23824 helo=mail.muc.de) by debbugs.gnu.org with smtp (Exim 4.84_2) (envelope-from ) id 1lIaBJ-0000Ac-4w for 46951-done@debbugs.gnu.org; Sat, 06 Mar 2021 11:53:33 -0500 Received: (qmail 97809 invoked by uid 3782); 6 Mar 2021 16:53:26 -0000 Received: from acm.muc.de (p2e5d58b7.dip0.t-ipconnect.de [46.93.88.183]) (using STARTTLS) by colin.muc.de (tmda-ofmipd) with ESMTP; Sat, 06 Mar 2021 17:53:26 +0100 Received: (qmail 8611 invoked by uid 1000); 6 Mar 2021 16:53:25 -0000 Date: Sat, 6 Mar 2021 16:53:25 +0000 To: Michael Welsh Duggan Subject: Re: bug#46951: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency Message-ID: References: <87y2f1wbdj.fsf@md5i.com> <8735x8e05e.fsf@md5i.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8735x8e05e.fsf@md5i.com> X-Submission-Agent: TMDA/1.3.x (Ph3nix) From: Alan Mackenzie X-Primary-Address: acm@muc.de X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 46951-done Cc: 46951-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hello, Michael. On Sat, Mar 06, 2021 at 11:07:25 -0500, Michael Welsh Duggan wrote: > Alan Mackenzie writes: > > The following patch (which applies cleanly to the Emacs master branch) > > should fix the bug. I will be applying it to the master branch this > > afternoon. Please feel free to test it, but if I don't hear from you, > > I'll assume the bug can be closed. > I can confirm that this fixes this case. That's great, thanks very much! I'm closing the bug with this post. > -- > Michael Welsh Duggan > (md5i@md5i.com) -- Alan Mackenzie (Nuremberg, Germany). ------------=_1615049642-714-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 5 Mar 2021 21:15:36 +0000 Received: from localhost ([127.0.0.1]:35575 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIHnL-0004fw-Ex for submit@debbugs.gnu.org; Fri, 05 Mar 2021 16:15:36 -0500 Received: from md5i.com ([75.151.244.229]:40274) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lIHnJ-0004fi-I8 for submit@debbugs.gnu.org; Fri, 05 Mar 2021 16:15:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=md5i.com; s=dkim; h=Content-Type:MIME-Version:Message-ID:Date:Subject:To:From:Sender: Reply-To:Cc:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=jRMquugP4VZB/CuarEucSrMB+FWZCFI5/Ba2LxtvfjM=; b=y7/KtmT01A80jjbzjKIl4I7bcO RIgmmnHCliBArdoK77Z3/YXXMvRPQXWjWVbKvB/8HlJGatDic9p7lqmFEXHX9ynzON1ujpaiJk1FL Fqk75yc9ksYtT/erk5Zr0AlbD; Received: from abode.md5i.com ([192.168.177.1] helo=miko) by md5i.com with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94) (envelope-from ) id 1lIHnE-001rg5-6S for submit@debbugs.gnu.org; Fri, 05 Mar 2021 16:15:27 -0500 From: Michael Welsh Duggan To: submit@debbugs.gnu.org Subject: CC Mode 5.35.1 (C++/l); c-state-cache inconsistency X-Debbugs-Package: cc-mode Date: Fri, 05 Mar 2021 16:15:20 -0500 Message-ID: <87y2f1wbdj.fsf@md5i.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain Package: cc-mode I run cc-mode with c parse state debugging turned on. In the course of normal usage, I found a file that reliably triggers a cache state inconsistency. (This is a courtesy report. I'm not actually encountering any bad cc-mode behavior right now.) Reproducer: emacs -Q C-x C-f test.h RET M-x c-toggle-parse-state-cache RET M-x what-line C-v M-x what-line The resulting log in *Messages*: c-debug-parse-state enabled Line 1 c-parse-state inconsistency at 2465: using cache: (2462 (1208 . 1674)), from scratch: (2462 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2233 2219 2150 (1863 . 2060)) c-state-cache-good-pos 2151 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 1769) c-state-old-cpp-end (copy-marker 2432) c-parse-state-point 2244) c-parse-state inconsistency at 2524: using cache: (2509 (1208 . 1674)), from scratch: (2509 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2462 (1208 . 1674)) c-state-cache-good-pos 2433 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2434) c-state-old-cpp-end (copy-marker 2482) c-parse-state-point 2465) c-parse-state inconsistency at 2600: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2509 (1208 . 1674)) c-state-cache-good-pos 2483 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2483) c-state-old-cpp-end (copy-marker 2541) c-parse-state-point 2524) c-parse-state inconsistency at 2610: using cache: (2592 (1208 . 1674)), from scratch: (2592 (1863 . 2060)). POINT-MIN: 1 Old state: (setq c-state-cache '(2592 (1208 . 1674)) c-state-cache-good-pos 2566 c-state-nonlit-pos-cache nil c-state-nonlit-pos-cache-limit 1 c-state-brace-pair-desert '(1 . 1208) c-state-point-min 1 c-state-point-min-lit-type nil c-state-point-min-lit-start nil c-state-min-scan-pos 1 c-state-old-cpp-beg (copy-marker 2543) c-state-old-cpp-end (copy-marker 2634) c-parse-state-point 2600) Line 32 --=-=-= Content-Type: text/x-chdr Content-Disposition: attachment; filename=test.h // Copyright 2011 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef NINJA_TEST_H_ #define NINJA_TEST_H_ #include "disk_interface.h" #include "manifest_parser.h" #include "state.h" #include "util.h" // A tiny testing framework inspired by googletest, but much simpler and // faster to compile. It supports most things commonly used from googltest. The // most noticeable things missing: EXPECT_* and ASSERT_* don't support // streaming notes to them with operator<<, and for failing tests the lhs and // rhs are not printed. That's so that this header does not have to include // sstream, which slows down building ninja_test almost 20%. namespace testing { class Test { bool failed_; int assertion_failures_; public: Test() : failed_(false), assertion_failures_(0) {} virtual ~Test() {} virtual void SetUp() {} virtual void TearDown() {} virtual void Run() = 0; bool Failed() const { return failed_; } int AssertionFailures() const { return assertion_failures_; } void AddAssertionFailure() { assertion_failures_++; } bool Check(bool condition, const char* file, int line, const char* error); }; } void RegisterTest(testing::Test* (*)(), const char*); extern testing::Test* g_current_test; #define TEST_F_(x, y, name) \ struct y : public x { \ static testing::Test* Create() { return g_current_test = new y; } \ virtual void Run(); \ }; \ struct Register##y { \ Register##y() { RegisterTest(y::Create, name); } \ }; \ Register##y g_register_##y; \ void y::Run() #define TEST_F(x, y) TEST_F_(x, x##y, #x "." #y) #define TEST(x, y) TEST_F_(testing::Test, x##y, #x "." #y) #define EXPECT_EQ(a, b) \ g_current_test->Check(a == b, __FILE__, __LINE__, #a " == " #b) #define EXPECT_NE(a, b) \ g_current_test->Check(a != b, __FILE__, __LINE__, #a " != " #b) #define EXPECT_GT(a, b) \ g_current_test->Check(a > b, __FILE__, __LINE__, #a " > " #b) #define EXPECT_LT(a, b) \ g_current_test->Check(a < b, __FILE__, __LINE__, #a " < " #b) #define EXPECT_GE(a, b) \ g_current_test->Check(a >= b, __FILE__, __LINE__, #a " >= " #b) #define EXPECT_LE(a, b) \ g_current_test->Check(a <= b, __FILE__, __LINE__, #a " <= " #b) #define EXPECT_TRUE(a) \ g_current_test->Check(static_cast(a), __FILE__, __LINE__, #a) #define EXPECT_FALSE(a) \ g_current_test->Check(!static_cast(a), __FILE__, __LINE__, #a) #define ASSERT_EQ(a, b) \ if (!EXPECT_EQ(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_NE(a, b) \ if (!EXPECT_NE(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_GT(a, b) \ if (!EXPECT_GT(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_LT(a, b) \ if (!EXPECT_LT(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_GE(a, b) \ if (!EXPECT_GE(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_LE(a, b) \ if (!EXPECT_LE(a, b)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_TRUE(a) \ if (!EXPECT_TRUE(a)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_FALSE(a) \ if (!EXPECT_FALSE(a)) { g_current_test->AddAssertionFailure(); return; } #define ASSERT_NO_FATAL_FAILURE(a) \ { \ int fail_count = g_current_test->AssertionFailures(); \ a; \ if (fail_count != g_current_test->AssertionFailures()) { \ g_current_test->AddAssertionFailure(); \ return; \ } \ } // Support utilities for tests. struct Node; /// A base test fixture that includes a State object with a /// builtin "cat" rule. struct StateTestWithBuiltinRules : public testing::Test { StateTestWithBuiltinRules(); /// Add a "cat" rule to \a state. Used by some tests; it's /// otherwise done by the ctor to state_. void AddCatRule(State* state); /// Short way to get a Node by its path from state_. Node* GetNode(const string& path); State state_; }; void AssertParse(State* state, const char* input, ManifestParserOptions = ManifestParserOptions()); void AssertHash(const char* expected, uint64_t actual); void VerifyGraph(const State& state); /// An implementation of DiskInterface that uses an in-memory representation /// of disk state. It also logs file accesses and directory creations /// so it can be used by tests to verify disk access patterns. struct VirtualFileSystem : public DiskInterface { VirtualFileSystem() : now_(1) {} /// "Create" a file with contents. void Create(const string& path, const string& contents); /// Tick "time" forwards; subsequent file operations will be newer than /// previous ones. int Tick() { return ++now_; } // DiskInterface virtual TimeStamp Stat(const string& path, string* err) const; virtual bool WriteFile(const string& path, const string& contents); virtual bool MakeDir(const string& path); virtual Status ReadFile(const string& path, string* contents, string* err); virtual int RemoveFile(const string& path); /// An entry for a single in-memory file. struct Entry { int mtime; string stat_error; // If mtime is -1. string contents; }; vector directories_made_; vector files_read_; typedef map FileMap; FileMap files_; set files_removed_; set files_created_; /// A simple fake timestamp for file operations. int now_; }; struct ScopedTempDir { /// Create a temporary directory and chdir into it. void CreateAndEnter(const string& name); /// Clean up the temporary directory. void Cleanup(); /// The temp directory containing our dir. string start_dir_; /// The subdirectory name for our dir, or empty if it hasn't been set up. string temp_dir_name_; }; #endif // NINJA_TEST_H_ --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Emacs : GNU Emacs 28.0.50 (build 2, x86_64-pc-linux-gnu, X toolkit, cairo = version 1.16.0) of 2021-03-05 Package: CC Mode 5.35.1 (C++//l) Buffer Style: gnu c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-st= ring-delim gen-comment-delim syntax-properties 1-bit) current state: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D (setq c-basic-offset 2 c-comment-only-line-offset '(0 . 0) c-indent-comment-alist '((anchored-comment column . 0) (end-block space . = 1) (cpp-end-block space . 2)) c-indent-comments-syntactically-p nil c-block-comment-prefix "" c-comment-prefix-regexp '((pike-mode . "//+!?\\|\\**") (awk-mode . "#+") (other . "//+\\|\\**")) c-doc-comment-style '((java-mode . javadoc) (pike-mode . autodoc) (c-mode . gtkdoc) (c++-mode . gtkdoc)) c-cleanup-list '(scope-operator) c-hanging-braces-alist '((substatement-open before after) (arglist-cont-nonempty)) c-hanging-colons-alist nil c-hanging-semi&comma-criteria '(c-semi&comma-inside-parenlist) c-backslash-column 48 c-backslash-max-column 72 c-special-indent-hook '(t c-gnu-impose-minimum) c-label-minimum-indentation 1 c-offsets-alist '((inexpr-class . +) (inexpr-statement . +) (lambda-intro-cont . +) (inlambda . 0) (template-args-cont c-lineup-template-args +) (incomposition . +) (inmodule . +) (innamespace . +) (inextern-lang . +) (composition-close . 0) (module-close . 0) (namespace-close . 0) (extern-lang-close . 0) (composition-open . 0) (module-open . 0) (namespace-open . 0) (extern-lang-open . 0) (objc-method-call-cont c-lineup-ObjC-method-call-colons c-lineup-ObjC-method-call + ) (objc-method-args-cont . c-lineup-ObjC-method-args) (objc-method-intro . [0]) (friend . 0) (cpp-define-intro c-lineup-cpp-define +) (cpp-macro-cont . +) (cpp-macro . [0]) (inclass . +) (stream-op . c-lineup-streamop) (arglist-cont-nonempty c-lineup-gcc-asm-reg c-lineup-arglist ) (arglist-cont c-lineup-gcc-asm-reg 0) (comment-intro c-lineup-knr-region-comment c-lineup-comment ) (catch-clause . 0) (else-clause . 0) (do-while-closure . 0) (access-label . -) (case-label . 0) (substatement . +) (statement-case-intro . +) (statement . 0) (brace-entry-open . 0) (brace-list-entry . 0) (brace-list-close . 0) (block-close . 0) (block-open . 0) (inher-cont . c-lineup-multi-inher) (inher-intro . +) (member-init-cont . c-lineup-multi-inher) (member-init-intro . +) (annotation-var-cont . +) (annotation-top-cont . 0) (topmost-intro . 0) (knr-argdecl . 0) (func-decl-cont . +) (inline-close . 0) (class-close . 0) (class-open . 0) (defun-block-intro . +) (defun-close . 0) (defun-open . 0) (c . c-lineup-C-comments) (string . c-lineup-dont-change) (topmost-intro-cont first c-lineup-topmost-intro-cont c-lineup-gnu-DEFUN-intro-cont ) (brace-list-intro first c-lineup-2nd-brace-entry-in-arglist c-lineup-class-decl-init-+ + ) (brace-list-open . +) (inline-open . 0) (arglist-close . c-lineup-arglist) (arglist-intro . c-lineup-arglist-intro-after-paren) (statement-cont . +) (statement-case-open . +) (label . 0) (substatement-label . 0) (substatement-open . +) (knr-argdecl-intro . 5) (statement-block-intro . +) ) c-buffer-is-cc-mode 'c++-mode c-tab-always-indent t c-syntactic-indentation t c-syntactic-indentation-in-macros t c-ignore-auto-fill '(string cpp code) c-auto-align-backslashes t c-backspace-function 'backward-delete-char-untabify c-delete-function 'delete-char c-electric-pound-behavior nil c-default-style '((java-mode . "java") (awk-mode . "awk") (other . "gnu")) c-enable-xemacs-performance-kludge-p nil c-old-style-variable-behavior nil defun-prompt-regexp nil tab-width 8 comment-column 32 parse-sexp-ignore-comments t parse-sexp-lookup-properties t auto-fill-function nil comment-multi-line t comment-start-skip "\\(?://+\\|/\\*+\\)\\s *" fill-prefix nil fill-column 70 paragraph-start "[ ]*\\(//+\\|\\**\\)[ ]*$\\|^\f" adaptive-fill-mode t adaptive-fill-regexp "[ ]*\\(//+\\|\\**\\)[ ]*\\([ ]*\\([-=E2=80=93!|#%= ;>*=C2=B7=E2=80=A2=E2=80=A3=E2=81=83=E2=97=A6]+[ ]*\\)*\\)" ) --=20 Michael Welsh Duggan (md5i@md5i.com) --=-=-=-- ------------=_1615049642-714-1--