adamcz created this revision. adamcz added a reviewer: nridge. Herald added subscribers: usaxena95, kadircet, arphaman. adamcz requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
Previously we would call getAsTemplate() when kind == TemplateExpansion, which triggers an assertion. The call is now replaced with getAsTemplateOrTemplatePattern(), which is exactly the same as getAsTemplate(), except it allows calls when kind == TemplateExpansion. No change in behavior for no-assert builds. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D111648 Files: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/unittests/FindTargetTests.cpp Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -341,6 +341,15 @@ EXPECT_DECLS("TemplateSpecializationTypeLoc", "template <typename> class T"); Flags.clear(); + Code = R"cpp( + template<template<typename> class ...T> + class C { + C<[[T...]]> foo; + }; + )cpp"; + EXPECT_DECLS("TemplateArgumentLoc", {"template <typename> class ...T"}); + Flags.clear(); + Code = R"cpp( struct S{}; S X; Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -507,7 +507,8 @@ // DeclRefExpr). if (Arg.getKind() == TemplateArgument::Template || Arg.getKind() == TemplateArgument::TemplateExpansion) { - if (TemplateDecl *TD = Arg.getAsTemplate().getAsTemplateDecl()) { + if (TemplateDecl *TD = + Arg.getAsTemplateOrTemplatePattern().getAsTemplateDecl()) { report(TD, Flags); } }
Index: clang-tools-extra/clangd/unittests/FindTargetTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -341,6 +341,15 @@ EXPECT_DECLS("TemplateSpecializationTypeLoc", "template <typename> class T"); Flags.clear(); + Code = R"cpp( + template<template<typename> class ...T> + class C { + C<[[T...]]> foo; + }; + )cpp"; + EXPECT_DECLS("TemplateArgumentLoc", {"template <typename> class ...T"}); + Flags.clear(); + Code = R"cpp( struct S{}; S X; Index: clang-tools-extra/clangd/FindTarget.cpp =================================================================== --- clang-tools-extra/clangd/FindTarget.cpp +++ clang-tools-extra/clangd/FindTarget.cpp @@ -507,7 +507,8 @@ // DeclRefExpr). if (Arg.getKind() == TemplateArgument::Template || Arg.getKind() == TemplateArgument::TemplateExpansion) { - if (TemplateDecl *TD = Arg.getAsTemplate().getAsTemplateDecl()) { + if (TemplateDecl *TD = + Arg.getAsTemplateOrTemplatePattern().getAsTemplateDecl()) { report(TD, Flags); } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits