[clang] d528537 - [Clang][Index] Add support for dependent class scope explicit specializations of function templates to USRGenerator (#98027)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 8 11:52:42 PDT 2024
Author: Krystian Stasiowski
Date: 2024-07-08T14:52:40-04:00
New Revision: d52853760183a25758659863b1b940e9502eaa88
URL: https://github.com/llvm/llvm-project/commit/d52853760183a25758659863b1b940e9502eaa88
DIFF: https://github.com/llvm/llvm-project/commit/d52853760183a25758659863b1b940e9502eaa88.diff
LOG: [Clang][Index] Add support for dependent class scope explicit specializations of function templates to USRGenerator (#98027)
Given the following:
```
template<typename T>
struct A
{
void f(int); // #1
template<typename U>
void f(U); // #2
template<>
void f<int>(int); // #3
};
```
Clang will generate the same USR for `#1` and `#2`. This patch fixes the
issue by including the template arguments of dependent class scope
explicit specializations in their USRs.
Added:
clang/test/Index/USR/func-template.cpp
Modified:
clang/lib/Index/USRGeneration.cpp
Removed:
################################################################################
diff --git a/clang/lib/Index/USRGeneration.cpp b/clang/lib/Index/USRGeneration.cpp
index 5036ddee35fd12..ad7870309c5df1 100644
--- a/clang/lib/Index/USRGeneration.cpp
+++ b/clang/lib/Index/USRGeneration.cpp
@@ -257,12 +257,20 @@ void USRGenerator::VisitFunctionDecl(const FunctionDecl *D) {
!D->hasAttr<OverloadableAttr>())
return;
- if (const TemplateArgumentList *
- SpecArgs = D->getTemplateSpecializationArgs()) {
+ if (D->isFunctionTemplateSpecialization()) {
Out << '<';
- for (unsigned I = 0, N = SpecArgs->size(); I != N; ++I) {
- Out << '#';
- VisitTemplateArgument(SpecArgs->get(I));
+ if (const TemplateArgumentList *SpecArgs =
+ D->getTemplateSpecializationArgs()) {
+ for (const auto &Arg : SpecArgs->asArray()) {
+ Out << '#';
+ VisitTemplateArgument(Arg);
+ }
+ } else if (const ASTTemplateArgumentListInfo *SpecArgsWritten =
+ D->getTemplateSpecializationArgsAsWritten()) {
+ for (const auto &ArgLoc : SpecArgsWritten->arguments()) {
+ Out << '#';
+ VisitTemplateArgument(ArgLoc.getArgument());
+ }
}
Out << '>';
}
diff --git a/clang/test/Index/USR/func-template.cpp b/clang/test/Index/USR/func-template.cpp
new file mode 100644
index 00000000000000..c9c82f5e30a751
--- /dev/null
+++ b/clang/test/Index/USR/func-template.cpp
@@ -0,0 +1,15 @@
+// RUN: c-index-test core -print-source-symbols -- %s | FileCheck %s
+
+template<typename T>
+struct A {
+ void f(int);
+ // CHECK: {{[0-9]+}}:8 | instance-method/C++ | f | c:@ST>1#T at A@F at f#I# |
+
+ template<typename U>
+ void f(U);
+ // CHECK: {{[0-9]+}}:8 | instance-method/C++ | f | c:@ST>1#T at A@FT@>1#Tf#t1.0#v# |
+
+ template<>
+ void f<int>(int);
+ // CHECK: {{[0-9]+}}:8 | instance-method/C++ | f | c:@ST>1#T at A@F at f<#I>#I# |
+};
More information about the cfe-commits
mailing list