diff options
author | Owen Pan <owenpiano@gmail.com> | 2025-04-22 21:08:09 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-22 21:08:09 -0700 |
commit | 9efabbbbe58bd8bc2141ba1c914f79376e09cbcf (patch) | |
tree | 872fed605d1976511cdf9cf2a35f699dcddc6349 /clang/lib/Format/FormatTokenLexer.cpp | |
parent | 4f71655b64a815143d2aedb22b8f423f7ce99e29 (diff) | |
download | llvm-9efabbbbe58bd8bc2141ba1c914f79376e09cbcf.zip llvm-9efabbbbe58bd8bc2141ba1c914f79376e09cbcf.tar.gz llvm-9efabbbbe58bd8bc2141ba1c914f79376e09cbcf.tar.bz2 |
[clang-format] Fix a bug in lexing C++ UDL ending in $ (#136476)
Fix #61612
Diffstat (limited to 'clang/lib/Format/FormatTokenLexer.cpp')
-rw-r--r-- | clang/lib/Format/FormatTokenLexer.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 5c4e1f8..a4c94ac 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -128,6 +128,12 @@ void FormatTokenLexer::tryMergePreviousTokens() { if (Style.isCpp() && tryTransformTryUsageForC()) return; + if ((Style.Language == FormatStyle::LK_Cpp || + Style.Language == FormatStyle::LK_ObjC) && + tryMergeUserDefinedLiteral()) { + return; + } + if (Style.isJavaScript() || Style.isCSharp()) { static const tok::TokenKind NullishCoalescingOperator[] = {tok::question, tok::question}; @@ -559,6 +565,29 @@ bool FormatTokenLexer::tryMergeGreaterGreater() { return true; } +bool FormatTokenLexer::tryMergeUserDefinedLiteral() { + if (Tokens.size() < 2) + return false; + + auto *First = Tokens.end() - 2; + auto &Suffix = First[1]; + if (Suffix->hasWhitespaceBefore() || Suffix->TokenText != "$") + return false; + + auto &Literal = First[0]; + if (!Literal->Tok.isLiteral()) + return false; + + auto &Text = Literal->TokenText; + if (!Text.ends_with("_")) + return false; + + Text = StringRef(Text.data(), Text.size() + 1); + ++Literal->ColumnWidth; + Tokens.erase(&Suffix); + return true; +} + bool FormatTokenLexer::tryMergeTokens(ArrayRef<tok::TokenKind> Kinds, TokenType NewType) { if (Tokens.size() < Kinds.size()) |