From: Eli Friedman Date: Mon, 25 May 2009 21:27:19 +0000 (+0000) Subject: Extend getPreferredTypeAlign to handle _Complex double and long long X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1eed60297ef4701b899c6a3b9680bf08f3403422;p=clang Extend getPreferredTypeAlign to handle _Complex double and long long correctly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72401 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index ccbea263aa..32adf3ae73 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -563,11 +563,14 @@ ASTContext::getTypeInfo(const Type *T) { /// a data type. unsigned ASTContext::getPreferredTypeAlign(const Type *T) { unsigned ABIAlign = getTypeAlign(T); - - // Doubles should be naturally aligned if possible. - if (T->isSpecificBuiltinType(BuiltinType::Double)) - return std::max(ABIAlign, 64U); - + + // Double and long long should be naturally aligned if possible. + if (const ComplexType* CT = T->getAsComplexType()) + T = CT->getElementType().getTypePtr(); + if (T->isSpecificBuiltinType(BuiltinType::Double) || + T->isSpecificBuiltinType(BuiltinType::LongLong)) + return std::max(ABIAlign, (unsigned)getTypeSize(T)); + return ABIAlign; } diff --git a/test/Sema/align-x86.c b/test/Sema/align-x86.c index f6668ddb32..2bc1cc8485 100644 --- a/test/Sema/align-x86.c +++ b/test/Sema/align-x86.c @@ -3,4 +3,12 @@ // PR3433 double g1; short chk1[__alignof__(g1) == 8 ? 1 : -1]; -short chk2[__alignof__(double) == 8 ? 1 : -1]; +short chk2[__alignof__(double) == 8 ? 1 : -1]; + +long long g2; +short chk1[__alignof__(g2) == 8 ? 1 : -1]; +short chk2[__alignof__(long long) == 8 ? 1 : -1]; + +_Complex double g3; +short chk1[__alignof__(g3) == 8 ? 1 : -1]; +short chk2[__alignof__(_Complex double) == 8 ? 1 : -1];