Subject: CC Mode 5.35.2 (C/*l); Incorrect fontification of `xid' as type

From: Po Lu <[email-masked]>
Date: Fri, 02 Dec 2022 11:20:01 +0800

Package: cc-mode

Insert the following file in a C mode buffer:

/* idalloc.c - client resource management.  */

#include <config.h>

#include "idalloc.h"

/* Array of all resource tables.  */
struct resource_table *resource_tables[MAX_TABLE_ID];

/* Find a single unused resource table ID.  Return (card16) -1 upon
   failure.  */

static card16
get_free_id (void)
{
  card16 i;

  for (i = 0; i <= MAX_TABLE_ID; ++i)
    {
      if (!resource_tables[i])
	return i;
    }

  return (card16) -1;
}

/* Create a resource table for the server or for a new client.  Return
   NULL if the table could not be allocated.  */

struct resource_table *
get_resource_table (void)
{
  struct resource_table *table;
  card16 id;

  id = find_free_id ();

  if (id == (card16) -1)
    return NULL;

  table = server_malloc (sizeof *table);

  if (!table)
    return;

  table->id = id;
  table->resource_map = gl_map_nx_create_empty (GL_HASH_MAP, NULL,
						NULL, NULL, NULL);

  if (!table->resource_map)
    {
      server_free (table);
      return NULL;
    }

  resource_tables[table->id] = table;
  return table;
}

/* Look up a resource given the specified XID and type, and return it
   in RESOURCE.  If CLIENT is specified, the lookup is being done on
   behalf of the specified client.  Return the result of the lookup:

     L_SUCCESS   - the lookup was successful.
     L_WRONGTYPE - the resource was found, but it is the wrong type.
     L_ACCESS	 - the resource was found, but cannot be accessed.
     L_ERROR     - the resource was not found.

   The upper 10 bits of the XID provide the index into the resource
   table, and the lower 19 bits are used as the key to the hash table.

   Any resource found is returned in RESOURCE, which is otherwise set
   to NULL.  */

enum lookup_result
id_lookup (xid xid, enum resource_type type, struct client *client,
	   struct resource **resource)
{
  card16 table_id;
  struct resource_table *table;

  *resource = NULL;

  table_id = (xid >> (29 - TABLE_ID_BITS) & MAX_TABLE_ID);
  table = resource_tables[table_id];

  if (!table)
    return L_ERROR;

  return id_lookup_1 (xid, type, client, resource);
}

enum lookup_result
id_lookup_1 (xid xid, struct resource_table *resource_table,
	     enum resource_type type, struct client *client,
	     struct resource **resource)
{
  void *value;

  *resource = NULL;

  if (!gl_map_search (resource_table->map,
		      (intptr_t) (xid & TABLE_RESOURCE_MASK),
		      &value))
    return;
}

and scroll to the very end.  In "id_lookup_1", every occurrence of "xid"
will be fontified as a type!.

Emacs  : GNU Emacs 39.0.60 (build 7, x86_64-pc-linux-gnu)
 of 2022-12-02
Package: CC Mode 5.35.2 (C/*l)
Buffer Style: gnu
c-emacs-features: (pps-extended-state col-0-paren posix-char-classes gen-string-delim gen-comment-delim syntax-properties category-properties 1-bit)

current state:
==============
(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 "[ 	]*\\(//+\\|\\**\\)[ 	]*\\([ 	]*\\([-–!|#%;>*·•‣⁃◦]+[ 	]*\\)*\\)"
 )