|
@@ -3393,23 +3393,19 @@ ASTContext::getTemplateSpecializationType(TemplateName Template,
|
|
QualType Underlying) const {
|
|
QualType Underlying) const {
|
|
assert(!Template.getAsDependentTemplateName() &&
|
|
assert(!Template.getAsDependentTemplateName() &&
|
|
"No dependent template names here!");
|
|
"No dependent template names here!");
|
|
-
|
|
|
|
- unsigned NumArgs = Args.size();
|
|
|
|
|
|
|
|
SmallVector<TemplateArgument, 4> ArgVec;
|
|
SmallVector<TemplateArgument, 4> ArgVec;
|
|
- ArgVec.reserve(NumArgs);
|
|
|
|
- for (unsigned i = 0; i != NumArgs; ++i)
|
|
|
|
- ArgVec.push_back(Args[i].getArgument());
|
|
|
|
|
|
+ ArgVec.reserve(Args.size());
|
|
|
|
+ for (const TemplateArgumentLoc &Arg : Args.arguments())
|
|
|
|
+ ArgVec.push_back(Arg.getArgument());
|
|
|
|
|
|
- return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs,
|
|
|
|
- Underlying);
|
|
|
|
|
|
+ return getTemplateSpecializationType(Template, ArgVec, Underlying);
|
|
}
|
|
}
|
|
|
|
|
|
#ifndef NDEBUG
|
|
#ifndef NDEBUG
|
|
-static bool hasAnyPackExpansions(const TemplateArgument *Args,
|
|
|
|
- unsigned NumArgs) {
|
|
|
|
- for (unsigned I = 0; I != NumArgs; ++I)
|
|
|
|
- if (Args[I].isPackExpansion())
|
|
|
|
|
|
+static bool hasAnyPackExpansions(ArrayRef<TemplateArgument> Args) {
|
|
|
|
+ for (const TemplateArgument &Arg : Args)
|
|
|
|
+ if (Arg.isPackExpansion())
|
|
return true;
|
|
return true;
|
|
|
|
|
|
return true;
|
|
return true;
|
|
@@ -3418,8 +3414,7 @@ static bool hasAnyPackExpansions(const TemplateArgument *Args,
|
|
|
|
|
|
QualType
|
|
QualType
|
|
ASTContext::getTemplateSpecializationType(TemplateName Template,
|
|
ASTContext::getTemplateSpecializationType(TemplateName Template,
|
|
- const TemplateArgument *Args,
|
|
|
|
- unsigned NumArgs,
|
|
|
|
|
|
+ ArrayRef<TemplateArgument> Args,
|
|
QualType Underlying) const {
|
|
QualType Underlying) const {
|
|
assert(!Template.getAsDependentTemplateName() &&
|
|
assert(!Template.getAsDependentTemplateName() &&
|
|
"No dependent template names here!");
|
|
"No dependent template names here!");
|
|
@@ -3436,32 +3431,29 @@ ASTContext::getTemplateSpecializationType(TemplateName Template,
|
|
else {
|
|
else {
|
|
// We can get here with an alias template when the specialization contains
|
|
// We can get here with an alias template when the specialization contains
|
|
// a pack expansion that does not match up with a parameter pack.
|
|
// a pack expansion that does not match up with a parameter pack.
|
|
- assert((!IsTypeAlias || hasAnyPackExpansions(Args, NumArgs)) &&
|
|
|
|
|
|
+ assert((!IsTypeAlias || hasAnyPackExpansions(Args)) &&
|
|
"Caller must compute aliased type");
|
|
"Caller must compute aliased type");
|
|
IsTypeAlias = false;
|
|
IsTypeAlias = false;
|
|
- CanonType = getCanonicalTemplateSpecializationType(Template, Args,
|
|
|
|
- NumArgs);
|
|
|
|
|
|
+ CanonType = getCanonicalTemplateSpecializationType(Template, Args);
|
|
}
|
|
}
|
|
|
|
|
|
// Allocate the (non-canonical) template specialization type, but don't
|
|
// Allocate the (non-canonical) template specialization type, but don't
|
|
// try to unique it: these types typically have location information that
|
|
// try to unique it: these types typically have location information that
|
|
// we don't unique and don't want to lose.
|
|
// we don't unique and don't want to lose.
|
|
void *Mem = Allocate(sizeof(TemplateSpecializationType) +
|
|
void *Mem = Allocate(sizeof(TemplateSpecializationType) +
|
|
- sizeof(TemplateArgument) * NumArgs +
|
|
|
|
|
|
+ sizeof(TemplateArgument) * Args.size() +
|
|
(IsTypeAlias? sizeof(QualType) : 0),
|
|
(IsTypeAlias? sizeof(QualType) : 0),
|
|
TypeAlignment);
|
|
TypeAlignment);
|
|
TemplateSpecializationType *Spec
|
|
TemplateSpecializationType *Spec
|
|
- = new (Mem) TemplateSpecializationType(Template, Args, NumArgs, CanonType,
|
|
|
|
|
|
+ = new (Mem) TemplateSpecializationType(Template, Args, CanonType,
|
|
IsTypeAlias ? Underlying : QualType());
|
|
IsTypeAlias ? Underlying : QualType());
|
|
|
|
|
|
Types.push_back(Spec);
|
|
Types.push_back(Spec);
|
|
return QualType(Spec, 0);
|
|
return QualType(Spec, 0);
|
|
}
|
|
}
|
|
|
|
|
|
-QualType
|
|
|
|
-ASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
|
|
|
|
- const TemplateArgument *Args,
|
|
|
|
- unsigned NumArgs) const {
|
|
|
|
|
|
+QualType ASTContext::getCanonicalTemplateSpecializationType(
|
|
|
|
+ TemplateName Template, ArrayRef<TemplateArgument> Args) const {
|
|
assert(!Template.getAsDependentTemplateName() &&
|
|
assert(!Template.getAsDependentTemplateName() &&
|
|
"No dependent template names here!");
|
|
"No dependent template names here!");
|
|
|
|
|
|
@@ -3472,15 +3464,16 @@ ASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
|
|
// Build the canonical template specialization type.
|
|
// Build the canonical template specialization type.
|
|
TemplateName CanonTemplate = getCanonicalTemplateName(Template);
|
|
TemplateName CanonTemplate = getCanonicalTemplateName(Template);
|
|
SmallVector<TemplateArgument, 4> CanonArgs;
|
|
SmallVector<TemplateArgument, 4> CanonArgs;
|
|
|
|
+ unsigned NumArgs = Args.size();
|
|
CanonArgs.reserve(NumArgs);
|
|
CanonArgs.reserve(NumArgs);
|
|
- for (unsigned I = 0; I != NumArgs; ++I)
|
|
|
|
- CanonArgs.push_back(getCanonicalTemplateArgument(Args[I]));
|
|
|
|
|
|
+ for (const TemplateArgument &Arg : Args)
|
|
|
|
+ CanonArgs.push_back(getCanonicalTemplateArgument(Arg));
|
|
|
|
|
|
// Determine whether this canonical template specialization type already
|
|
// Determine whether this canonical template specialization type already
|
|
// exists.
|
|
// exists.
|
|
llvm::FoldingSetNodeID ID;
|
|
llvm::FoldingSetNodeID ID;
|
|
TemplateSpecializationType::Profile(ID, CanonTemplate,
|
|
TemplateSpecializationType::Profile(ID, CanonTemplate,
|
|
- CanonArgs.data(), NumArgs, *this);
|
|
|
|
|
|
+ CanonArgs, *this);
|
|
|
|
|
|
void *InsertPos = nullptr;
|
|
void *InsertPos = nullptr;
|
|
TemplateSpecializationType *Spec
|
|
TemplateSpecializationType *Spec
|
|
@@ -3492,7 +3485,7 @@ ASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
|
|
sizeof(TemplateArgument) * NumArgs),
|
|
sizeof(TemplateArgument) * NumArgs),
|
|
TypeAlignment);
|
|
TypeAlignment);
|
|
Spec = new (Mem) TemplateSpecializationType(CanonTemplate,
|
|
Spec = new (Mem) TemplateSpecializationType(CanonTemplate,
|
|
- CanonArgs.data(), NumArgs,
|
|
|
|
|
|
+ CanonArgs,
|
|
QualType(), QualType());
|
|
QualType(), QualType());
|
|
Types.push_back(Spec);
|
|
Types.push_back(Spec);
|
|
TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
|
|
TemplateSpecializationTypes.InsertNode(Spec, InsertPos);
|
|
@@ -3592,9 +3585,7 @@ ASTContext::getDependentTemplateSpecializationType(
|
|
SmallVector<TemplateArgument, 16> ArgCopy;
|
|
SmallVector<TemplateArgument, 16> ArgCopy;
|
|
for (unsigned I = 0, E = Args.size(); I != E; ++I)
|
|
for (unsigned I = 0, E = Args.size(); I != E; ++I)
|
|
ArgCopy.push_back(Args[I].getArgument());
|
|
ArgCopy.push_back(Args[I].getArgument());
|
|
- return getDependentTemplateSpecializationType(Keyword, NNS, Name,
|
|
|
|
- ArgCopy.size(),
|
|
|
|
- ArgCopy.data());
|
|
|
|
|
|
+ return getDependentTemplateSpecializationType(Keyword, NNS, Name, ArgCopy);
|
|
}
|
|
}
|
|
|
|
|
|
QualType
|
|
QualType
|
|
@@ -3602,14 +3593,13 @@ ASTContext::getDependentTemplateSpecializationType(
|
|
ElaboratedTypeKeyword Keyword,
|
|
ElaboratedTypeKeyword Keyword,
|
|
NestedNameSpecifier *NNS,
|
|
NestedNameSpecifier *NNS,
|
|
const IdentifierInfo *Name,
|
|
const IdentifierInfo *Name,
|
|
- unsigned NumArgs,
|
|
|
|
- const TemplateArgument *Args) const {
|
|
|
|
|
|
+ ArrayRef<TemplateArgument> Args) const {
|
|
assert((!NNS || NNS->isDependent()) &&
|
|
assert((!NNS || NNS->isDependent()) &&
|
|
"nested-name-specifier must be dependent");
|
|
"nested-name-specifier must be dependent");
|
|
|
|
|
|
llvm::FoldingSetNodeID ID;
|
|
llvm::FoldingSetNodeID ID;
|
|
DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS,
|
|
DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS,
|
|
- Name, NumArgs, Args);
|
|
|
|
|
|
+ Name, Args);
|
|
|
|
|
|
void *InsertPos = nullptr;
|
|
void *InsertPos = nullptr;
|
|
DependentTemplateSpecializationType *T
|
|
DependentTemplateSpecializationType *T
|
|
@@ -3623,6 +3613,7 @@ ASTContext::getDependentTemplateSpecializationType(
|
|
if (Keyword == ETK_None) CanonKeyword = ETK_Typename;
|
|
if (Keyword == ETK_None) CanonKeyword = ETK_Typename;
|
|
|
|
|
|
bool AnyNonCanonArgs = false;
|
|
bool AnyNonCanonArgs = false;
|
|
|
|
+ unsigned NumArgs = Args.size();
|
|
SmallVector<TemplateArgument, 16> CanonArgs(NumArgs);
|
|
SmallVector<TemplateArgument, 16> CanonArgs(NumArgs);
|
|
for (unsigned I = 0; I != NumArgs; ++I) {
|
|
for (unsigned I = 0; I != NumArgs; ++I) {
|
|
CanonArgs[I] = getCanonicalTemplateArgument(Args[I]);
|
|
CanonArgs[I] = getCanonicalTemplateArgument(Args[I]);
|
|
@@ -3633,8 +3624,8 @@ ASTContext::getDependentTemplateSpecializationType(
|
|
QualType Canon;
|
|
QualType Canon;
|
|
if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
|
|
if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) {
|
|
Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS,
|
|
Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS,
|
|
- Name, NumArgs,
|
|
|
|
- CanonArgs.data());
|
|
|
|
|
|
+ Name,
|
|
|
|
+ CanonArgs);
|
|
|
|
|
|
// Find the insert position again.
|
|
// Find the insert position again.
|
|
DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
|
|
DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos);
|
|
@@ -3644,7 +3635,7 @@ ASTContext::getDependentTemplateSpecializationType(
|
|
sizeof(TemplateArgument) * NumArgs),
|
|
sizeof(TemplateArgument) * NumArgs),
|
|
TypeAlignment);
|
|
TypeAlignment);
|
|
T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS,
|
|
T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS,
|
|
- Name, NumArgs, Args, Canon);
|
|
|
|
|
|
+ Name, Args, Canon);
|
|
Types.push_back(T);
|
|
Types.push_back(T);
|
|
DependentTemplateSpecializationTypes.InsertNode(T, InsertPos);
|
|
DependentTemplateSpecializationTypes.InsertNode(T, InsertPos);
|
|
return QualType(T, 0);
|
|
return QualType(T, 0);
|
|
@@ -5756,8 +5747,7 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
|
|
const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
|
|
const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
|
|
llvm::raw_string_ostream OS(S);
|
|
llvm::raw_string_ostream OS(S);
|
|
TemplateSpecializationType::PrintTemplateArgumentList(OS,
|
|
TemplateSpecializationType::PrintTemplateArgumentList(OS,
|
|
- TemplateArgs.data(),
|
|
|
|
- TemplateArgs.size(),
|
|
|
|
|
|
+ TemplateArgs.asArray(),
|
|
(*this).getPrintingPolicy());
|
|
(*this).getPrintingPolicy());
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|