aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-08-21 05:42:49 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-08-21 05:42:49 +0000
commit88d2f678e70ab9360f09f3534d9223e6ec20f129 (patch)
tree2031f39e8dc48551adbf29138aad15c1be220f59
parent929bbfb0b69165b55da3c56abf22aa10e20dadc6 (diff)
Fix alignment of array of VarDecl* following array of unsigned in LambdaExpr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162255 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/ExprCXX.h5
-rw-r--r--lib/AST/ExprCXX.cpp10
2 files changed, 11 insertions, 4 deletions
diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h
index ecfa9e2136..598543757d 100644
--- a/include/clang/AST/ExprCXX.h
+++ b/include/clang/AST/ExprCXX.h
@@ -1281,8 +1281,11 @@ private:
/// \brief Retrieve the complete set of array-index variables.
VarDecl **getArrayIndexVars() const {
+ unsigned ArrayIndexSize = sizeof(unsigned) * (NumCaptures + 1);
+ unsigned Align = llvm::alignOf<VarDecl*>();
+ ArrayIndexSize = (ArrayIndexSize + Align - 1) & ~(Align - 1);
return reinterpret_cast<VarDecl **>(
- getArrayIndexStarts() + NumCaptures + 1);
+ reinterpret_cast<char*>(getArrayIndexStarts()) + ArrayIndexSize);
}
public:
diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp
index 3fa49e0e18..97814afa18 100644
--- a/lib/AST/ExprCXX.cpp
+++ b/lib/AST/ExprCXX.cpp
@@ -877,9 +877,13 @@ LambdaExpr *LambdaExpr::Create(ASTContext &Context,
QualType T = Context.getTypeDeclType(Class);
unsigned Size = sizeof(LambdaExpr) + sizeof(Stmt *) * (Captures.size() + 1);
- if (!ArrayIndexVars.empty())
- Size += sizeof(VarDecl *) * ArrayIndexVars.size()
- + sizeof(unsigned) * (Captures.size() + 1);
+ if (!ArrayIndexVars.empty()) {
+ Size += sizeof(unsigned) * (Captures.size() + 1);
+ // Realign for following VarDecl array.
+ unsigned Align = llvm::alignOf<VarDecl*>();
+ Size = (Size + Align - 1) & ~(Align - 1);
+ Size += sizeof(VarDecl *) * ArrayIndexVars.size();
+ }
void *Mem = Context.Allocate(Size);
return new (Mem) LambdaExpr(T, IntroducerRange, CaptureDefault,
Captures, ExplicitParams, ExplicitResultType,