diff options
-rw-r--r-- | include/clang/AST/TemplateBase.h | 6 | ||||
-rw-r--r-- | lib/AST/DeclTemplate.cpp | 7 | ||||
-rw-r--r-- | lib/AST/TemplateBase.cpp | 12 | ||||
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 11 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 17 |
5 files changed, 32 insertions, 21 deletions
diff --git a/include/clang/AST/TemplateBase.h b/include/clang/AST/TemplateBase.h index 5c7dae0a7c..6ea4e3b6de 100644 --- a/include/clang/AST/TemplateBase.h +++ b/include/clang/AST/TemplateBase.h @@ -191,6 +191,12 @@ public: getAsIntegral()->~APSInt(); } + /// \brief Create a new template argument pack by copying the given set of + /// template arguments. + static TemplateArgument CreatePackCopy(ASTContext &Context, + const TemplateArgument *Args, + unsigned NumArgs); + /// \brief Return the kind of stored template argument. ArgKind getKind() const { return (ArgKind)Kind; } diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index b7a586cb17..6e08854231 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/lib/AST/DeclTemplate.cpp @@ -338,11 +338,8 @@ ClassTemplateDecl::getInjectedClassNameSpecialization() { Arg = TemplateArgument(TemplateName(TTP), TTP->isParameterPack()); } - if ((*Param)->isTemplateParameterPack()) { - TemplateArgument *Pack = new (Context) TemplateArgument [1]; - *Pack = Arg; - Arg = TemplateArgument(Pack, 1); - } + if ((*Param)->isTemplateParameterPack()) + Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); TemplateArgs.push_back(Arg); } diff --git a/lib/AST/TemplateBase.cpp b/lib/AST/TemplateBase.cpp index 68e23323ce..6d6fee6625 100644 --- a/lib/AST/TemplateBase.cpp +++ b/lib/AST/TemplateBase.cpp @@ -21,6 +21,7 @@ #include "clang/AST/TypeLoc.h" #include "clang/Basic/Diagnostic.h" #include "llvm/ADT/FoldingSet.h" +#include <algorithm> using namespace clang; @@ -28,6 +29,17 @@ using namespace clang; // TemplateArgument Implementation //===----------------------------------------------------------------------===// +TemplateArgument TemplateArgument::CreatePackCopy(ASTContext &Context, + const TemplateArgument *Args, + unsigned NumArgs) { + if (NumArgs == 0) + return TemplateArgument(0, 0); + + TemplateArgument *Storage = new (Context) TemplateArgument [NumArgs]; + std::copy(Args, Args + NumArgs, Storage); + return TemplateArgument(Storage, NumArgs); +} + bool TemplateArgument::isDependent() const { switch (getKind()) { case Null: diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index d0899c89f0..0a319b17f6 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -2556,13 +2556,12 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template, if ((*Param)->isTemplateParameterPack()) { if (PartialTemplateArgs && ArgumentPack.empty()) { Converted.push_back(TemplateArgument()); - } else if (ArgumentPack.empty()) { + } else if (ArgumentPack.empty()) Converted.push_back(TemplateArgument(0, 0)); - } else { - TemplateArgument *PackedArgs - = new (Context) TemplateArgument [ArgumentPack.size()]; - std::copy(ArgumentPack.begin(), ArgumentPack.end(), PackedArgs); - Converted.push_back(TemplateArgument(PackedArgs, ArgumentPack.size())); + else { + Converted.push_back(TemplateArgument::CreatePackCopy(Context, + ArgumentPack.data(), + ArgumentPack.size())); ArgumentPack.clear(); } } diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index dcc1ada3e8..ff769921f4 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -585,13 +585,13 @@ FinishArgumentPackDeduction(Sema &S, NewPack = DeducedTemplateArgument(TemplateArgument(0, 0)); } else { TemplateArgument *ArgumentPack - = new (S.Context) TemplateArgument [NewlyDeducedPacks[I].size()]; + = new (S.Context) TemplateArgument [NewlyDeducedPacks[I].size()]; std::copy(NewlyDeducedPacks[I].begin(), NewlyDeducedPacks[I].end(), ArgumentPack); NewPack - = DeducedTemplateArgument(TemplateArgument(ArgumentPack, - NewlyDeducedPacks[I].size()), - NewlyDeducedPacks[I][0].wasDeducedFromArrayBound()); + = DeducedTemplateArgument(TemplateArgument(ArgumentPack, + NewlyDeducedPacks[I].size()), + NewlyDeducedPacks[I][0].wasDeducedFromArrayBound()); } DeducedTemplateArgument Result @@ -1726,12 +1726,9 @@ static bool ConvertDeducedTemplateArgument(Sema &S, NamedDecl *Param, } // Create the resulting argument pack. - TemplateArgument *PackedArgs = 0; - if (!PackedArgsBuilder.empty()) { - PackedArgs = new (S.Context) TemplateArgument[PackedArgsBuilder.size()]; - std::copy(PackedArgsBuilder.begin(), PackedArgsBuilder.end(), PackedArgs); - } - Output.push_back(TemplateArgument(PackedArgs, PackedArgsBuilder.size())); + Output.push_back(TemplateArgument::CreatePackCopy(S.Context, + PackedArgsBuilder.data(), + PackedArgsBuilder.size())); return false; } |