diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 2 |
2 files changed, 10 insertions, 6 deletions
diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index fe173991559..5317c7bff6e 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -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()) diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 5c908a00f68..91ef67e1c9a 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -4349,7 +4349,7 @@ Sema::CheckFunctionTemplateSpecialization(FunctionDecl *FD, // specialization. FD->setFunctionTemplateSpecialization(Specialization->getPrimaryTemplate(), new (Context) TemplateArgumentList( - *Specialization->getTemplateSpecializationArgs()), + Specialization->getTemplateSpecializationArgs()), /*InsertPos=*/0, SpecInfo->getTemplateSpecializationKind()); |

