From: Chris Lattner Date: Thu, 22 Oct 2009 05:17:15 +0000 (+0000) Subject: fix PR5265: the size of a float3 should be rounded up to its alignment. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9fcfe926432f3c3f7e9a61219e55c352fd358e45;p=clang fix PR5265: the size of a float3 should be rounded up to its alignment. This ensures that arrays of float3 are correctly padded. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84833 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 442714a5a6..7d9bc0f472 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -582,14 +582,16 @@ ASTContext::getTypeInfo(const Type *T) { } case Type::ExtVector: case Type::Vector: { - std::pair EltInfo = - getTypeInfo(cast(T)->getElementType()); - Width = EltInfo.first*cast(T)->getNumElements(); + const VectorType *VT = cast(T); + std::pair EltInfo = getTypeInfo(VT->getElementType()); + Width = EltInfo.first*VT->getNumElements(); Align = Width; // If the alignment is not a power of 2, round up to the next power of 2. // This happens for non-power-of-2 length vectors. - // FIXME: this should probably be a target property. - Align = 1 << llvm::Log2_32_Ceil(Align); + if (VT->getNumElements() & (VT->getNumElements()-1)) { + Align = llvm::NextPowerOf2(Align); + Width = llvm::RoundUpToAlignment(Width, Align); + } break; } @@ -748,14 +750,13 @@ ASTContext::getTypeInfo(const Type *T) { break; } - case Type::SubstTemplateTypeParm: { + case Type::SubstTemplateTypeParm: return getTypeInfo(cast(T)-> getReplacementType().getTypePtr()); - } - case Type::Elaborated: { - return getTypeInfo(cast(T)->getUnderlyingType().getTypePtr()); - } + case Type::Elaborated: + return getTypeInfo(cast(T)->getUnderlyingType() + .getTypePtr()); case Type::Typedef: { const TypedefDecl *Typedef = cast(T)->getDecl(); diff --git a/test/Sema/vector-init.c b/test/Sema/vector-init.c index 6eab32425a..523d23f32a 100644 --- a/test/Sema/vector-init.c +++ b/test/Sema/vector-init.c @@ -21,3 +21,10 @@ float4 array3[2] = { {1.0, 2.0, 3.0}, 5.0, 6.0, 7.0, 8.0, __attribute__((vector_size(16))) // expected-error {{unsupported type 'float (void)' for vector_size attribute, please use on typedef}} float f1(void) { } + + + +// PR5265 +typedef float __attribute__((ext_vector_type (3))) float3; +int test2[(sizeof(float3) == sizeof(float3)*2-1)]; +