File tree Expand file tree Collapse file tree 2 files changed +20
-4
lines changed Expand file tree Collapse file tree 2 files changed +20
-4
lines changed Original file line number Diff line number Diff line change @@ -860,15 +860,17 @@ class ExplicitReferenceCollector
860860 // TemplateArgumentLoc is the only way to get locations for references to
861861 // template template parameters.
862862 bool TraverseTemplateArgumentLoc (TemplateArgumentLoc A) {
863+ llvm::SmallVector<const NamedDecl *, 1 > Targets;
863864 switch (A.getArgument ().getKind ()) {
864865 case TemplateArgument::Template:
865866 case TemplateArgument::TemplateExpansion:
867+ if (const auto *D = A.getArgument ()
868+ .getAsTemplateOrTemplatePattern ()
869+ .getAsTemplateDecl ())
870+ Targets.push_back (D);
866871 reportReference (ReferenceLoc{A.getTemplateQualifierLoc (),
867872 A.getTemplateNameLoc (),
868- /* IsDecl=*/ false ,
869- {A.getArgument ()
870- .getAsTemplateOrTemplatePattern ()
871- .getAsTemplateDecl ()}},
873+ /* IsDecl=*/ false , Targets},
872874 DynTypedNode::create (A.getArgument ()));
873875 break ;
874876 case TemplateArgument::Declaration:
Original file line number Diff line number Diff line change @@ -1286,6 +1286,20 @@ TEST_F(FindExplicitReferencesTest, All) {
12861286 " 1: targets = {}\n "
12871287 " 2: targets = {T}\n "
12881288 },
1289+ // unknown template name should not crash.
1290+ {R"cpp(
1291+ template <template <typename> typename T>
1292+ struct Base {};
1293+ namespace foo {
1294+ template <typename $0^T>
1295+ struct $1^Derive : $2^Base<$3^T::template $4^Unknown> {};
1296+ }
1297+ )cpp" ,
1298+ " 0: targets = {foo::Derive::T}, decl\n "
1299+ " 1: targets = {foo::Derive}, decl\n "
1300+ " 2: targets = {Base}\n "
1301+ " 3: targets = {foo::Derive::T}\n "
1302+ " 4: targets = {}, qualifier = 'T::'\n " },
12891303 };
12901304
12911305 for (const auto &C : Cases) {
You can’t perform that action at this time.
0 commit comments