diff options
| author | James Y Knight <jyknight@google.com> | 2015-09-30 14:04:23 +0000 |
|---|---|---|
| committer | James Y Knight <jyknight@google.com> | 2015-09-30 14:04:23 +0000 |
| commit | 48fefa3724c0d85b49dc78afd9b7c29ab560d190 (patch) | |
| tree | ae1f9cdaccc2ec9b81bbca76bbcd0231132a3e89 | |
| parent | 867a93824629589b07c9634897d7726942d58c50 (diff) | |
| download | bcm5719-llvm-48fefa3724c0d85b49dc78afd9b7c29ab560d190.tar.gz bcm5719-llvm-48fefa3724c0d85b49dc78afd9b7c29ab560d190.zip | |
Fix FunctionParmPackExpr::Create() to take a ParmVarDecl* array.
FunctionParmPackExpr actually stores an array of ParmVarDecl* (and
accessors return that). But, the FunctionParmPackExpr::Create()
constructor accepted an array of Decl *s instead.
It was easy for this mismatch to occur without any obvious sign of
something wrong, since both the store and the access used independent
'reinterpet_cast<XX>(this+1)' calls.
llvm-svn: 248905
| -rw-r--r-- | clang/include/clang/AST/ExprCXX.h | 4 | ||||
| -rw-r--r-- | clang/include/clang/Sema/Template.h | 6 | ||||
| -rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 12 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiate.cpp | 8 |
4 files changed, 15 insertions, 15 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index cf1f86ebfab..e8493f1933c 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -3787,7 +3787,7 @@ class FunctionParmPackExpr : public Expr { FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack, SourceLocation NameLoc, unsigned NumParams, - Decl * const *Params); + ParmVarDecl *const *Params); friend class ASTReader; friend class ASTStmtReader; @@ -3796,7 +3796,7 @@ public: static FunctionParmPackExpr *Create(const ASTContext &Context, QualType T, ParmVarDecl *ParamPack, SourceLocation NameLoc, - ArrayRef<Decl *> Params); + ArrayRef<ParmVarDecl *> Params); static FunctionParmPackExpr *CreateEmpty(const ASTContext &Context, unsigned NumParams); diff --git a/clang/include/clang/Sema/Template.h b/clang/include/clang/Sema/Template.h index 416ef7b1a68..c0926304cf4 100644 --- a/clang/include/clang/Sema/Template.h +++ b/clang/include/clang/Sema/Template.h @@ -178,8 +178,8 @@ namespace clang { class LocalInstantiationScope { public: /// \brief A set of declarations. - typedef SmallVector<Decl *, 4> DeclArgumentPack; - + typedef SmallVector<ParmVarDecl *, 4> DeclArgumentPack; + private: /// \brief Reference to the semantic analysis that is performing /// this template instantiation. @@ -332,7 +332,7 @@ namespace clang { findInstantiationOf(const Decl *D); void InstantiatedLocal(const Decl *D, Decl *Inst); - void InstantiatedLocalPackArg(const Decl *D, Decl *Inst); + void InstantiatedLocalPackArg(const Decl *D, ParmVarDecl *Inst); void MakeInstantiatedLocalArgPack(const Decl *D); /// \brief Note that the given parameter pack has been partially substituted diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 0dd36715113..b7f266ceccb 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -1468,19 +1468,19 @@ TemplateArgument SubstNonTypeTemplateParmPackExpr::getArgumentPack() const { FunctionParmPackExpr::FunctionParmPackExpr(QualType T, ParmVarDecl *ParamPack, SourceLocation NameLoc, unsigned NumParams, - Decl * const *Params) - : Expr(FunctionParmPackExprClass, T, VK_LValue, OK_Ordinary, - true, true, true, true), - ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) { + ParmVarDecl *const *Params) + : Expr(FunctionParmPackExprClass, T, VK_LValue, OK_Ordinary, true, true, + true, true), + ParamPack(ParamPack), NameLoc(NameLoc), NumParameters(NumParams) { if (Params) std::uninitialized_copy(Params, Params + NumParams, - reinterpret_cast<Decl**>(this+1)); + reinterpret_cast<ParmVarDecl **>(this + 1)); } FunctionParmPackExpr * FunctionParmPackExpr::Create(const ASTContext &Context, QualType T, ParmVarDecl *ParamPack, SourceLocation NameLoc, - ArrayRef<Decl *> Params) { + ArrayRef<ParmVarDecl *> Params) { return new (Context.Allocate(sizeof(FunctionParmPackExpr) + sizeof(ParmVarDecl*) * Params.size())) FunctionParmPackExpr(T, ParamPack, NameLoc, Params.size(), Params.data()); diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 031a2bad5f5..014fe1db7e7 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -1231,7 +1231,7 @@ TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { // Transform each of the parameter expansions into the corresponding // parameters in the instantiation of the function decl. - SmallVector<Decl *, 8> Parms; + SmallVector<ParmVarDecl *, 8> Parms; Parms.reserve(E->getNumExpansions()); for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end(); I != End; ++I) { @@ -2805,14 +2805,14 @@ void LocalInstantiationScope::InstantiatedLocal(const Decl *D, Decl *Inst) { #endif Stored = Inst; } else if (DeclArgumentPack *Pack = Stored.dyn_cast<DeclArgumentPack *>()) { - Pack->push_back(Inst); + Pack->push_back(cast<ParmVarDecl>(Inst)); } else { assert(Stored.get<Decl *>() == Inst && "Already instantiated this local"); } } -void LocalInstantiationScope::InstantiatedLocalPackArg(const Decl *D, - Decl *Inst) { +void LocalInstantiationScope::InstantiatedLocalPackArg(const Decl *D, + ParmVarDecl *Inst) { D = getCanonicalParmVarDecl(D); DeclArgumentPack *Pack = LocalDecls[D].get<DeclArgumentPack *>(); Pack->push_back(Inst); |

