Subject: bug#63840: 29.0.91; c-ts-mode fails to fontify common C extension

From: Eli Zaretskii <[email-masked]>
Date: Fri, 02 Jun 2023 15:51:53 +0300

> Date: Fri, 02 Jun 2023 20:11:33 +0800
> From:  Po Lu via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <[email-masked]>
> 
> A common extension to the C language is the use of the `$' sign inside
> external identifier names.
> 
> This is permitted by GNU CC on most systems it supports, and also
> supported by CC Mode.  However, it does not work on c-ts-mode:
> 
> sl$loadarena ()
> {
>   struct FAB fab;
>   register int status;
>   extern char *sl$dfname;
> 
>   fab = cc$rms_fab;
>   fab.fab$b_fac = FAB$M_BIO | FAB$M_GET;
>   fab.fab$l_fna = sl$dfname;
>   fab.fab$b_fns = strlen (sl$dfname);
>   status = sys$open (&fab);
>   if (status != RMS$_NORMAL)
>     return status;
>   /* More code below.  */
> }
> 
> in the identifier name of this function declarator, `sl' is fontified as
> a type.  `$' is not fontified at all.  `loadarena' is fontified as an
> identifier name, as it should be.  In:
> 
>   extern char *sl$defname;
> 
> only `dfname' is fontified as a variable name; in CC Mode, all
> fontification is correct.
> 
> This should be a simple change in c-ts-mode's identifier fontifying
> regexp to include `$', right?  I don't know enough about tree-sitter to
> fix it myself.

I'm not sure this can be fixed unless the tree-sitter's C grammar
supports such identifiers, but if we can fix it in our code, we
should.

Yuan and Theo, can you please look into this?