Skip to content

Commit 647fd2c

Browse files
committed
[FOLD] add hasMemberSpecialization
1 parent d8c0c64 commit 647fd2c

File tree

5 files changed

+48
-39
lines changed

5 files changed

+48
-39
lines changed

clang/include/clang/AST/DeclTemplate.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,16 @@ class RedeclarableTemplateDecl : public TemplateDecl,
860860
/// \endcode
861861
bool isMemberSpecialization() const { return Common.getInt(); }
862862

863+
/// Determines whether any redeclaration of this template was
864+
/// a specialization of a member template.
865+
bool hasMemberSpecialization() const {
866+
for (const auto *D : redecls()) {
867+
if (D->isMemberSpecialization())
868+
return true;
869+
}
870+
return false;
871+
}
872+
863873
/// Note that this member template is a specialization.
864874
void setMemberSpecialization() {
865875
assert(!isMemberSpecialization() && "already a member specialization");
@@ -2192,6 +2202,17 @@ class ClassTemplatePartialSpecializationDecl
21922202
return InstantiatedFromMember.getInt();
21932203
}
21942204

2205+
/// Determines whether any redeclaration of this this class template partial
2206+
/// specialization was a specialization of a member partial specialization.
2207+
bool hasMemberSpecialization() const {
2208+
for (const auto *D : redecls()) {
2209+
if (cast<ClassTemplatePartialSpecializationDecl>(D)
2210+
->isMemberSpecialization())
2211+
return true;
2212+
}
2213+
return false;
2214+
}
2215+
21952216
/// Note that this member template is a specialization.
21962217
void setMemberSpecialization() { return InstantiatedFromMember.setInt(true); }
21972218

@@ -2947,6 +2968,18 @@ class VarTemplatePartialSpecializationDecl
29472968
return InstantiatedFromMember.getInt();
29482969
}
29492970

2971+
/// Determines whether any redeclaration of this this variable template
2972+
/// partial specialization was a specialization of a member partial
2973+
/// specialization.
2974+
bool hasMemberSpecialization() const {
2975+
for (const auto *D : redecls()) {
2976+
if (cast<VarTemplatePartialSpecializationDecl>(D)
2977+
->isMemberSpecialization())
2978+
return true;
2979+
}
2980+
return false;
2981+
}
2982+
29502983
/// Note that this member template is a specialization.
29512984
void setMemberSpecialization() { return InstantiatedFromMember.setInt(true); }
29522985

clang/lib/AST/Decl.cpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2696,10 +2696,7 @@ VarDecl *VarDecl::getTemplateInstantiationPattern() const {
26962696
if (isTemplateInstantiation(VDTemplSpec->getTemplateSpecializationKind())) {
26972697
auto From = VDTemplSpec->getInstantiatedFrom();
26982698
if (auto *VTD = From.dyn_cast<VarTemplateDecl *>()) {
2699-
while (true) {
2700-
VTD = VTD->getMostRecentDecl();
2701-
if (VTD->isMemberSpecialization())
2702-
break;
2699+
while (!VTD->hasMemberSpecialization()) {
27032700
if (auto *NewVTD = VTD->getInstantiatedFromMemberTemplate())
27042701
VTD = NewVTD;
27052702
else
@@ -2709,10 +2706,7 @@ VarDecl *VarDecl::getTemplateInstantiationPattern() const {
27092706
}
27102707
if (auto *VTPSD =
27112708
From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
2712-
while (true) {
2713-
VTPSD = VTPSD->getMostRecentDecl();
2714-
if (VTPSD->isMemberSpecialization())
2715-
break;
2709+
while (!VTPSD->hasMemberSpecialization()) {
27162710
if (auto *NewVTPSD = VTPSD->getInstantiatedFromMember())
27172711
VTPSD = NewVTPSD;
27182712
else
@@ -2726,10 +2720,7 @@ VarDecl *VarDecl::getTemplateInstantiationPattern() const {
27262720
// If this is the pattern of a variable template, find where it was
27272721
// instantiated from. FIXME: Is this necessary?
27282722
if (VarTemplateDecl *VTD = VD->getDescribedVarTemplate()) {
2729-
while (true) {
2730-
VTD = VTD->getMostRecentDecl();
2731-
if (VTD->isMemberSpecialization())
2732-
break;
2723+
while (!VTD->hasMemberSpecialization()) {
27332724
if (auto *NewVTD = VTD->getInstantiatedFromMemberTemplate())
27342725
VTD = NewVTD;
27352726
else
@@ -4150,10 +4141,7 @@ FunctionDecl::getTemplateInstantiationPattern(bool ForDefinition) const {
41504141
if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) {
41514142
// If we hit a point where the user provided a specialization of this
41524143
// template, we're done looking.
4153-
while (true) {
4154-
Primary = Primary->getMostRecentDecl();
4155-
if (ForDefinition && Primary->isMemberSpecialization())
4156-
break;
4144+
while (!ForDefinition || !Primary->hasMemberSpecialization()) {
41574145
if (auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate())
41584146
Primary = NewPrimary;
41594147
else

clang/lib/AST/DeclCXX.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2023,10 +2023,7 @@ const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
20232023
if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) {
20242024
auto From = TD->getInstantiatedFrom();
20252025
if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) {
2026-
while (true) {
2027-
CTD = CTD->getMostRecentDecl();
2028-
if (CTD->isMemberSpecialization())
2029-
break;
2026+
while (!CTD->hasMemberSpecialization()) {
20302027
if (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate())
20312028
CTD = NewCTD;
20322029
else
@@ -2036,10 +2033,7 @@ const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {
20362033
}
20372034
if (auto *CTPSD =
20382035
From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
2039-
while (true) {
2040-
CTPSD = CTPSD->getMostRecentDecl();
2041-
if (CTPSD->isMemberSpecialization())
2042-
break;
2036+
while (!CTPSD->hasMemberSpecialization()) {
20432037
if (auto *NewCTPSD = CTPSD->getInstantiatedFromMemberTemplate())
20442038
CTPSD = NewCTPSD;
20452039
else

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9077,8 +9077,8 @@ bool Sema::CheckFunctionTemplateSpecialization(
90779077
TemplateDeductionInfo Info(FailedCandidates.getLocation());
90789078
FunctionDecl *Specialization = nullptr;
90799079
if (TemplateDeductionResult TDK = DeduceTemplateArguments(
9080-
cast<FunctionTemplateDecl>(FunTmpl->getFirstDecl()),
9081-
ExplicitTemplateArgs ? &Args : nullptr, FT, Specialization, Info);
9080+
FunTmpl, ExplicitTemplateArgs ? &Args : nullptr, FT,
9081+
Specialization, Info);
90829082
TDK != TemplateDeductionResult::Success) {
90839083
// Template argument deduction failed; record why it failed, so
90849084
// that we can provide nifty diagnostics.

clang/lib/Sema/SemaTemplateInstantiate.cpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ struct TemplateInstantiationArgumentCollecter
341341
// If this function was instantiated from a specialized member that is
342342
// a function template, we're done.
343343
assert(FD->getPrimaryTemplate() && "No function template?");
344-
if (FD->getPrimaryTemplate()->isMemberSpecialization())
344+
if (FD->getPrimaryTemplate()->hasMemberSpecialization())
345345
return Done();
346346

347347
// If this function is a generic lambda specialization, we are done.
@@ -440,11 +440,11 @@ struct TemplateInstantiationArgumentCollecter
440440
Specialized = CTSD->getSpecializedTemplateOrPartial();
441441
if (auto *CTPSD =
442442
Specialized.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
443-
if (CTPSD->isMemberSpecialization())
443+
if (CTPSD->hasMemberSpecialization())
444444
return Done();
445445
} else {
446446
auto *CTD = Specialized.get<ClassTemplateDecl *>();
447-
if (CTD->isMemberSpecialization())
447+
if (CTD->hasMemberSpecialization())
448448
return Done();
449449
}
450450
return UseNextDecl(CTSD);
@@ -476,11 +476,11 @@ struct TemplateInstantiationArgumentCollecter
476476
Specialized = VTSD->getSpecializedTemplateOrPartial();
477477
if (auto *VTPSD =
478478
Specialized.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
479-
if (VTPSD->isMemberSpecialization())
479+
if (VTPSD->hasMemberSpecialization())
480480
return Done();
481481
} else {
482482
auto *VTD = Specialized.get<VarTemplateDecl *>();
483-
if (VTD->isMemberSpecialization())
483+
if (VTD->hasMemberSpecialization())
484484
return Done();
485485
}
486486
return UseNextDecl(VTSD);
@@ -4115,10 +4115,7 @@ static ActionResult<CXXRecordDecl *> getPatternForClassTemplateSpecialization(
41154115
CXXRecordDecl *Pattern = nullptr;
41164116
Specialized = ClassTemplateSpec->getSpecializedTemplateOrPartial();
41174117
if (auto *CTD = Specialized.dyn_cast<ClassTemplateDecl *>()) {
4118-
while (true) {
4119-
CTD = CTD->getMostRecentDecl();
4120-
if (CTD->isMemberSpecialization())
4121-
break;
4118+
while (!CTD->hasMemberSpecialization()) {
41224119
if (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate())
41234120
CTD = NewCTD;
41244121
else
@@ -4128,10 +4125,7 @@ static ActionResult<CXXRecordDecl *> getPatternForClassTemplateSpecialization(
41284125
} else if (auto *CTPSD =
41294126
Specialized
41304127
.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
4131-
while (true) {
4132-
CTPSD = CTPSD->getMostRecentDecl();
4133-
if (CTPSD->isMemberSpecialization())
4134-
break;
4128+
while (!CTPSD->hasMemberSpecialization()) {
41354129
if (auto *NewCTPSD = CTPSD->getInstantiatedFromMemberTemplate())
41364130
CTPSD = NewCTPSD;
41374131
else

0 commit comments

Comments
 (0)