[clangd] Fix template type aliases in findExplicitReference

Reviewers: kadircet

Reviewed By: kadircet

Subscribers: MaskRay, jkorous, arphaman, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D68124

llvm-svn: 373104
This commit is contained in:
Ilya Biryukov 2019-09-27 17:55:46 +00:00
parent a524e630a7
commit 4ae2381430
2 changed files with 28 additions and 21 deletions

View File

@ -477,13 +477,6 @@ Optional<ReferenceLoc> refInTypeLoc(TypeLoc L) {
Ref->Qualifier = L.getQualifierLoc();
}
void VisitDeducedTemplateSpecializationTypeLoc(
DeducedTemplateSpecializationTypeLoc L) {
Ref = ReferenceLoc{
NestedNameSpecifierLoc(), L.getNameLoc(),
explicitReferenceTargets(DynTypedNode::create(L.getType()))};
}
void VisitTagTypeLoc(TagTypeLoc L) {
Ref =
ReferenceLoc{NestedNameSpecifierLoc(), L.getNameLoc(), {L.getDecl()}};
@ -495,9 +488,25 @@ Optional<ReferenceLoc> refInTypeLoc(TypeLoc L) {
}
void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc L) {
// We must ensure template type aliases are included in results if they
// were written in the source code, e.g. in
// template <class T> using valias = vector<T>;
// ^valias<int> x;
// 'explicitReferenceTargets' will return:
// 1. valias with mask 'Alias'.
// 2. 'vector<int>' with mask 'Underlying'.
// we want to return only #1 in this case.
Ref = ReferenceLoc{
NestedNameSpecifierLoc(), L.getTemplateNameLoc(),
explicitReferenceTargets(DynTypedNode::create(L.getType()))};
explicitReferenceTargets(DynTypedNode::create(L.getType()),
DeclRelation::Alias)};
}
void VisitDeducedTemplateSpecializationTypeLoc(
DeducedTemplateSpecializationTypeLoc L) {
Ref = ReferenceLoc{
NestedNameSpecifierLoc(), L.getNameLoc(),
explicitReferenceTargets(DynTypedNode::create(L.getType()),
DeclRelation::Alias)};
}
void VisitDependentTemplateSpecializationTypeLoc(

View File

@ -615,20 +615,18 @@ TEST_F(FindExplicitReferencesTest, All) {
)cpp",
"0: targets = {vector<int>}\n"
"1: targets = {vector<bool>}\n"},
// FIXME: Fix 'allTargetDecls' to return alias template and re-enable.
// Template type aliases.
// {R"cpp(
// template <class T> struct vector { using value_type = T; };
// template <> struct vector<bool> { using value_type = bool; };
// template <class T> using valias = vector<T>;
// void foo() {
// $0^valias<int> vi;
// $1^valias<bool> vb;
// }
// )cpp",
// "0: targets = {valias}\n"
// "1: targets = {valias}\n"},
{R"cpp(
template <class T> struct vector { using value_type = T; };
template <> struct vector<bool> { using value_type = bool; };
template <class T> using valias = vector<T>;
void foo() {
$0^valias<int> vi;
$1^valias<bool> vb;
}
)cpp",
"0: targets = {valias}\n"
"1: targets = {valias}\n"},
// MemberExpr should know their using declaration.
{R"cpp(
struct X { void func(int); }