[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:
parent
e4b352a0b9
commit
1f5fdc22a2
|
@ -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 {};
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user