https://github.com/cor3ntin created 
https://github.com/llvm/llvm-project/pull/208490

When dollars are supported in identifiers, we should be consistent.

Fixes #173985

>From eadbc3d07abb6cb591ad73f6a43b56c0c6e2dfbf Mon Sep 17 00:00:00 2001
From: Corentin Jabot <[email protected]>
Date: Thu, 9 Jul 2026 17:41:30 +0200
Subject: [PATCH] [Clang] Supports dollars in UDLs

When dollars are supported in identifiers, we should be consistent.

Fixes #173985
---
 clang/docs/ReleaseNotes.md              |  3 ++-
 clang/lib/Lex/Lexer.cpp                 |  4 ++--
 clang/test/test/Lexer/dollar-idents.cpp | 17 +++++++++++++++++
 3 files changed, 21 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/test/Lexer/dollar-idents.cpp

diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index be894701f5ce9..b0d80ebf34cac 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -787,6 +787,7 @@ latest release, please see the [Clang Web 
Site](https://clang.llvm.org) or the
 - Fixed an issue where `__typeof_unqual` and `__typeof_unqual__` were rejected 
as a declaration specifier in block scope in C++.
 - Fixed crash when checking for overflow for unary operator that can't 
overflow (#GH170072)
 - Clang no longer handles a `" q-char-sequence "` header name as a string 
literal (#GH132643).
+- Under `-fdollars-in-identifiers`, the `$` can now appear in 
user-defined-literals. (#GH173985)
 - Fixed an assertion where we improperly handled implicit conversions to 
integral types from an atomic-type with a conversion function. (#GH201770)
 - Fixed assertion failures involving code completion with delayed default 
arguments and exception specifications. (#GH200879)
 - Fixed a regression where calling a function that takes a class-type 
parameter by value inside `decltype` of a concept could be incorrectly rejected 
when used as a non-type template argument. (#GH175831)
@@ -1122,7 +1123,7 @@ latest release, please see the [Clang Web 
Site](https://clang.llvm.org) or the
 
 - Fixed a crash in code completion when using a C-Style cast with a 
parenthesized
   operand in Objective-C++ mode. (#GH180125)
-- Fixed a crash when code completion is triggered inside an ill-formed 
lambda's trailing requires-clause. (#GH201632)  
+- Fixed a crash when code completion is triggered inside an ill-formed 
lambda's trailing requires-clause. (#GH201632)
 
 ### Static Analyzer
 
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index f52b84a42ca70..4742fd2073f05 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -2179,7 +2179,7 @@ const char *Lexer::LexUDSuffix(Token &Result, const char 
*CurPtr,
   char C = getCharAndSize(CurPtr, Size);
   bool Consumed = false;
 
-  if (!isAsciiIdentifierStart(C)) {
+  if (!isAsciiIdentifierStart(C, LangOpts.DollarIdents)) {
     if (C == '\\' && tryConsumeIdentifierUCN(CurPtr, Size, Result))
       Consumed = true;
     else if (!isASCII(C) && tryConsumeIdentifierUTF8Char(CurPtr, Result))
@@ -2217,7 +2217,7 @@ const char *Lexer::LexUDSuffix(Token &Result, const char 
*CurPtr,
       while (true) {
         auto [Next, NextSize] =
             getCharAndSizeNoWarn(CurPtr + Consumed, LangOpts);
-        if (!isAsciiIdentifierContinue(Next)) {
+        if (!isAsciiIdentifierContinue(Next, LangOpts.DollarIdents)) {
           // End of suffix. Check whether this is on the allowed list.
           const StringRef CompleteSuffix(Buffer, Chars);
           IsUDSuffix =
diff --git a/clang/test/test/Lexer/dollar-idents.cpp 
b/clang/test/test/Lexer/dollar-idents.cpp
new file mode 100644
index 0000000000000..d7b79f2964a92
--- /dev/null
+++ b/clang/test/test/Lexer/dollar-idents.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -std=c++20 -Wno-user-defined-literals
+
+int $;  // no_dollar-error {{expected unqualified-id}}
+int $$; // no_dollar-error {{expected unqualified-id}}
+int Σ$; // no_dollar-error {{expected ';' after top level declarator}}
+int $Σ; // no_dollar-error {{expected unqualified-id}}
+
+using size_t = decltype(sizeof(void *));
+
+auto operator"" $(const char *p, size_t n) { return 0; } // no_dollar-error 
{{expected identifier}}
+auto operator"" $$(const char *p, size_t n) { return 0; } // no_dollar-error 
{{expected identifier}}
+auto operator"" Σ$(const char *p, size_t n) { return 0; } // no_dollar-error 
{{'operator""Σ' cannot be the name of a variable or data member}} \
+                                                          // no_dollar-error 
{{expected ';' after top level declarator}}
+auto operator"" $Σ(const char *p, size_t n) { return 0; } // no_dollar-error 
{{expected identifier}}
+auto operator"" Σ(const char *p, size_t n) { return 0; }
+
+

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to