all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names
@ 2019-05-16 22:19 Mauro Aranda
  2019-05-16 23:42 ` Noam Postavsky
  0 siblings, 1 reply; 6+ messages in thread
From: Mauro Aranda @ 2019-05-16 22:19 UTC (permalink / raw)
  To: 35768

[-- Attachment #1: Type: text/plain, Size: 4090 bytes --]

Hello.

I noticed CC-Mode sometimes doesn't identify correctly function names
when a macro name is involved in the function definition.  Try the
following recipe to see the problem:

1) emacs -Q
2) C-x C-f test.c
3) Type the following function definitions:

int DUMMY
foo (void)
{
  return 1;
}

DUMMY int
bar (void)
{
  return 0;
}

4) Observe that:
a) foo doesn't get fontified with font-lock-function-name-face, but
DUMMY does.  Consequently, C-c C-z inside foo echoes
DUMMY as the function name, in the echo area.
b) In bar, DUMMY gets font-lock-type-face, which I don't
think is correct.  bar gets font-lock-function-name-face and C-c C-z
works as expected.

---

Other problem is with fontification of the return type in the following:

bool DUMMY
baz_t (void)
{
  return true;
}

bool
baz_f (void)
{
  return false;
}

Observe that bool doesn't get fontified in baz_t, but DUMMY does.  When
DUMMY is not present, bool gets fontified correctly (as in baz_f).


If it helps, I found the problem in a source file with functions that
have macros that declare some function attributes, like
_GL_ATTRIBUTE_PURE.

Best regards,
Mauro.



In GNU Emacs 27.0.50 (build 5, i686-pc-linux-gnu, GTK+ Version 3.18.9)
 of 2019-05-15 built on the-blackbeard
Repository revision: 50b1ce0185cd7b5f8be124eb4a612fd56e4e0657
Repository branch: revert-buffer-with-fine-grain
Windowing system distributor 'The X.Org Foundation', version 11.0.11906000
System Description: Ubuntu 16.04.6 LTS

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.

Configured using:
 'configure CFLAGS=-O3'

Configured features:
XPM JPEG TIFF GIF PNG RSVG SOUND GPM DBUS GSETTINGS GLIB NOTIFY INOTIFY
ACL LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB
TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM THREADS PDUMPER LCMS2 GMP

Important settings:
  value of $LANG: en_US.utf8
  value of $XMODIFIERS:
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny seq byte-opt gv
bytecomp byte-compile cconv dired dired-loaddefs format-spec rfc822 mml
easymenu mml-sec password-cache epa derived epg epg-config gnus-util
rmail rmail-loaddefs text-property-search time-date mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs
cl-lib sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
elec-pair mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks
lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar
dnd fontset image regexp-opt fringe tabulated-list replace newcomment
text-mode elisp-mode lisp-mode prog-mode register page menu-bar
rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core term/tty-colors frame cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese composite charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer
cl-preloaded nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote threads dbusbind
inotify lcms2 dynamic-setting system-font-setting font-render-setting
move-toolbar gtk x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 8 43995 8711)
 (symbols 24 5878 1)
 (strings 16 14997 2517)
 (string-bytes 1 501374)
 (vectors 8 8875)
 (vector-slots 4 114380 10618)
 (floats 8 18 13)
 (intervals 28 194 0)
 (buffers 564 11)
 (heap 1024 7599 790))

[-- Attachment #2: Type: text/html, Size: 4626 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names
  2019-05-16 22:19 bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names Mauro Aranda
@ 2019-05-16 23:42 ` Noam Postavsky
  2019-05-17 12:40   ` Mauro Aranda
  0 siblings, 1 reply; 6+ messages in thread
From: Noam Postavsky @ 2019-05-16 23:42 UTC (permalink / raw)
  To: Mauro Aranda; +Cc: 35768

Mauro Aranda <maurooaranda@gmail.com> writes:

> I noticed CC-Mode sometimes doesn't identify correctly function names
> when a macro name is involved in the function definition.  Try the
> following recipe to see the problem:
>
> 1) emacs -Q
> 2) C-x C-f test.c
> 3) Type the following function definitions:
>
> int DUMMY
> foo (void)
> {
>   return 1;
> }
>
> DUMMY int
> bar (void)
> {
>   return 0;
> }
>
> 4) Observe that:
> a) foo doesn't get fontified with font-lock-function-name-face, but
> DUMMY does.  Consequently, C-c C-z inside foo echoes
> DUMMY as the function name, in the echo area.
> b) In bar, DUMMY gets font-lock-type-face, which I don't
> think is correct.  bar gets font-lock-function-name-face and C-c C-z
> works as expected.
>
> ---
>
> Other problem is with fontification of the return type in the following:
>
> bool DUMMY
> baz_t (void)
> {
>   return true;
> }
>
> bool
> baz_f (void)
> {
>   return false;
> }
>
> Observe that bool doesn't get fontified in baz_t, but DUMMY does.  When
> DUMMY is not present, bool gets fontified correctly (as in baz_f).
>
>
> If it helps, I found the problem in a source file with functions that
> have macros that declare some function attributes, like
> _GL_ATTRIBUTE_PURE.

Have you tried customizing c-noise-macro-names, as described in (ccmode) Noise Macros?





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names
  2019-05-16 23:42 ` Noam Postavsky
@ 2019-05-17 12:40   ` Mauro Aranda
  2019-05-18 12:56     ` Alan Mackenzie
       [not found]     ` <20190518125628.GA6231@ACM>
  0 siblings, 2 replies; 6+ messages in thread
From: Mauro Aranda @ 2019-05-17 12:40 UTC (permalink / raw)
  To: Noam Postavsky; +Cc: 35768

[-- Attachment #1: Type: text/plain, Size: 1593 bytes --]

> Have you tried customizing c-noise-macro-names, as described in (ccmode)
Noise Macros?

Hello Noam, thanks for your answer.

I didn't know of c-noise-macro-names, thanks.  If after step 1) I eval
the following:
(defun my-c-mode-hook ()
  (setq c-noise-macro-names (append c-noise-macro-names '("DUMMY")))
  (c-make-noise-macro-regexps))
(add-hook 'c-mode-hook 'my-c-mode-hook)

And then follow the steps of my recipe, CC Mode works correctly.


However, the following recipe exposes another problem, I think:
1) emacs -Q
2) Eval the following:
(defun my-c-mode-hook ()
  (setq c-noise-macro-with-parens-names (append
c-noise-macro-with-parens-names
                                                '("DUMMY_1" "DUMMY_2")))
  (c-make-noise-macro-regexps))
(add-hook 'c-mode-hook 'my-c-mode-hook)

3) C-x C-f test.c
4) Type the following (no need to type the #define lines, that's just for
completion)
#define DUMMY_1(params)
#define DUMMY_2(params)

int DUMMY_1 (1) DUMMY_2 (2)
foo (void)
{
  return 0;
}

5) Observe that DUMMY_1 (1) is ignored as expected, but DUMMY_2 gets
font-lock-type-face.  I think that's not right.

6) To be sure that I customized c-noise-macro-with-parens-names correctly, I
tried a regexp search with c-noise-macro-with-parens-name-re, from the
beginning of the buffer:
(re-search-forward c-noise-macro-with-parens-name-re)
That gets four hits, as it should (2 for DUMMY_1 and 2 for DUMMY_2), meaning
that it does find DUMMY_2 as a noise macro with parens.

Is that a bug? Or is there something else I can use to help CC Mode not get
confused?

Best regards,
Mauro.

[-- Attachment #2: Type: text/html, Size: 1904 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names
  2019-05-17 12:40   ` Mauro Aranda
@ 2019-05-18 12:56     ` Alan Mackenzie
       [not found]     ` <20190518125628.GA6231@ACM>
  1 sibling, 0 replies; 6+ messages in thread
From: Alan Mackenzie @ 2019-05-18 12:56 UTC (permalink / raw)
  To: Mauro Aranda; +Cc: 35768, Noam Postavsky

Hello, Mauro.

On Fri, May 17, 2019 at 09:40:09 -0300, Mauro Aranda wrote:

[ .... ]

> However, the following recipe exposes another problem, I think:
> 1) emacs -Q
> 2) Eval the following:
> (defun my-c-mode-hook ()
>   (setq c-noise-macro-with-parens-names (append
> c-noise-macro-with-parens-names
>                                                 '("DUMMY_1" "DUMMY_2")))
>   (c-make-noise-macro-regexps))
> (add-hook 'c-mode-hook 'my-c-mode-hook)

> 3) C-x C-f test.c
> 4) Type the following (no need to type the #define lines, that's just for
> completion)
> #define DUMMY_1(params)
> #define DUMMY_2(params)

> int DUMMY_1 (1) DUMMY_2 (2)
> foo (void)
> {
>   return 0;
> }

> 5) Observe that DUMMY_1 (1) is ignored as expected, but DUMMY_2 gets
> font-lock-type-face.  I think that's not right.

It's not right, no.

> 6) To be sure that I customized c-noise-macro-with-parens-names correctly, I
> tried a regexp search with c-noise-macro-with-parens-name-re, from the
> beginning of the buffer:
> (re-search-forward c-noise-macro-with-parens-name-re)
> That gets four hits, as it should (2 for DUMMY_1 and 2 for DUMMY_2), meaning
> that it does find DUMMY_2 as a noise macro with parens.

Just as a matter of interest, I also tried putting "DUMMY_3" into
c-noise-macro-names, and inserting it in the middle of the pertinent
line in your test file.

> Is that a bug? Or is there something else I can use to help CC Mode not get
> confused?

It's a bug.  I hope the following patch fixes it.  Would you please
apply this patch, try it out in your real code, and confirm it fixes the
bug, or tell me what's still not working.  Thanks!



diff -r 43b8aba74b73 cc-engine.el
--- a/cc-engine.el	Wed May 15 08:45:55 2019 +0000
+++ b/cc-engine.el	Sat May 18 12:45:53 2019 +0000
@@ -4500,6 +4500,30 @@
 		       (goto-char pos))))))
       (< (point) start)))
 
+(defun c-end-of-token (&optional back-limit)
+  ;; Move to the end of the token we're just before or in the middle of.
+  ;; BACK-LIMIT may be used to bound the backward search; if given it's
+  ;; assumed to be at the boundary between two tokens.  Return non-nil if the
+  ;; point is moved, nil otherwise.
+  ;;
+  ;; This function might do hidden buffer changes.
+  (let ((start (point)))
+    (cond ;; ((< (skip-syntax-backward "w_" (1- start)) 0)
+     ;;  (skip-syntax-forward "w_"))
+     ((> (skip-syntax-forward "w_") 0))
+     ((< (skip-syntax-backward ".()" back-limit) 0)
+      (while (< (point) start)
+	(if (looking-at c-nonsymbol-token-regexp)
+	    (goto-char (match-end 0))
+	  ;; `c-nonsymbol-token-regexp' should always match since
+	  ;; we've skipped backward over punctuation or paren
+	  ;; syntax, but move forward in case it doesn't so that
+	  ;; we don't leave point earlier than we started with.
+	  (forward-char))))
+     (t (if (looking-at c-nonsymbol-token-regexp)
+	    (goto-char (match-end 0)))))
+    (> (point) start)))
+
 (defun c-end-of-current-token (&optional back-limit)
   ;; Move to the end of the current token.  Do not move if not in the
   ;; middle of one.  BACK-LIMIT may be used to bound the backward
@@ -5885,9 +5909,14 @@
 	     ;; comment style has removed face properties from a construct,
 	     ;; and is relying on `c-font-lock-declarations' to add them
 	     ;; again.
-	     (and (< (point) cfd-limit)
-		  (looking-at c-doc-line-join-re)
-		  (goto-char (match-end 0)))))
+	     (cond
+	      ((looking-at c-noise-macro-name-re)
+	       (c-forward-noise-clause-not-macro-decl nil)) ; Returns t.
+	      ((looking-at c-noise-macro-with-parens-name-re)
+	       (c-forward-noise-clause-not-macro-decl t)) ; Always returns t.
+	      ((and (< (point) cfd-limit)
+		    (looking-at c-doc-line-join-re))
+	       (goto-char (match-end 0))))))
        ;; Set the position to continue at.  We can avoid going over
        ;; the comments skipped above a second time, but it's possible
        ;; that the comment skipping has taken us past `cfd-prop-match'
@@ -5916,6 +5945,8 @@
   ;; o	The first token after the end of submatch 1 in
   ;;	`c-decl-prefix-or-start-re' when that submatch matches.	 This
   ;;	submatch is typically a (L or R) brace or paren, a ;, or a ,.
+  ;;    As a special case, noise macros are skipped over and the next
+  ;;    token regarded as the spot.
   ;; o	The start of each `c-decl-prefix-or-start-re' match when
   ;;	submatch 1 doesn't match.  This is, for example, the keyword
   ;;	"class" in Pike.
@@ -7452,6 +7483,21 @@
       (c-forward-syntactic-ws))
   t)
 
+(defun c-forward-noise-clause-not-macro-decl (maybe-parens)
+  ;; Point is at a noise macro identifier, which, when MAYBE-PARENS is
+  ;; non-nil, optionally takes paren arguments.  Go forward over this name,
+  ;; and when there may be optional parens, any parenthesis expression which
+  ;; follows it, but DO NOT go over any macro declaration which may come
+  ;; between them.  Always return t.
+  (c-end-of-token)
+  (when maybe-parens
+    (let ((here (point)))
+      (c-forward-comments)
+      (if (not (and (eq (char-after) ?\()
+		    (c-go-list-forward)))
+	  (goto-char here))))
+  t)
+
 (defun c-forward-keyword-clause (match)
   ;; Submatch MATCH in the current match data is assumed to surround a
   ;; token.  If it's a keyword, move over it and any immediately
@@ -9060,7 +9106,10 @@
 	   ((and c-opt-cpp-prefix
 		 (looking-at c-noise-macro-with-parens-name-re))
 	    (setq noise-start (point))
-	    (c-forward-noise-clause)
+	    (while
+		(and
+		  (c-forward-noise-clause)
+		  (looking-at c-noise-macro-with-parens-name-re)))
 	    (setq kwd-clause-end (point))))
 
 	  (when (setq found-type (c-forward-type t)) ; brace-block-too


> Best regards,
> Mauro.

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names
       [not found]     ` <20190518125628.GA6231@ACM>
@ 2019-05-18 13:56       ` Mauro Aranda
       [not found]       ` <CABczVwcqmJZRhJDe8wzQxpM4Y52T6AtWKop1ESUmPiycHizasw@mail.gmail.com>
  1 sibling, 0 replies; 6+ messages in thread
From: Mauro Aranda @ 2019-05-18 13:56 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: 35768, Noam Postavsky

[-- Attachment #1: Type: text/plain, Size: 402 bytes --]

Alan Mackenzie <acm@muc.de> writes:

> Hello, Mauro.

>> Is that a bug? Or is there something else I can use to help CC Mode not
get
>> confused?
>
> It's a bug.  I hope the following patch fixes it.  Would you please
> apply this patch, try it out in your real code, and confirm it fixes the
> bug, or tell me what's still not working.  Thanks!

Hello Alan.

The patch works like a charm.  Thank you!

[-- Attachment #2: Type: text/html, Size: 590 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names
       [not found]       ` <CABczVwcqmJZRhJDe8wzQxpM4Y52T6AtWKop1ESUmPiycHizasw@mail.gmail.com>
@ 2019-05-18 15:27         ` Alan Mackenzie
  0 siblings, 0 replies; 6+ messages in thread
From: Alan Mackenzie @ 2019-05-18 15:27 UTC (permalink / raw)
  To: Mauro Aranda; +Cc: 35768-done, Noam Postavsky

Hello again, Mauro.

On Sat, May 18, 2019 at 10:56:35 -0300, Mauro Aranda wrote:
> Alan Mackenzie <acm@muc.de> writes:

> > Hello, Mauro.

> >> Is that a bug? Or is there something else I can use to help CC Mode not
> >> get confused?

> > It's a bug.  I hope the following patch fixes it.  Would you please
> > apply this patch, try it out in your real code, and confirm it fixes
> > the bug, or tell me what's still not working.  Thanks!

> Hello Alan.

> The patch works like a charm.  Thank you!

Thank you.  I've committed the patch, and I'm now closing the bug.

-- 
Alan Mackenzie (Nuremberg, Germany).





^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-05-18 15:27 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-16 22:19 bug#35768: 27.0.50; CC-Mode problems with function definitions with macro names Mauro Aranda
2019-05-16 23:42 ` Noam Postavsky
2019-05-17 12:40   ` Mauro Aranda
2019-05-18 12:56     ` Alan Mackenzie
     [not found]     ` <20190518125628.GA6231@ACM>
2019-05-18 13:56       ` Mauro Aranda
     [not found]       ` <CABczVwcqmJZRhJDe8wzQxpM4Y52T6AtWKop1ESUmPiycHizasw@mail.gmail.com>
2019-05-18 15:27         ` Alan Mackenzie

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.