[clang] [clang-tools-extra] [Clang] Retain the angle loci for invented template parameters of constraints (PR #92104)
Younan Zhang via cfe-commits
cfe-commits at lists.llvm.org
Tue May 14 04:55:17 PDT 2024
https://github.com/zyn0217 created https://github.com/llvm/llvm-project/pull/92104
Clangd uses it to determine whether the argument is within the selection range.
Fixes https://github.com/clangd/clangd/issues/2033
>From d9c0121067162ffb68bc70b9a0a3f10e0b05674c Mon Sep 17 00:00:00 2001
From: Younan Zhang <zyn7109 at gmail.com>
Date: Tue, 14 May 2024 19:46:20 +0800
Subject: [PATCH] [Clang] Retain the angle loci for invented template
parameters of constraints
Clangd uses it to determine whether the argument is within the selection range.
Fixes https://github.com/clangd/clangd/issues/2033
---
.../clangd/unittests/SelectionTests.cpp | 5 +++++
clang/lib/Sema/SemaType.cpp | 3 ++-
clang/test/AST/ast-dump-concepts.cpp | 13 +++++++++++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
index db516a1f62a35..706286e22cf74 100644
--- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -589,6 +589,11 @@ TEST(SelectionTest, CommonAncestor) {
auto x = [[ns::^C<int>]];
)cpp",
"ConceptReference"},
+ {R"cpp(
+ template <typename T, typename K>
+ concept D = true;
+ template <typename T> void g(D<[[^T]]> auto abc) {}
+ )cpp", "TemplateTypeParmTypeLoc"},
};
for (const Case &C : Cases) {
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index fddc3545ecb61..7eb7cda63a61f 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -3516,7 +3516,8 @@ InventTemplateParameter(TypeProcessingState &state, QualType T,
// The 'auto' appears in the decl-specifiers; we've not finished forming
// TypeSourceInfo for it yet.
TemplateIdAnnotation *TemplateId = D.getDeclSpec().getRepAsTemplateId();
- TemplateArgumentListInfo TemplateArgsInfo;
+ TemplateArgumentListInfo TemplateArgsInfo(TemplateId->LAngleLoc,
+ TemplateId->RAngleLoc);
bool Invalid = false;
if (TemplateId->LAngleLoc.isValid()) {
ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
diff --git a/clang/test/AST/ast-dump-concepts.cpp b/clang/test/AST/ast-dump-concepts.cpp
index 5bb174e3548ed..a5e0673c241ef 100644
--- a/clang/test/AST/ast-dump-concepts.cpp
+++ b/clang/test/AST/ast-dump-concepts.cpp
@@ -107,3 +107,16 @@ auto FooFunc(C auto V) -> C decltype(auto) {
}
}
+
+namespace constraint_auto_params {
+
+template <class T, class K>
+concept C = true;
+
+template<class T>
+void g(C<T> auto Foo) {}
+
+// CHECK: TemplateTypeParmDecl {{.*}} depth 0 index 1 Foo:auto
+// CHECK-NEXT: `-ConceptSpecializationExpr {{.*}} <col:8, col:11>
+
+}
More information about the cfe-commits
mailing list