GNU bug report logs - #25608
CC Mode 5.33 (C/l); Incorrect syntactic information and indentation after multi-line comment with parenthesis or keywords

Previous Next

Package: cc-mode;

Reported by: Chris Wagner <chris.wagner <at> cambridgeconsultants.com>

Date: Thu, 2 Feb 2017 16:35:02 UTC

Severity: normal

To reply to this bug, email your comments to 25608 AT debbugs.gnu.org.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to help-debbugs <at> gnu.org:
bug#25608; Package debbugs.gnu.org. (Thu, 02 Feb 2017 16:35:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Chris Wagner <chris.wagner <at> cambridgeconsultants.com>:
New bug report received and forwarded. Copy sent to help-debbugs <at> gnu.org. (Thu, 02 Feb 2017 16:35:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Chris Wagner <chris.wagner <at> cambridgeconsultants.com>
To: submit <at> debbugs.gnu.org
Subject: CC Mode 5.33 (C/l);
 Incorrect syntactic information and indentation after
 multi-line comment with parenthesis or keywords
Date: Thu, 2 Feb 2017 13:45:36 +0000
[Message part 1 (text/plain, inline)]
Hello,

With the following c code:

/*-----------------------------------------------------------------------------
(c) Copyright notice containing open parentheses
-----------------------------------------------------------------------------*/

 
/*---------------------------------------------------------------------------*/


the last line is indented incorrectly, as the identified syntactic
information is ((topmost-intro-cont 1) (comment-intro)). I think it
should be ((topmost-intro 1) (comment-intro)), which the following code
correctly identifies:

/*-----------------------------------------------------------------------------
Non parenthesis language
-----------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/


Similarly, if there is a keyword in the comment, the next comment is
incorrectly identified and indented:

/*-----------------------------------------------------------------------------
(c) Copyright notice containing open parentheses
Line containing keyword for
-----------------------------------------------------------------------------*/

 
/*---------------------------------------------------------------------------*/

Note that indenting the comment region removes the problem:

/*-----------------------------------------------------------------------------
  (c) Copyright notice containing open parentheses
  Line containing keyword for
-----------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/

indents correctly.

Best regards,
Chris


Emacs  : GNU Emacs 25.1.1 (x86_64-w64-mingw32)
 of 2016-09-17
Package: CC Mode 5.33 (C/l)
Buffer Style: bsd
c-emacs-features: (pps-extended-state col-0-paren posix-char-classes 
gen-string-delim gen-comment-delim syntax-properties 1-bit)

current state:
==============
(setq
 c-basic-offset 4
 c-comment-only-line-offset 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-cleanup-list '(scope-operator)
 c-hanging-braces-alist '((brace-list-open) (brace-entry-open) 
(statement-cont) (substatement-open after)
                          (block-close . c-snug-do-while) 
(extern-lang-open after) (namespace-open after)
                          (module-open after) (composition-open after) 
(inexpr-class-open after)
                          (inexpr-class-close before) 
(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 nil
 c-label-minimum-indentation 1
 c-offsets-alist '((inexpr-statement . +)
                   (lambda-intro-cont . +)
                   (inlambda . c-lineup-inexpr-block)
                   (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-close . +)
                   (arglist-cont-nonempty c-lineup-gcc-asm-reg 
c-lineup-arglist)
                   (arglist-cont c-lineup-gcc-asm-reg 0)
                   (arglist-intro . +)
                   (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-open . 0)
                   (statement-case-intro . +)
                   (statement . 0)
                   (brace-entry-open . 0)
                   (brace-list-entry . 0)
                   (brace-list-intro . +)
                   (brace-list-close . 0)
                   (brace-list-open . 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-cont . c-lineup-topmost-intro-cont)
                   (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)
                   (inexpr-class . 0)
                   (inline-open . 0)
                   (statement-cont . +)
                   (label . 0)
                   (substatement-label . 0)
                   (substatement-open . 0)
                   (knr-argdecl-intro . +)
                   (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 "bsd"
 c-enable-xemacs-performance-kludge-p nil
 c-old-style-variable-behavior nil
 defun-prompt-regexp nil
 tab-width 4
 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 "[        ]*\\(//+\\|\\**\\)[     ]*\\([ 
]*\\([-?!|#%;>*·????]+[      ]*\\)*\\)"
 )



Dr Chris Wagner
Senior Consultant, Medical Technology 
Cambridge Consultants
Science Park, Milton Road 
Cambridge, CB4 0DW, England
Switchboard: +44 (0)1223 420024
Direct dial: +44 (0)1223 392497
Fax: +44 (0)1223 423373
chris.wagner <at> cambridgeconsultants.com
www.CambridgeConsultants.com
 





This email is from Cambridge Consultants Limited, Science Park, Milton 
Road, Cambridge CB4 0DW with registered number 1036298 England. It may 
contain confidential information. It is intended for the addressee only 
and may not be copied or disclosed to any third party without our 
permission. If you are not the intended recipient please contact the 
sender as soon as possible and delete the material from any computer. If 
this email has been sent as a personal message to the addressee, the 
sender is not acting in his/her capacity as an employee or officer of 
Cambridge Consultants Limited and no liability is accepted for the content 
of any such email. Outgoing email may be monitored for the purpose of 
ensuring compliance with our email policy and relevant laws.


[Message part 2 (text/html, inline)]

Information forwarded to bug-cc-mode <at> gnu.org:
bug#25608; Package cc-mode. (Thu, 02 Feb 2017 18:35:02 GMT) Full text and rfc822 format available.

Message #8 received at 25608 <at> debbugs.gnu.org (full text, mbox):

From: Glenn Morris <rgm <at> gnu.org>
To: 25608 <at> debbugs.gnu.org
Cc: Chris Wagner <chris.wagner <at> cambridgeconsultants.com>
Subject: Re: bug#25608: CC Mode 5.33 (C/l);
 Incorrect syntactic information and indentation after multi-line
 comment with parenthesis or keywords
Date: Thu, 02 Feb 2017 13:34:36 -0500
I've reassigned this report to the right package in debbugs.gnu.org,
and am sending this reply so it appears on the right mailing list.

(It is of course impossible to comply with the meaningless legal
disclaimer at the end of the mssage.)

Chris Wagner wrote:

> Hello,
>
> With the following c code:
>
> /*-----------------------------------------------------------------------------
> (c) Copyright notice containing open parentheses
> -----------------------------------------------------------------------------*/
>
>  
> /*---------------------------------------------------------------------------*/
>
>
> the last line is indented incorrectly, as the identified syntactic
> information is ((topmost-intro-cont 1) (comment-intro)). I think it
> should be ((topmost-intro 1) (comment-intro)), which the following code
> correctly identifies:
>
> /*-----------------------------------------------------------------------------
> Non parenthesis language
> -----------------------------------------------------------------------------*/
>
> /*---------------------------------------------------------------------------*/
>
>
> Similarly, if there is a keyword in the comment, the next comment is
> incorrectly identified and indented:
>
> /*-----------------------------------------------------------------------------
> (c) Copyright notice containing open parentheses
> Line containing keyword for
> -----------------------------------------------------------------------------*/
>
>  
> /*---------------------------------------------------------------------------*/
>
> Note that indenting the comment region removes the problem:
>
> /*-----------------------------------------------------------------------------
>   (c) Copyright notice containing open parentheses
>   Line containing keyword for
> -----------------------------------------------------------------------------*/
>
> /*---------------------------------------------------------------------------*/
>
> indents correctly.
>
> Best regards,
> Chris
>
>
> Emacs  : GNU Emacs 25.1.1 (x86_64-w64-mingw32)
>  of 2016-09-17
> Package: CC Mode 5.33 (C/l)
> Buffer Style: bsd
> c-emacs-features: (pps-extended-state col-0-paren posix-char-classes 
> gen-string-delim gen-comment-delim syntax-properties 1-bit)
>
> current state:
> ==============
> (setq
>  c-basic-offset 4
>  c-comment-only-line-offset 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-cleanup-list '(scope-operator)
>  c-hanging-braces-alist '((brace-list-open) (brace-entry-open) 
> (statement-cont) (substatement-open after)
>                           (block-close . c-snug-do-while) 
> (extern-lang-open after) (namespace-open after)
>                           (module-open after) (composition-open after) 
> (inexpr-class-open after)
>                           (inexpr-class-close before) 
> (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 nil
>  c-label-minimum-indentation 1
>  c-offsets-alist '((inexpr-statement . +)
>                    (lambda-intro-cont . +)
>                    (inlambda . c-lineup-inexpr-block)
>                    (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-close . +)
>                    (arglist-cont-nonempty c-lineup-gcc-asm-reg 
> c-lineup-arglist)
>                    (arglist-cont c-lineup-gcc-asm-reg 0)
>                    (arglist-intro . +)
>                    (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-open . 0)
>                    (statement-case-intro . +)
>                    (statement . 0)
>                    (brace-entry-open . 0)
>                    (brace-list-entry . 0)
>                    (brace-list-intro . +)
>                    (brace-list-close . 0)
>                    (brace-list-open . 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-cont . c-lineup-topmost-intro-cont)
>                    (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)
>                    (inexpr-class . 0)
>                    (inline-open . 0)
>                    (statement-cont . +)
>                    (label . 0)
>                    (substatement-label . 0)
>                    (substatement-open . 0)
>                    (knr-argdecl-intro . +)
>                    (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 "bsd"
>  c-enable-xemacs-performance-kludge-p nil
>  c-old-style-variable-behavior nil
>  defun-prompt-regexp nil
>  tab-width 4
>  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 "[        ]*\\(//+\\|\\**\\)[     ]*\\([ 
> ]*\\([-?!|#%;>*·????]+[      ]*\\)*\\)"
>  )
>
>
>
> Dr Chris Wagner
> Senior Consultant, Medical Technology 
> Cambridge Consultants
> Science Park, Milton Road 
> Cambridge, CB4 0DW, England
> Switchboard: +44 (0)1223 420024
> Direct dial: +44 (0)1223 392497
> Fax: +44 (0)1223 423373
> chris.wagner <at> cambridgeconsultants.com
> www.CambridgeConsultants.com
>  
>
>
>
>
>
> This email is from Cambridge Consultants Limited, Science Park, Milton 
> Road, Cambridge CB4 0DW with registered number 1036298 England. It may 
> contain confidential information. It is intended for the addressee only 
> and may not be copied or disclosed to any third party without our 
> permission. If you are not the intended recipient please contact the 
> sender as soon as possible and delete the material from any computer. If 
> this email has been sent as a personal message to the addressee, the 
> sender is not acting in his/her capacity as an employee or officer of 
> Cambridge Consultants Limited and no liability is accepted for the content 
> of any such email. Outgoing email may be monitored for the purpose of 
> ensuring compliance with our email policy and relevant laws.





Information forwarded to bug-cc-mode <at> gnu.org:
bug#25608; Package cc-mode. (Thu, 02 Feb 2017 22:04:02 GMT) Full text and rfc822 format available.

Message #11 received at 25608 <at> debbugs.gnu.org (full text, mbox):

From: Alan Mackenzie <acm <at> muc.de>
To: Chris Wagner <chris.wagner <at> cambridgeconsultants.com>
Cc: 25608 <at> debbugs.gnu.org
Subject: Re: bug#25608: CC Mode 5.33 (C/l); Incorrect syntactic information
 and indentation after multi-line comment with parenthesis or keywords
Date: Thu, 2 Feb 2017 22:03:19 +0000
Hello, Chris.

On Thu, Feb 02, 2017 at 13:45:36 +0000, Chris Wagner wrote:
> Hello,

> With the following c code:

> /*-----------------------------------------------------------------------------
> (c) Copyright notice containing open parentheses
> -----------------------------------------------------------------------------*/

 
> /*---------------------------------------------------------------------------*/


> the last line is indented incorrectly, as the identified syntactic
> information is ((topmost-intro-cont 1) (comment-intro)). I think it
> should be ((topmost-intro 1) (comment-intro)), which the following code
> correctly identifies:

> /*-----------------------------------------------------------------------------
> Non parenthesis language
> -----------------------------------------------------------------------------*/

> /*---------------------------------------------------------------------------*/


> Similarly, if there is a keyword in the comment, the next comment is
> incorrectly identified and indented:

> /*-----------------------------------------------------------------------------
> (c) Copyright notice containing open parentheses
> Line containing keyword for
> -----------------------------------------------------------------------------*/

 
> /*---------------------------------------------------------------------------*/

> Note that indenting the comment region removes the problem:

> /*-----------------------------------------------------------------------------
>   (c) Copyright notice containing open parentheses
>   Line containing keyword for
> -----------------------------------------------------------------------------*/

> /*---------------------------------------------------------------------------*/

> indents correctly.

> Best regards,
> Chris

The problem in all these cases which fail is the open parenthesis at
column zero inside the comment.  This (currently) causes mis-analysis of
the code around it, as detailed in the Emacs manual on page "Left Margin
Paren".

However, I would be the first to agree with you that this is a fault in
Emacs rather than anything wrong with your source code, which is
perfectly normal C.  There is a fix for this problem, and I have some
hope that this fix will be incorporated into Emacs 26.

[ CC Mode configuration dump snipped, but appreciated. ]

> Dr Chris Wagner
> Senior Consultant, Medical Technology 
> Cambridge Consultants
> Science Park, Milton Road 
> Cambridge, CB4 0DW, England
> Switchboard: +44 (0)1223 420024
> Direct dial: +44 (0)1223 392497
> Fax: +44 (0)1223 423373
> chris.wagner <at> cambridgeconsultants.com
> www.CambridgeConsultants.com

-- 
Alan Mackenzie (Nuremberg, Germany).




This bug report was last modified 8 years and 134 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.