Added source locs for angled parentheses in class/var template partial specs.
llvm-svn: 188134
This commit is contained in:
parent
b716b3ca1f
commit
6dbe187262
|
@ -1649,8 +1649,7 @@ class ClassTemplatePartialSpecializationDecl
|
|||
|
||||
/// \brief The source info for the template arguments as written.
|
||||
/// FIXME: redundant with TypeAsWritten?
|
||||
TemplateArgumentLoc *ArgsAsWritten;
|
||||
unsigned NumArgsAsWritten;
|
||||
const ASTTemplateArgumentListInfo *ArgsAsWritten;
|
||||
|
||||
/// \brief Sequence number indicating when this class template partial
|
||||
/// specialization was added to the set of partial specializations for
|
||||
|
@ -1673,15 +1672,13 @@ class ClassTemplatePartialSpecializationDecl
|
|||
ClassTemplateDecl *SpecializedTemplate,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
TemplateArgumentLoc *ArgInfos,
|
||||
unsigned NumArgInfos,
|
||||
const ASTTemplateArgumentListInfo *ArgsAsWritten,
|
||||
ClassTemplatePartialSpecializationDecl *PrevDecl,
|
||||
unsigned SequenceNumber);
|
||||
|
||||
ClassTemplatePartialSpecializationDecl()
|
||||
: ClassTemplateSpecializationDecl(ClassTemplatePartialSpecialization),
|
||||
TemplateParams(0), ArgsAsWritten(0),
|
||||
NumArgsAsWritten(0), SequenceNumber(0),
|
||||
TemplateParams(0), ArgsAsWritten(0), SequenceNumber(0),
|
||||
InstantiatedFromMember(0, false) { }
|
||||
|
||||
public:
|
||||
|
@ -1711,15 +1708,10 @@ public:
|
|||
}
|
||||
|
||||
/// Get the template arguments as written.
|
||||
TemplateArgumentLoc *getTemplateArgsAsWritten() const {
|
||||
const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const {
|
||||
return ArgsAsWritten;
|
||||
}
|
||||
|
||||
/// Get the number of template arguments as written.
|
||||
unsigned getNumTemplateArgsAsWritten() const {
|
||||
return NumArgsAsWritten;
|
||||
}
|
||||
|
||||
/// \brief Get the sequence number for this class template partial
|
||||
/// specialization. Internal, only valid for specializations which
|
||||
/// are in the specialized class template's folding set.
|
||||
|
@ -2533,8 +2525,7 @@ class VarTemplatePartialSpecializationDecl
|
|||
|
||||
/// \brief The source info for the template arguments as written.
|
||||
/// FIXME: redundant with TypeAsWritten?
|
||||
TemplateArgumentLoc *ArgsAsWritten;
|
||||
unsigned NumArgsAsWritten;
|
||||
const ASTTemplateArgumentListInfo *ArgsAsWritten;
|
||||
|
||||
/// \brief Sequence number indicating when this variable template partial
|
||||
/// specialization was added to the set of partial specializations for
|
||||
|
@ -2554,12 +2545,12 @@ class VarTemplatePartialSpecializationDecl
|
|||
SourceLocation IdLoc, TemplateParameterList *Params,
|
||||
VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
|
||||
StorageClass S, const TemplateArgument *Args, unsigned NumArgs,
|
||||
TemplateArgumentLoc *ArgInfos, unsigned NumArgInfos,
|
||||
const ASTTemplateArgumentListInfo *ArgInfos,
|
||||
unsigned SequenceNumber);
|
||||
|
||||
VarTemplatePartialSpecializationDecl()
|
||||
: VarTemplateSpecializationDecl(VarTemplatePartialSpecialization),
|
||||
TemplateParams(0), ArgsAsWritten(0), NumArgsAsWritten(0),
|
||||
TemplateParams(0), ArgsAsWritten(0),
|
||||
SequenceNumber(0), InstantiatedFromMember(0, false) {}
|
||||
|
||||
public:
|
||||
|
@ -2585,13 +2576,10 @@ public:
|
|||
}
|
||||
|
||||
/// Get the template arguments as written.
|
||||
TemplateArgumentLoc *getTemplateArgsAsWritten() const {
|
||||
const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const {
|
||||
return ArgsAsWritten;
|
||||
}
|
||||
|
||||
/// Get the number of template arguments as written.
|
||||
unsigned getNumTemplateArgsAsWritten() const { return NumArgsAsWritten; }
|
||||
|
||||
/// \brief Get the sequence number for this variable template partial
|
||||
/// specialization.
|
||||
unsigned getSequenceNumber() const { return SequenceNumber; }
|
||||
|
|
|
@ -1730,7 +1730,8 @@ DEF_TRAVERSE_DECL(ClassTemplatePartialSpecializationDecl, {
|
|||
}
|
||||
// The args that remains unspecialized.
|
||||
TRY_TO(TraverseTemplateArgumentLocsHelper(
|
||||
D->getTemplateArgsAsWritten(), D->getNumTemplateArgsAsWritten()));
|
||||
D->getTemplateArgsAsWritten()->getTemplateArgs(),
|
||||
D->getTemplateArgsAsWritten()->NumTemplateArgs));
|
||||
|
||||
// Don't need the ClassTemplatePartialSpecializationHelper, even
|
||||
// though that's our parent class -- we already visit all the
|
||||
|
@ -1906,8 +1907,9 @@ DEF_TRAVERSE_DECL(VarTemplatePartialSpecializationDecl, {
|
|||
}
|
||||
}
|
||||
// The args that remain unspecialized.
|
||||
TRY_TO(TraverseTemplateArgumentLocsHelper(D->getTemplateArgsAsWritten(),
|
||||
D->getNumTemplateArgsAsWritten()));
|
||||
TRY_TO(TraverseTemplateArgumentLocsHelper(
|
||||
D->getTemplateArgsAsWritten()->getTemplateArgs(),
|
||||
D->getTemplateArgsAsWritten()->NumTemplateArgs));
|
||||
|
||||
// Don't need the VarTemplatePartialSpecializationHelper, even
|
||||
// though that's our parent class -- we already visit all the
|
||||
|
|
|
@ -1385,6 +1385,10 @@ public:
|
|||
ReadTemplateArgumentLoc(ModuleFile &F,
|
||||
const RecordData &Record, unsigned &Idx);
|
||||
|
||||
const ASTTemplateArgumentListInfo*
|
||||
ReadASTTemplateArgumentListInfo(ModuleFile &F,
|
||||
const RecordData &Record, unsigned &Index);
|
||||
|
||||
/// \brief Reads a declarator info from the given record.
|
||||
TypeSourceInfo *GetTypeSourceInfo(ModuleFile &F,
|
||||
const RecordData &Record, unsigned &Idx);
|
||||
|
|
|
@ -577,6 +577,11 @@ public:
|
|||
void AddTemplateArgumentLoc(const TemplateArgumentLoc &Arg,
|
||||
RecordDataImpl &Record);
|
||||
|
||||
/// \brief Emits an AST template argument list info.
|
||||
void AddASTTemplateArgumentListInfo(
|
||||
const ASTTemplateArgumentListInfo *ASTTemplArgList,
|
||||
RecordDataImpl &Record);
|
||||
|
||||
/// \brief Emit a reference to a declaration.
|
||||
void AddDeclRef(const Decl *D, RecordDataImpl &Record);
|
||||
|
||||
|
|
|
@ -829,8 +829,7 @@ ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
|
|||
ClassTemplateDecl *SpecializedTemplate,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
TemplateArgumentLoc *ArgInfos,
|
||||
unsigned NumArgInfos,
|
||||
const ASTTemplateArgumentListInfo *ArgInfos,
|
||||
ClassTemplatePartialSpecializationDecl *PrevDecl,
|
||||
unsigned SequenceNumber)
|
||||
: ClassTemplateSpecializationDecl(Context,
|
||||
|
@ -839,9 +838,8 @@ ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
|
|||
SpecializedTemplate,
|
||||
Args, NumArgs, PrevDecl),
|
||||
TemplateParams(Params), ArgsAsWritten(ArgInfos),
|
||||
NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
|
||||
InstantiatedFromMember(0, false)
|
||||
{
|
||||
SequenceNumber(SequenceNumber), InstantiatedFromMember(0, false)
|
||||
{
|
||||
AdoptTemplateParameterList(Params, this);
|
||||
}
|
||||
|
||||
|
@ -857,10 +855,8 @@ Create(ASTContext &Context, TagKind TK,DeclContext *DC,
|
|||
QualType CanonInjectedType,
|
||||
ClassTemplatePartialSpecializationDecl *PrevDecl,
|
||||
unsigned SequenceNumber) {
|
||||
unsigned N = ArgInfos.size();
|
||||
TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
|
||||
for (unsigned I = 0; I != N; ++I)
|
||||
ClonedArgs[I] = ArgInfos[I];
|
||||
const ASTTemplateArgumentListInfo *ASTArgInfos =
|
||||
ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
|
||||
|
||||
ClassTemplatePartialSpecializationDecl *Result
|
||||
= new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC,
|
||||
|
@ -868,7 +864,7 @@ Create(ASTContext &Context, TagKind TK,DeclContext *DC,
|
|||
Params,
|
||||
SpecializedTemplate,
|
||||
Args, NumArgs,
|
||||
ClonedArgs, N,
|
||||
ASTArgInfos,
|
||||
PrevDecl,
|
||||
SequenceNumber);
|
||||
Result->setSpecializationKind(TSK_ExplicitSpecialization);
|
||||
|
@ -1162,14 +1158,12 @@ VarTemplatePartialSpecializationDecl::VarTemplatePartialSpecializationDecl(
|
|||
SourceLocation IdLoc, TemplateParameterList *Params,
|
||||
VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
|
||||
StorageClass S, const TemplateArgument *Args, unsigned NumArgs,
|
||||
TemplateArgumentLoc *ArgInfos, unsigned NumArgInfos,
|
||||
unsigned SequenceNumber)
|
||||
const ASTTemplateArgumentListInfo *ArgInfos, unsigned SequenceNumber)
|
||||
: VarTemplateSpecializationDecl(Context, VarTemplatePartialSpecialization,
|
||||
DC, StartLoc, IdLoc, SpecializedTemplate, T,
|
||||
TInfo, S, Args, NumArgs),
|
||||
TemplateParams(Params), ArgsAsWritten(ArgInfos),
|
||||
NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
|
||||
InstantiatedFromMember(0, false) {
|
||||
SequenceNumber(SequenceNumber), InstantiatedFromMember(0, false) {
|
||||
// TODO: The template parameters should be in DC by now. Verify.
|
||||
// AdoptTemplateParameterList(Params, DC);
|
||||
}
|
||||
|
@ -1181,15 +1175,13 @@ VarTemplatePartialSpecializationDecl::Create(
|
|||
VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
|
||||
StorageClass S, const TemplateArgument *Args, unsigned NumArgs,
|
||||
const TemplateArgumentListInfo &ArgInfos, unsigned SequenceNumber) {
|
||||
unsigned N = ArgInfos.size();
|
||||
TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
|
||||
for (unsigned I = 0; I != N; ++I)
|
||||
ClonedArgs[I] = ArgInfos[I];
|
||||
const ASTTemplateArgumentListInfo *ASTArgInfos
|
||||
= ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
|
||||
|
||||
VarTemplatePartialSpecializationDecl *Result =
|
||||
new (Context) VarTemplatePartialSpecializationDecl(
|
||||
Context, DC, StartLoc, IdLoc, Params, SpecializedTemplate, T, TInfo,
|
||||
S, Args, NumArgs, ClonedArgs, N, SequenceNumber);
|
||||
S, Args, NumArgs, ASTArgInfos, SequenceNumber);
|
||||
Result->setSpecializationKind(TSK_ExplicitSpecialization);
|
||||
return Result;
|
||||
}
|
||||
|
|
|
@ -2201,14 +2201,15 @@ FinishTemplateArgumentDeduction(Sema &S,
|
|||
// to the class template.
|
||||
LocalInstantiationScope InstScope(S);
|
||||
ClassTemplateDecl *ClassTemplate = Partial->getSpecializedTemplate();
|
||||
const TemplateArgumentLoc *PartialTemplateArgs
|
||||
const ASTTemplateArgumentListInfo *PartialTemplArgInfo
|
||||
= Partial->getTemplateArgsAsWritten();
|
||||
const TemplateArgumentLoc *PartialTemplateArgs
|
||||
= PartialTemplArgInfo->getTemplateArgs();
|
||||
|
||||
// Note that we don't provide the langle and rangle locations.
|
||||
TemplateArgumentListInfo InstArgs;
|
||||
TemplateArgumentListInfo InstArgs(PartialTemplArgInfo->LAngleLoc,
|
||||
PartialTemplArgInfo->RAngleLoc);
|
||||
|
||||
if (S.Subst(PartialTemplateArgs,
|
||||
Partial->getNumTemplateArgsAsWritten(),
|
||||
if (S.Subst(PartialTemplateArgs, PartialTemplArgInfo->NumTemplateArgs,
|
||||
InstArgs, MultiLevelTemplateArgumentList(*DeducedArgumentList))) {
|
||||
unsigned ArgIdx = InstArgs.size(), ParamIdx = ArgIdx;
|
||||
if (ParamIdx >= Partial->getTemplateParameters()->size())
|
||||
|
@ -2360,13 +2361,15 @@ static Sema::TemplateDeductionResult FinishTemplateArgumentDeduction(
|
|||
// to the class template.
|
||||
LocalInstantiationScope InstScope(S);
|
||||
VarTemplateDecl *VarTemplate = Partial->getSpecializedTemplate();
|
||||
const TemplateArgumentLoc *PartialTemplateArgs =
|
||||
Partial->getTemplateArgsAsWritten();
|
||||
const ASTTemplateArgumentListInfo *PartialTemplArgInfo
|
||||
= Partial->getTemplateArgsAsWritten();
|
||||
const TemplateArgumentLoc *PartialTemplateArgs
|
||||
= PartialTemplArgInfo->getTemplateArgs();
|
||||
|
||||
// Note that we don't provide the langle and rangle locations.
|
||||
TemplateArgumentListInfo InstArgs;
|
||||
TemplateArgumentListInfo InstArgs(PartialTemplArgInfo->LAngleLoc,
|
||||
PartialTemplArgInfo->RAngleLoc);
|
||||
|
||||
if (S.Subst(PartialTemplateArgs, Partial->getNumTemplateArgsAsWritten(),
|
||||
if (S.Subst(PartialTemplateArgs, PartialTemplArgInfo->NumTemplateArgs,
|
||||
InstArgs, MultiLevelTemplateArgumentList(*DeducedArgumentList))) {
|
||||
unsigned ArgIdx = InstArgs.size(), ParamIdx = ArgIdx;
|
||||
if (ParamIdx >= Partial->getTemplateParameters()->size())
|
||||
|
|
|
@ -2446,9 +2446,12 @@ TemplateDeclInstantiator::InstantiateClassTemplatePartialSpecialization(
|
|||
|
||||
// Substitute into the template arguments of the class template partial
|
||||
// specialization.
|
||||
TemplateArgumentListInfo InstTemplateArgs; // no angle locations
|
||||
if (SemaRef.Subst(PartialSpec->getTemplateArgsAsWritten(),
|
||||
PartialSpec->getNumTemplateArgsAsWritten(),
|
||||
const ASTTemplateArgumentListInfo *TemplArgInfo
|
||||
= PartialSpec->getTemplateArgsAsWritten();
|
||||
TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
|
||||
TemplArgInfo->RAngleLoc);
|
||||
if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
|
||||
TemplArgInfo->NumTemplateArgs,
|
||||
InstTemplateArgs, TemplateArgs))
|
||||
return 0;
|
||||
|
||||
|
@ -2571,9 +2574,12 @@ TemplateDeclInstantiator::InstantiateVarTemplatePartialSpecialization(
|
|||
|
||||
// Substitute into the template arguments of the variable template partial
|
||||
// specialization.
|
||||
TemplateArgumentListInfo InstTemplateArgs; // no angle locations
|
||||
if (SemaRef.Subst(PartialSpec->getTemplateArgsAsWritten(),
|
||||
PartialSpec->getNumTemplateArgsAsWritten(),
|
||||
const ASTTemplateArgumentListInfo *TemplArgInfo
|
||||
= PartialSpec->getTemplateArgsAsWritten();
|
||||
TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
|
||||
TemplArgInfo->RAngleLoc);
|
||||
if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
|
||||
TemplArgInfo->NumTemplateArgs,
|
||||
InstTemplateArgs, TemplateArgs))
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -5359,6 +5359,19 @@ ASTReader::ReadTemplateArgumentLoc(ModuleFile &F,
|
|||
Record, Index));
|
||||
}
|
||||
|
||||
const ASTTemplateArgumentListInfo*
|
||||
ASTReader::ReadASTTemplateArgumentListInfo(ModuleFile &F,
|
||||
const RecordData &Record,
|
||||
unsigned &Index) {
|
||||
SourceLocation LAngleLoc = ReadSourceLocation(F, Record, Index);
|
||||
SourceLocation RAngleLoc = ReadSourceLocation(F, Record, Index);
|
||||
unsigned NumArgsAsWritten = Record[Index++];
|
||||
TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc);
|
||||
for (unsigned i = 0; i != NumArgsAsWritten; ++i)
|
||||
TemplArgsInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Index));
|
||||
return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo);
|
||||
}
|
||||
|
||||
Decl *ASTReader::GetExternalDecl(uint32_t ID) {
|
||||
return GetDecl(ID);
|
||||
}
|
||||
|
|
|
@ -1527,16 +1527,8 @@ void ASTDeclReader::VisitClassTemplatePartialSpecializationDecl(
|
|||
ClassTemplatePartialSpecializationDecl *D) {
|
||||
RedeclarableResult Redecl = VisitClassTemplateSpecializationDeclImpl(D);
|
||||
|
||||
ASTContext &C = Reader.getContext();
|
||||
D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx);
|
||||
|
||||
unsigned NumArgs = Record[Idx++];
|
||||
if (NumArgs) {
|
||||
D->NumArgsAsWritten = NumArgs;
|
||||
D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs];
|
||||
for (unsigned i=0; i != NumArgs; ++i)
|
||||
D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
|
||||
}
|
||||
D->ArgsAsWritten = Reader.ReadASTTemplateArgumentListInfo(F, Record, Idx);
|
||||
|
||||
// These are read/set from/to the first declaration.
|
||||
if (ThisDeclID == Redecl.getFirstID()) {
|
||||
|
@ -1636,16 +1628,8 @@ void ASTDeclReader::VisitVarTemplatePartialSpecializationDecl(
|
|||
VarTemplatePartialSpecializationDecl *D) {
|
||||
RedeclarableResult Redecl = VisitVarTemplateSpecializationDeclImpl(D);
|
||||
|
||||
ASTContext &C = Reader.getContext();
|
||||
D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx);
|
||||
|
||||
unsigned NumArgs = Record[Idx++];
|
||||
if (NumArgs) {
|
||||
D->NumArgsAsWritten = NumArgs;
|
||||
D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs];
|
||||
for (unsigned i = 0; i != NumArgs; ++i)
|
||||
D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
|
||||
}
|
||||
D->ArgsAsWritten = Reader.ReadASTTemplateArgumentListInfo(F, Record, Idx);
|
||||
|
||||
// These are read/set from/to the first declaration.
|
||||
if (ThisDeclID == Redecl.getFirstID()) {
|
||||
|
|
|
@ -4966,6 +4966,17 @@ ASTWriter::AddTemplateArgumentList(const TemplateArgumentList *TemplateArgs,
|
|||
AddTemplateArgument(TemplateArgs->get(i), Record);
|
||||
}
|
||||
|
||||
void
|
||||
ASTWriter::AddASTTemplateArgumentListInfo
|
||||
(const ASTTemplateArgumentListInfo *ASTTemplArgList, RecordDataImpl &Record) {
|
||||
assert(ASTTemplArgList && "No ASTTemplArgList!");
|
||||
AddSourceLocation(ASTTemplArgList->LAngleLoc, Record);
|
||||
AddSourceLocation(ASTTemplArgList->RAngleLoc, Record);
|
||||
Record.push_back(ASTTemplArgList->NumTemplateArgs);
|
||||
const TemplateArgumentLoc *TemplArgs = ASTTemplArgList->getTemplateArgs();
|
||||
for (int i=0, e = ASTTemplArgList->NumTemplateArgs; i != e; ++i)
|
||||
AddTemplateArgumentLoc(TemplArgs[i], Record);
|
||||
}
|
||||
|
||||
void
|
||||
ASTWriter::AddUnresolvedSet(const ASTUnresolvedSet &Set, RecordDataImpl &Record) {
|
||||
|
|
|
@ -1173,10 +1173,7 @@ void ASTDeclWriter::VisitClassTemplatePartialSpecializationDecl(
|
|||
VisitClassTemplateSpecializationDecl(D);
|
||||
|
||||
Writer.AddTemplateParameterList(D->getTemplateParameters(), Record);
|
||||
|
||||
Record.push_back(D->getNumTemplateArgsAsWritten());
|
||||
for (int i = 0, e = D->getNumTemplateArgsAsWritten(); i != e; ++i)
|
||||
Writer.AddTemplateArgumentLoc(D->getTemplateArgsAsWritten()[i], Record);
|
||||
Writer.AddASTTemplateArgumentListInfo(D->getTemplateArgsAsWritten(), Record);
|
||||
|
||||
// These are read/set from/to the first declaration.
|
||||
if (D->getPreviousDecl() == 0) {
|
||||
|
@ -1252,12 +1249,7 @@ void ASTDeclWriter::VisitVarTemplatePartialSpecializationDecl(
|
|||
VisitVarTemplateSpecializationDecl(D);
|
||||
|
||||
Writer.AddTemplateParameterList(D->getTemplateParameters(), Record);
|
||||
|
||||
Record.push_back(D->getNumTemplateArgsAsWritten());
|
||||
for (int i = 0, e = D->getNumTemplateArgsAsWritten(); i != e; ++i)
|
||||
Writer.AddTemplateArgumentLoc(D->getTemplateArgsAsWritten()[i], Record);
|
||||
|
||||
Record.push_back(D->getSequenceNumber());
|
||||
Writer.AddASTTemplateArgumentListInfo(D->getTemplateArgsAsWritten(), Record);
|
||||
|
||||
// These are read/set from/to the first declaration.
|
||||
if (D->getPreviousDecl() == 0) {
|
||||
|
|
|
@ -701,8 +701,9 @@ bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl(
|
|||
return true;
|
||||
|
||||
// Visit the partial specialization arguments.
|
||||
const TemplateArgumentLoc *TemplateArgs = D->getTemplateArgsAsWritten();
|
||||
for (unsigned I = 0, N = D->getNumTemplateArgsAsWritten(); I != N; ++I)
|
||||
const ASTTemplateArgumentListInfo *Info = D->getTemplateArgsAsWritten();
|
||||
const TemplateArgumentLoc *TemplateArgs = Info->getTemplateArgs();
|
||||
for (unsigned I = 0, N = Info->NumTemplateArgs; I != N; ++I)
|
||||
if (VisitTemplateArgumentLoc(TemplateArgs[I]))
|
||||
return true;
|
||||
|
||||
|
|
|
@ -1647,7 +1647,8 @@ DEF_TRAVERSE_DECL(ClassTemplatePartialSpecializationDecl, {
|
|||
}
|
||||
// The args that remains unspecialized.
|
||||
TRY_TO(TraverseTemplateArgumentLocsHelper(
|
||||
D->getTemplateArgsAsWritten(), D->getNumTemplateArgsAsWritten()));
|
||||
D->getTemplateArgsAsWritten()->getTemplateArgs(),
|
||||
D->getTemplateArgsAsWritten()->NumTemplateArgs));
|
||||
|
||||
// Don't need the ClassTemplatePartialSpecializationHelper, even
|
||||
// though that's our parent class -- we already visit all the
|
||||
|
@ -1821,8 +1822,9 @@ DEF_TRAVERSE_DECL(VarTemplatePartialSpecializationDecl,
|
|||
}
|
||||
}
|
||||
// The args that remains unspecialized.
|
||||
TRY_TO(TraverseTemplateArgumentLocsHelper(D->getTemplateArgsAsWritten(),
|
||||
D->getNumTemplateArgsAsWritten()));
|
||||
TRY_TO(TraverseTemplateArgumentLocsHelper(
|
||||
D->getTemplateArgsAsWritten()->getTemplateArgs(),
|
||||
D->getTemplateArgsAsWritten()->NumTemplateArgs));
|
||||
|
||||
// Don't need the VarTemplatePartialSpecializationHelper, even
|
||||
// though that's our parent class -- we already visit all the
|
||||
|
|
Loading…
Reference in New Issue