@@ -857,6 +857,16 @@ class RedeclarableTemplateDecl : public TemplateDecl,
857857 // / \endcode
858858 bool isMemberSpecialization () const { return Common.getInt (); }
859859
860+ // / Determines whether any redeclaration of this template was
861+ // / a specialization of a member template.
862+ bool hasMemberSpecialization () const {
863+ for (const auto *D : redecls ()) {
864+ if (D->isMemberSpecialization ())
865+ return true ;
866+ }
867+ return false ;
868+ }
869+
860870 // / Note that this member template is a specialization.
861871 void setMemberSpecialization () {
862872 assert (!isMemberSpecialization () && " already a member specialization" );
@@ -1955,7 +1965,13 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
19551965 // / specialization which was specialized by this.
19561966 llvm::PointerUnion<ClassTemplateDecl *,
19571967 ClassTemplatePartialSpecializationDecl *>
1958- getSpecializedTemplateOrPartial () const ;
1968+ getSpecializedTemplateOrPartial () const {
1969+ if (const auto *PartialSpec =
1970+ SpecializedTemplate.dyn_cast <SpecializedPartialSpecialization *>())
1971+ return PartialSpec->PartialSpecialization ;
1972+
1973+ return SpecializedTemplate.get <ClassTemplateDecl*>();
1974+ }
19591975
19601976 // / Retrieve the set of template arguments that should be used
19611977 // / to instantiate members of the class template or class template partial
@@ -2192,6 +2208,17 @@ class ClassTemplatePartialSpecializationDecl
21922208 return InstantiatedFromMember.getInt ();
21932209 }
21942210
2211+ // / Determines whether any redeclaration of this this class template partial
2212+ // / specialization was a specialization of a member partial specialization.
2213+ bool hasMemberSpecialization () const {
2214+ for (const auto *D : redecls ()) {
2215+ if (cast<ClassTemplatePartialSpecializationDecl>(D)
2216+ ->isMemberSpecialization ())
2217+ return true ;
2218+ }
2219+ return false ;
2220+ }
2221+
21952222 // / Note that this member template is a specialization.
21962223 void setMemberSpecialization () { return InstantiatedFromMember.setInt (true ); }
21972224
@@ -2713,7 +2740,13 @@ class VarTemplateSpecializationDecl : public VarDecl,
27132740 // / Retrieve the variable template or variable template partial
27142741 // / specialization which was specialized by this.
27152742 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
2716- getSpecializedTemplateOrPartial () const ;
2743+ getSpecializedTemplateOrPartial () const {
2744+ if (const auto *PartialSpec =
2745+ SpecializedTemplate.dyn_cast <SpecializedPartialSpecialization *>())
2746+ return PartialSpec->PartialSpecialization ;
2747+
2748+ return SpecializedTemplate.get <VarTemplateDecl *>();
2749+ }
27172750
27182751 // / Retrieve the set of template arguments that should be used
27192752 // / to instantiate the initializer of the variable template or variable
@@ -2947,6 +2980,18 @@ class VarTemplatePartialSpecializationDecl
29472980 return InstantiatedFromMember.getInt ();
29482981 }
29492982
2983+ // / Determines whether any redeclaration of this this variable template
2984+ // / partial specialization was a specialization of a member partial
2985+ // / specialization.
2986+ bool hasMemberSpecialization () const {
2987+ for (const auto *D : redecls ()) {
2988+ if (cast<VarTemplatePartialSpecializationDecl>(D)
2989+ ->isMemberSpecialization ())
2990+ return true ;
2991+ }
2992+ return false ;
2993+ }
2994+
29502995 // / Note that this member template is a specialization.
29512996 void setMemberSpecialization () { return InstantiatedFromMember.setInt (true ); }
29522997
@@ -3119,9 +3164,6 @@ class VarTemplateDecl : public RedeclarableTemplateDecl {
31193164 return makeSpecIterator (getSpecializations (), true );
31203165 }
31213166
3122- // / Merge \p Prev with our RedeclarableTemplateDecl::Common.
3123- void mergePrevDecl (VarTemplateDecl *Prev);
3124-
31253167 // Implement isa/cast/dyncast support
31263168 static bool classof (const Decl *D) { return classofKind (D->getKind ()); }
31273169 static bool classofKind (Kind K) { return K == VarTemplate; }
0 commit comments