]> granicus.if.org Git - clang/commitdiff
Properly align inline space for ImplicitConversionSequences in OverloadSet.
authorAlexey Samsonov <vonosmas@gmail.com>
Thu, 28 Aug 2014 22:59:39 +0000 (22:59 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Thu, 28 Aug 2014 22:59:39 +0000 (22:59 +0000)
This bug was reported by UBSan.

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

include/clang/Sema/Overload.h

index 7c221a2336cec290c584b42ba9e8dbaf551297dc..b04b996b7fbcbb1815a389158244c0a9ba3ccaf3 100644 (file)
@@ -25,6 +25,7 @@
 #include "clang/Sema/TemplateDeduction.h"
 #include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/Support/AlignOf.h"
 #include "llvm/Support/Allocator.h"
 
 namespace clang {
@@ -718,7 +719,8 @@ namespace clang {
     CandidateSetKind Kind;
 
     unsigned NumInlineSequences;
-    char InlineSpace[16 * sizeof(ImplicitConversionSequence)];
+    llvm::AlignedCharArray<llvm::AlignOf<ImplicitConversionSequence>::Alignment,
+                           16 * sizeof(ImplicitConversionSequence)> InlineSpace;
 
     OverloadCandidateSet(const OverloadCandidateSet &) LLVM_DELETED_FUNCTION;
     void operator=(const OverloadCandidateSet &) LLVM_DELETED_FUNCTION;
@@ -759,7 +761,7 @@ namespace clang {
       // available.
       if (NumConversions + NumInlineSequences <= 16) {
         ImplicitConversionSequence *I =
-          (ImplicitConversionSequence*)InlineSpace;
+            (ImplicitConversionSequence *)InlineSpace.buffer;
         C.Conversions = &I[NumInlineSequences];
         NumInlineSequences += NumConversions;
       } else {