]> granicus.if.org Git - clang/commitdiff
PR19278: Align ASTTemplateArgumentListInfo to match its following dynamic array
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Mar 2014 23:32:39 +0000 (23:32 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Mar 2014 23:32:39 +0000 (23:32 +0000)
of TemplateArgumentLocs. 'uint64_t' has higher alignment requirements than a
pointer on some platforms.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@205068 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/TemplateBase.h
lib/AST/TemplateBase.cpp

index 7810c306dd9dcdfc21e2616f05685bfdb7c28ce3..abe106cb4e1a59f0864c5b47bb63287d999b973a 100644 (file)
@@ -567,7 +567,8 @@ struct ASTTemplateArgumentListInfo {
 
     /// Force ASTTemplateArgumentListInfo to the right alignment
     /// for the following array of TemplateArgumentLocs.
-    void *Aligner;
+    llvm::AlignedCharArray<
+        llvm::AlignOf<TemplateArgumentLoc>::Alignment, 1> Aligner;
   };
 
   /// \brief Retrieve the template arguments
index 16efb790b68e283db9f6fdad958250a43ff3f9ba..b068ffafef50e9fcb49625f91ce7d793aef9efe0 100644 (file)
@@ -511,6 +511,8 @@ const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
 const ASTTemplateArgumentListInfo *
 ASTTemplateArgumentListInfo::Create(ASTContext &C,
                                     const TemplateArgumentListInfo &List) {
+  assert(llvm::alignOf<ASTTemplateArgumentListInfo>() >=
+         llvm::alignOf<TemplateArgumentLoc>());
   std::size_t size = ASTTemplateArgumentListInfo::sizeFor(List.size());
   void *Mem = C.Allocate(size, llvm::alignOf<ASTTemplateArgumentListInfo>());
   ASTTemplateArgumentListInfo *TAI = new (Mem) ASTTemplateArgumentListInfo();