[clang] [clang] Fix alias declaration fix-it location for token-split '>>' (PR #184555)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 4 06:23:26 PST 2026
https://github.com/luoliwoshang updated https://github.com/llvm/llvm-project/pull/184555
>From 13312f0cd5defe71ebd3bf8659a5d3a72c81afef Mon Sep 17 00:00:00 2001
From: luoliwoshang <2643523683 at qq.com>
Date: Wed, 4 Mar 2026 15:01:37 +0800
Subject: [PATCH 1/2] [clang] Fix alias-decl fix-it location with token-split
expansion
---
clang/lib/Lex/Lexer.cpp | 9 +++++++++
clang/test/Parser/cxx-alias-decl-split-angle-fixit.cpp | 7 +++++++
2 files changed, 16 insertions(+)
create mode 100644 clang/test/Parser/cxx-alias-decl-split-angle-fixit.cpp
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index cbf0c77232db7..f9f9a57330ac3 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -862,8 +862,17 @@ SourceLocation Lexer::getLocForEndOfToken(SourceLocation Loc, unsigned Offset,
return {};
if (Loc.isMacroID()) {
+ // Token-split expansion ranges (for example, when splitting '>>' into two
+ // '>' tokens while parsing templates) are character ranges, so the
+ // expansion end location already points just past the split token.
+ const bool IsTokenSplitRange =
+ !SM.getSLocEntry(SM.getFileID(Loc))
+ .getExpansion()
+ .isExpansionTokenRange();
if (Offset > 0 || !isAtEndOfMacroExpansion(Loc, SM, LangOpts, &Loc))
return {}; // Points inside the macro expansion.
+ if (IsTokenSplitRange)
+ return Loc;
}
unsigned Len = Lexer::MeasureTokenLength(Loc, SM, LangOpts);
diff --git a/clang/test/Parser/cxx-alias-decl-split-angle-fixit.cpp b/clang/test/Parser/cxx-alias-decl-split-angle-fixit.cpp
new file mode 100644
index 0000000000000..fc683431a958a
--- /dev/null
+++ b/clang/test/Parser/cxx-alias-decl-split-angle-fixit.cpp
@@ -0,0 +1,7 @@
+// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
+
+template <typename> struct X {};
+using A = X<int>>;
+
+// CHECK: error: expected ';' after alias declaration
+// CHECK: fix-it:"{{.*}}":{4:17-4:17}:";"
>From 6567092cb3a6e6fbbb459ac99dd447249a4ed27a Mon Sep 17 00:00:00 2001
From: luoliwoshang <2643523683 at qq.com>
Date: Wed, 4 Mar 2026 22:23:04 +0800
Subject: [PATCH 2/2] [clang] Narrow token-split check scope in
getLocForEndOfToken
---
clang/lib/Lex/Lexer.cpp | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index f9f9a57330ac3..c77f7f42b729d 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -865,13 +865,10 @@ SourceLocation Lexer::getLocForEndOfToken(SourceLocation Loc, unsigned Offset,
// Token-split expansion ranges (for example, when splitting '>>' into two
// '>' tokens while parsing templates) are character ranges, so the
// expansion end location already points just past the split token.
- const bool IsTokenSplitRange =
- !SM.getSLocEntry(SM.getFileID(Loc))
- .getExpansion()
- .isExpansionTokenRange();
+ const FileID LocFileID = SM.getFileID(Loc);
if (Offset > 0 || !isAtEndOfMacroExpansion(Loc, SM, LangOpts, &Loc))
return {}; // Points inside the macro expansion.
- if (IsTokenSplitRange)
+ if (!SM.getSLocEntry(LocFileID).getExpansion().isExpansionTokenRange())
return Loc;
}
More information about the cfe-commits
mailing list