[clang] Fix a UsingTemplate regression after 3e78fa8602

TemplateName::getAsTemplateDecl() returns the underlying TemplateDecl
for a UsingTemplate kind template name. We should respect that in the
Profile method otherwise we might desugar the template name unexpectedly
(e.g. for template argument deduction with deduciton guides).

Differential Revision: https://reviews.llvm.org/D146202
This commit is contained in:
Haojian Wu 2023-03-16 09:42:41 +01:00
parent e4b352a0b9
commit 1f5fdc22a2
3 changed files with 20 additions and 1 deletions

View File

@ -171,6 +171,13 @@ TEST(WalkAST, TemplateNames) {
namespace ns {template <typename> struct S {}; }
using ns::$explicit^S;)cpp",
"^S<int> x;");
testWalk(R"cpp(
namespace ns {
template <typename T> struct S { S(T);};
template <typename T> S(T t) -> S<T>;
}
using ns::$explicit^S;)cpp",
"^S x(123);");
testWalk("template<typename> struct $explicit^S {};",
R"cpp(
template <template <typename> typename> struct X {};

View File

@ -282,7 +282,9 @@ bool TemplateName::containsUnexpandedParameterPack() const {
}
void TemplateName::Profile(llvm::FoldingSetNodeID &ID) {
if (auto *TD = getAsTemplateDecl())
if (const auto* USD = getAsUsingShadowDecl())
ID.AddPointer(USD->getCanonicalDecl());
else if (const auto *TD = getAsTemplateDecl())
ID.AddPointer(TD->getCanonicalDecl());
else
ID.AddPointer(Storage.getOpaqueValue());

View File

@ -9,8 +9,11 @@ template<typename T> class S {
public:
S(T);
};
template<typename T> struct S2 { S2(T); };
template <typename T> S2(T t) -> S2<T>;
}
using ns::S;
using ns::S2;
// TemplateName in TemplateSpecializationType.
template<typename T>
@ -36,3 +39,10 @@ using C = decltype(DeducedTemplateSpecializationT);
// CHECK-NEXT: |-DeclRefExpr {{.*}}
// CHECK-NEXT: `-ElaboratedType {{.*}} 'S<int>' sugar
// CHECK-NEXT: `-DeducedTemplateSpecializationType {{.*}} 'ns::S<int>' sugar using
S2 DeducedTemplateSpecializationT2(123);
using D = decltype(DeducedTemplateSpecializationT2);
// CHECK: DecltypeType {{.*}}
// CHECK-NEXT: |-DeclRefExpr {{.*}}
// CHECK-NEXT: `-ElaboratedType {{.*}} 'S2<int>' sugar
// CHECK-NEXT: `-DeducedTemplateSpecializationType {{.*}} 'S2<int>' sugar using