[clang-tools-extra] e81c981 - [clangd] Don't collect templated decls for builtin templates (#78466)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 18 18:54:51 PST 2024
Author: Younan Zhang
Date: 2024-01-19T10:54:47+08:00
New Revision: e81c981fe35483a4b7474e110ff1b5d02bc2cb00
URL: https://github.com/llvm/llvm-project/commit/e81c981fe35483a4b7474e110ff1b5d02bc2cb00
DIFF: https://github.com/llvm/llvm-project/commit/e81c981fe35483a4b7474e110ff1b5d02bc2cb00.diff
LOG: [clangd] Don't collect templated decls for builtin templates (#78466)
Builtin templates e.g. `__make_integer_seq`, `__type_pack_element` are
such that they don't have alias *Decls*.
[D133262](https://reviews.llvm.org/D133262) marked these as alias
templates, resulting in an attempt to collect their null "using" Decls
within our `TargetFinder`.
This fixes https://github.com/clangd/clangd/issues/1906.
Added:
Modified:
clang-tools-extra/clangd/FindTarget.cpp
clang-tools-extra/clangd/unittests/FindTargetTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp
index 839cf6332fe8b0..3d73e77b16aff4 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -443,9 +443,16 @@ struct TargetFinder {
Outer.add(TST->getAliasedType(), Flags | Rel::Underlying);
// Don't *traverse* the alias, which would result in traversing the
// template of the underlying type.
- Outer.report(
- TST->getTemplateName().getAsTemplateDecl()->getTemplatedDecl(),
- Flags | Rel::Alias | Rel::TemplatePattern);
+
+ TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
+ // Builtin templates e.g. __make_integer_seq, __type_pack_element
+ // are such that they don't have alias *decls*. Even then, we still
+ // traverse their desugared *types* so that instantiated decls are
+ // collected.
+ if (llvm::isa<BuiltinTemplateDecl>(TD))
+ return;
+ Outer.report(TD->getTemplatedDecl(),
+ Flags | Rel::Alias | Rel::TemplatePattern);
}
// specializations of template template parameters aren't instantiated
// into decls, so they must refer to the parameter itself.
diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
index fbd10c4a47a793..29cff68cf03b2e 100644
--- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp
@@ -709,6 +709,33 @@ TEST_F(TargetDeclTest, TypeAliasTemplate) {
Rel::Alias | Rel::TemplatePattern});
}
+TEST_F(TargetDeclTest, BuiltinTemplates) {
+ Code = R"cpp(
+ template <class T, T... Index> struct integer_sequence {};
+ [[__make_integer_seq]]<integer_sequence, int, 3> X;
+ )cpp";
+ EXPECT_DECLS(
+ "TemplateSpecializationTypeLoc",
+ {"struct integer_sequence", Rel::TemplatePattern | Rel::Underlying},
+ {"template<> struct integer_sequence<int, <0, 1, 2>>",
+ Rel::TemplateInstantiation | Rel::Underlying});
+
+ // Dependent context.
+ Code = R"cpp(
+ template <class T, T... Index> struct integer_sequence;
+
+ template <class T, int N>
+ using make_integer_sequence = [[__make_integer_seq]]<integer_sequence, T, N>;
+ )cpp";
+ EXPECT_DECLS("TemplateSpecializationTypeLoc");
+
+ Code = R"cpp(
+ template <int N, class... Pack>
+ using type_pack_element = [[__type_pack_element]]<N, Pack...>;
+ )cpp";
+ EXPECT_DECLS("TemplateSpecializationTypeLoc");
+}
+
TEST_F(TargetDeclTest, MemberOfTemplate) {
Code = R"cpp(
template <typename T> struct Foo {
More information about the cfe-commits
mailing list