Re: [RFC PATCH] Fix up cpp_check_xid_property (used by rust)

Jason Merrill <[email protected]> Wed, 5 Aug 2026 19:17:03 -0400
Newsgroups gmane.comp.gcc.rust,gmane.comp.gcc.patches
Message-ID <[email protected]>
On 6/11/26 7:48 AM, Jakub Jelinek wrote:
> Hi!
> 
> I believe cpp_check_xid_property (function added to libcpp for the Rust
> FE) is incorrect.
> The bits are documented
>    /* Valid in a C++23 identifier?  */
>    CXX23 = 32,
>    /* Valid in a C++23 identifier, but not as the first character?  */
>    NXX23 = 64,
> So, characters which have both the Unicode XID_Start and XID_Continue
> derived properties have just CXX23 bit set, and characters which
> have just XID_Continue derived property and not XID_Start have
> CXX23|NXX23 bits set.
> So, I believe the function (except for the ASCII fast path which is correct)
> incorrectly returns CPP_XID_START | CPP_XID_CONTINUE for any characters
> which have XID_Continue derived property, and only ever returns just
> CPP_XID_CONTINUE in the ASCII [0-9_] cases.

Sounds right to me.

> The following untested patch should fix that, I guess it would be nice to
> have a testcase, pick some character in XID_Continue and not in XID_Start,
> random choice e.g. SUNDANESE CONSONANT SIGN PASANGAN WA, and check if
> it can be used in the second+ character of identifier (probably it can and
> should continue to do so) and as the first character of identifier
> (likely incorrectly accepted right now).
> 
> 2026-06-11  Jakub Jelinek  <[email protected]>
> 
> 	* charset.cc (cpp_check_xid_property): Return
> 	CPP_XID_START | CPP_XID_CONTINUE only if CXX23 bit is set and NXX23
> 	is not.  If both are set, return CPP_XID_CONTINUE.
> 
> --- libcpp/charset.cc.jj	2026-04-21 18:24:44.122033404 +0200
> +++ libcpp/charset.cc	2026-06-11 13:33:51.356096060 +0200
> @@ -1366,9 +1366,9 @@ cpp_check_xid_property (cppchar_t c)
>   
>     unsigned short flags = ucnranges[mn].flags;
>   
> -  if (flags & CXX23)
> +  if ((flags & (CXX23 | NXX23)) == CXX23)
>       return CPP_XID_START | CPP_XID_CONTINUE;
> -  if (flags & NXX23)
> +  if ((flags & (CXX23 | NXX23)) == (CXX23 | NXX23))
>       return CPP_XID_CONTINUE;
>     return 0;
>   }
> 
> 	Jakub
>