Author: ibiryukov Date: Fri Sep 27 10:55:46 2019 New Revision: 373104 URL: http://llvm.org/viewvc/llvm-project?rev=373104&view=rev Log: [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 Modified: clang-tools-extra/trunk/clangd/FindTarget.cpp clang-tools-extra/trunk/clangd/unittests/FindTargetTests.cpp Modified: clang-tools-extra/trunk/clangd/FindTarget.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/FindTarget.cpp?rev=373104&r1=373103&r2=373104&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/FindTarget.cpp (original) +++ clang-tools-extra/trunk/clangd/FindTarget.cpp Fri Sep 27 10:55:46 2019 @@ -477,13 +477,6 @@ Optional<ReferenceLoc> refInTypeLoc(Type 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(Type } 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( Modified: clang-tools-extra/trunk/clangd/unittests/FindTargetTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/FindTargetTests.cpp?rev=373104&r1=373103&r2=373104&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/unittests/FindTargetTests.cpp (original) +++ clang-tools-extra/trunk/clangd/unittests/FindTargetTests.cpp Fri Sep 27 10:55:46 2019 @@ -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); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits