Added the pack_elements range accessor. Refactoring some for loops to use range-based for loops instead. No functional changes intended.
llvm-svn: 213095
This commit is contained in:
parent
0aca5f0934
commit
2a89e8526a
|
@ -18,6 +18,7 @@
|
|||
#include "clang/AST/TemplateName.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "llvm/ADT/APSInt.h"
|
||||
#include "llvm/ADT/iterator_range.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
|
@ -327,6 +328,12 @@ public:
|
|||
return Args.Args + Args.NumArgs;
|
||||
}
|
||||
|
||||
/// \brief Iterator range referencing all of the elements of a template
|
||||
/// argument pack.
|
||||
llvm::iterator_range<pack_iterator> pack_elements() const {
|
||||
return llvm::make_range(pack_begin(), pack_end());
|
||||
}
|
||||
|
||||
/// \brief The number of template arguments in the given template argument
|
||||
/// pack.
|
||||
unsigned pack_size() const {
|
||||
|
|
|
@ -3060,11 +3060,9 @@ QualType ASTContext::getSubstTemplateTypeParmPackType(
|
|||
const TemplateTypeParmType *Parm,
|
||||
const TemplateArgument &ArgPack) {
|
||||
#ifndef NDEBUG
|
||||
for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(),
|
||||
PEnd = ArgPack.pack_end();
|
||||
P != PEnd; ++P) {
|
||||
assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type");
|
||||
assert(P->getAsType().isCanonical() && "Pack contains non-canonical type");
|
||||
for (const auto &P : ArgPack.pack_elements()) {
|
||||
assert(P.getKind() == TemplateArgument::Type &&"Pack contains a non-type");
|
||||
assert(P.getAsType().isCanonical() && "Pack contains non-canonical type");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -3396,10 +3396,8 @@ void CXXNameMangler::mangleTemplateArg(TemplateArgument A) {
|
|||
case TemplateArgument::Pack: {
|
||||
// <template-arg> ::= J <template-arg>* E
|
||||
Out << 'J';
|
||||
for (TemplateArgument::pack_iterator PA = A.pack_begin(),
|
||||
PAEnd = A.pack_end();
|
||||
PA != PAEnd; ++PA)
|
||||
mangleTemplateArg(*PA);
|
||||
for (const auto &P : A.pack_elements())
|
||||
mangleTemplateArg(P);
|
||||
Out << 'E';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1541,9 +1541,8 @@ void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
|
|||
cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
|
||||
assert(Args);
|
||||
const TemplateArgument &Pack = Args->get(0);
|
||||
for (TemplateArgument::pack_iterator I = Pack.pack_begin(),
|
||||
E = Pack.pack_end(); I != E; ++I) {
|
||||
char C = (char)I->getAsIntegral().getZExtValue();
|
||||
for (const auto &P : Pack.pack_elements()) {
|
||||
char C = (char)P.getAsIntegral().getZExtValue();
|
||||
OS << C;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -1351,9 +1351,8 @@ void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) {
|
|||
break;
|
||||
|
||||
case TemplateArgument::Pack:
|
||||
const TemplateArgument *Pack = Arg.pack_begin();
|
||||
for (unsigned i = 0, e = Arg.pack_size(); i != e; ++i)
|
||||
VisitTemplateArgument(Pack[i]);
|
||||
for (const auto &P : Arg.pack_elements())
|
||||
VisitTemplateArgument(P);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,11 +114,9 @@ bool TemplateArgument::isDependent() const {
|
|||
return (getAsExpr()->isTypeDependent() || getAsExpr()->isValueDependent());
|
||||
|
||||
case Pack:
|
||||
for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) {
|
||||
if (P->isDependent())
|
||||
for (const auto &P : pack_elements())
|
||||
if (P.isDependent())
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -155,11 +153,9 @@ bool TemplateArgument::isInstantiationDependent() const {
|
|||
return getAsExpr()->isInstantiationDependent();
|
||||
|
||||
case Pack:
|
||||
for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) {
|
||||
if (P->isInstantiationDependent())
|
||||
for (const auto &P : pack_elements())
|
||||
if (P.isInstantiationDependent())
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -214,8 +210,8 @@ bool TemplateArgument::containsUnexpandedParameterPack() const {
|
|||
break;
|
||||
|
||||
case Pack:
|
||||
for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P)
|
||||
if (P->containsUnexpandedParameterPack())
|
||||
for (const auto &P : pack_elements())
|
||||
if (P.containsUnexpandedParameterPack())
|
||||
return true;
|
||||
|
||||
break;
|
||||
|
@ -392,14 +388,13 @@ void TemplateArgument::print(const PrintingPolicy &Policy,
|
|||
case Pack:
|
||||
Out << "<";
|
||||
bool First = true;
|
||||
for (TemplateArgument::pack_iterator P = pack_begin(), PEnd = pack_end();
|
||||
P != PEnd; ++P) {
|
||||
for (const auto &P : pack_elements()) {
|
||||
if (First)
|
||||
First = false;
|
||||
else
|
||||
Out << ", ";
|
||||
|
||||
P->print(Policy, Out);
|
||||
P.print(Policy, Out);
|
||||
}
|
||||
Out << ">";
|
||||
break;
|
||||
|
|
|
@ -1950,10 +1950,8 @@ void SubstTemplateTypeParmPackType::Profile(llvm::FoldingSetNodeID &ID,
|
|||
const TemplateArgument &ArgPack) {
|
||||
ID.AddPointer(Replaced);
|
||||
ID.AddInteger(ArgPack.pack_size());
|
||||
for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(),
|
||||
PEnd = ArgPack.pack_end();
|
||||
P != PEnd; ++P)
|
||||
ID.AddPointer(P->getAsType().getAsOpaquePtr());
|
||||
for (const auto &P : ArgPack.pack_elements())
|
||||
ID.AddPointer(P.getAsType().getAsOpaquePtr());
|
||||
}
|
||||
|
||||
bool TemplateSpecializationType::
|
||||
|
|
|
@ -747,9 +747,8 @@ void USRGenerator::VisitTemplateArgument(const TemplateArgument &Arg) {
|
|||
|
||||
case TemplateArgument::Pack:
|
||||
Out << 'p' << Arg.pack_size();
|
||||
for (TemplateArgument::pack_iterator P = Arg.pack_begin(), PEnd = Arg.pack_end();
|
||||
P != PEnd; ++P)
|
||||
VisitTemplateArgument(*P);
|
||||
for (const auto &P : Arg.pack_elements())
|
||||
VisitTemplateArgument(P);
|
||||
break;
|
||||
|
||||
case TemplateArgument::Type:
|
||||
|
|
|
@ -1990,10 +1990,8 @@ addAssociatedClassesAndNamespaces(AssociatedLookup &Result,
|
|||
break;
|
||||
|
||||
case TemplateArgument::Pack:
|
||||
for (TemplateArgument::pack_iterator P = Arg.pack_begin(),
|
||||
PEnd = Arg.pack_end();
|
||||
P != PEnd; ++P)
|
||||
addAssociatedClassesAndNamespaces(Result, *P);
|
||||
for (const auto &P : Arg.pack_elements())
|
||||
addAssociatedClassesAndNamespaces(Result, P);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2095,13 +2095,11 @@ ConvertDeducedTemplateArgument(Sema &S, NamedDecl *Param,
|
|||
// This is a template argument pack, so check each of its arguments against
|
||||
// the template parameter.
|
||||
SmallVector<TemplateArgument, 2> PackedArgsBuilder;
|
||||
for (TemplateArgument::pack_iterator PA = Arg.pack_begin(),
|
||||
PAEnd = Arg.pack_end();
|
||||
PA != PAEnd; ++PA) {
|
||||
for (const auto &P : Arg.pack_elements()) {
|
||||
// When converting the deduced template argument, append it to the
|
||||
// general output list. We need to do this so that the template argument
|
||||
// checking logic has all of the prior template arguments available.
|
||||
DeducedTemplateArgument InnerArg(*PA);
|
||||
DeducedTemplateArgument InnerArg(P);
|
||||
InnerArg.setDeducedFromArrayBound(Arg.wasDeducedFromArrayBound());
|
||||
if (ConvertDeducedTemplateArgument(S, Param, InnerArg, Template,
|
||||
NTTPType, PackedArgsBuilder.size(),
|
||||
|
@ -5037,10 +5035,8 @@ MarkUsedTemplateParameters(ASTContext &Ctx,
|
|||
break;
|
||||
|
||||
case TemplateArgument::Pack:
|
||||
for (TemplateArgument::pack_iterator P = TemplateArg.pack_begin(),
|
||||
PEnd = TemplateArg.pack_end();
|
||||
P != PEnd; ++P)
|
||||
MarkUsedTemplateParameters(Ctx, *P, OnlyDeduced, Depth, Used);
|
||||
for (const auto &P : TemplateArg.pack_elements())
|
||||
MarkUsedTemplateParameters(Ctx, P, OnlyDeduced, Depth, Used);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5192,9 +5192,8 @@ void ASTWriter::AddTemplateArgument(const TemplateArgument &Arg,
|
|||
break;
|
||||
case TemplateArgument::Pack:
|
||||
Record.push_back(Arg.pack_size());
|
||||
for (TemplateArgument::pack_iterator I=Arg.pack_begin(), E=Arg.pack_end();
|
||||
I != E; ++I)
|
||||
AddTemplateArgument(*I, Record);
|
||||
for (const auto &P : Arg.pack_elements())
|
||||
AddTemplateArgument(P, Record);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue