fix the TemplateArgumentList copy constructor to not

be a copy constructor (since it isn't one semantically)
and fix the ownership bits it sets to be correct!

llvm-svn: 104192
This commit is contained in:
Chris Lattner 2010-05-20 00:19:09 +00:00
parent c9b03bcc5d
commit ce7a22d97c
3 changed files with 17 additions and 8 deletions

View File

@ -173,6 +173,8 @@ class TemplateArgumentList {
llvm::PointerIntPair<const TemplateArgument *, 1> StructuredArguments;
unsigned NumStructuredArguments;
TemplateArgumentList(const TemplateArgumentList &Other); // DO NOT IMPL
void operator=(const TemplateArgumentList &Other); // DO NOT IMPL
public:
/// TemplateArgumentList - If this constructor is passed "true" for 'TakeArgs'
/// it copies them into a locally new[]'d array. If passed "false", then it
@ -182,8 +184,11 @@ public:
TemplateArgumentListBuilder &Builder,
bool TakeArgs);
/// \brief Produces a shallow copy of the given template argument list
TemplateArgumentList(const TemplateArgumentList &Other);
/// Produces a shallow copy of the given template argument list. This
/// assumes that the input argument list outlives it. This takes the list as
/// a pointer to avoid looking like a copy constructor, since this really
/// really isn't safe to use that way.
explicit TemplateArgumentList(const TemplateArgumentList *Other);
~TemplateArgumentList();

View File

@ -386,11 +386,15 @@ TemplateArgumentList::TemplateArgumentList(ASTContext &Context,
}
}
TemplateArgumentList::TemplateArgumentList(const TemplateArgumentList &Other)
: FlatArguments(Other.FlatArguments.getPointer(), 1),
NumFlatArguments(Other.flat_size()),
StructuredArguments(Other.StructuredArguments.getPointer(), 1),
NumStructuredArguments(Other.NumStructuredArguments) { }
/// Produces a shallow copy of the given template argument list. This
/// assumes that the input argument list outlives it. This takes the list as
/// a pointer to avoid looking like a copy constructor, since this really
/// really isn't safe to use that way.
TemplateArgumentList::TemplateArgumentList(const TemplateArgumentList *Other)
: FlatArguments(Other->FlatArguments.getPointer(), false),
NumFlatArguments(Other->flat_size()),
StructuredArguments(Other->StructuredArguments.getPointer(), false),
NumStructuredArguments(Other->NumStructuredArguments) { }
TemplateArgumentList::~TemplateArgumentList() {
if (FlatArguments.getInt())

View File

@ -4349,7 +4349,7 @@ Sema::CheckFunctionTemplateSpecialization(FunctionDecl *FD,
// specialization.
FD->setFunctionTemplateSpecialization(Specialization->getPrimaryTemplate(),
new (Context) TemplateArgumentList(
*Specialization->getTemplateSpecializationArgs()),
Specialization->getTemplateSpecializationArgs()),
/*InsertPos=*/0,
SpecInfo->getTemplateSpecializationKind());