Skip to content

Commit 9893f26

Browse files
committed
[FOLD] add hasMemberSpecialization
1 parent b55e17a commit 9893f26

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
@@ -2704,10 +2704,7 @@ VarDecl *VarDecl::getTemplateInstantiationPattern() const {
27042704
if (isTemplateInstantiation(VDTemplSpec->getTemplateSpecializationKind())) {
27052705
auto From = VDTemplSpec->getInstantiatedFrom();
27062706
if (auto *VTD = From.dyn_cast<VarTemplateDecl *>()) {
2707-
while (true) {
2708-
VTD = VTD->getMostRecentDecl();
2709-
if (VTD->isMemberSpecialization())
2710-
break;
2707+
while (!VTD->hasMemberSpecialization()) {
27112708
if (auto *NewVTD = VTD->getInstantiatedFromMemberTemplate())
27122709
VTD = NewVTD;
27132710
else
@@ -2717,10 +2714,7 @@ VarDecl *VarDecl::getTemplateInstantiationPattern() const {
27172714
}
27182715
if (auto *VTPSD =
27192716
From.dyn_cast<VarTemplatePartialSpecializationDecl *>()) {
2720-
while (true) {
2721-
VTPSD = VTPSD->getMostRecentDecl();
2722-
if (VTPSD->isMemberSpecialization())
2723-
break;
2717+
while (!VTPSD->hasMemberSpecialization()) {
27242718
if (auto *NewVTPSD = VTPSD->getInstantiatedFromMember())
27252719
VTPSD = NewVTPSD;
27262720
else
@@ -2734,10 +2728,7 @@ VarDecl *VarDecl::getTemplateInstantiationPattern() const {
27342728
// If this is the pattern of a variable template, find where it was
27352729
// instantiated from. FIXME: Is this necessary?
27362730
if (VarTemplateDecl *VTD = VD->getDescribedVarTemplate()) {
2737-
while (true) {
2738-
VTD = VTD->getMostRecentDecl();
2739-
if (VTD->isMemberSpecialization())
2740-
break;
2731+
while (!VTD->hasMemberSpecialization()) {
27412732
if (auto *NewVTD = VTD->getInstantiatedFromMemberTemplate())
27422733
VTD = NewVTD;
27432734
else
@@ -4158,10 +4149,7 @@ FunctionDecl::getTemplateInstantiationPattern(bool ForDefinition) const {
41584149
if (FunctionTemplateDecl *Primary = getPrimaryTemplate()) {
41594150
// If we hit a point where the user provided a specialization of this
41604151
// template, we're done looking.
4161-
while (true) {
4162-
Primary = Primary->getMostRecentDecl();
4163-
if (ForDefinition && Primary->isMemberSpecialization())
4164-
break;
4152+
while (!ForDefinition || !Primary->hasMemberSpecialization()) {
41654153
if (auto *NewPrimary = Primary->getInstantiatedFromMemberTemplate())
41664154
Primary = NewPrimary;
41674155
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
@@ -9091,8 +9091,8 @@ bool Sema::CheckFunctionTemplateSpecialization(
90919091
TemplateDeductionInfo Info(FailedCandidates.getLocation());
90929092
FunctionDecl *Specialization = nullptr;
90939093
if (TemplateDeductionResult TDK = DeduceTemplateArguments(
9094-
cast<FunctionTemplateDecl>(FunTmpl->getFirstDecl()),
9095-
ExplicitTemplateArgs ? &Args : nullptr, FT, Specialization, Info);
9094+
FunTmpl, ExplicitTemplateArgs ? &Args : nullptr, FT,
9095+
Specialization, Info);
90969096
TDK != TemplateDeductionResult::Success) {
90979097
// Template argument deduction failed; record why it failed, so
90989098
// 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);
@@ -4111,10 +4111,7 @@ getPatternForClassTemplateSpecialization(
41114111
CXXRecordDecl *Pattern = nullptr;
41124112
Specialized = ClassTemplateSpec->getSpecializedTemplateOrPartial();
41134113
if (auto *CTD = Specialized.dyn_cast<ClassTemplateDecl *>()) {
4114-
while (true) {
4115-
CTD = CTD->getMostRecentDecl();
4116-
if (CTD->isMemberSpecialization())
4117-
break;
4114+
while (!CTD->hasMemberSpecialization()) {
41184115
if (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate())
41194116
CTD = NewCTD;
41204117
else
@@ -4124,10 +4121,7 @@ getPatternForClassTemplateSpecialization(
41244121
} else if (auto *CTPSD =
41254122
Specialized
41264123
.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
4127-
while (true) {
4128-
CTPSD = CTPSD->getMostRecentDecl();
4129-
if (CTPSD->isMemberSpecialization())
4130-
break;
4124+
while (!CTPSD->hasMemberSpecialization()) {
41314125
if (auto *NewCTPSD = CTPSD->getInstantiatedFromMemberTemplate())
41324126
CTPSD = NewCTPSD;
41334127
else

0 commit comments

Comments
 (0)