aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-05-25 21:27:19 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-05-25 21:27:19 +0000
commit1eed60297ef4701b899c6a3b9680bf08f3403422 (patch)
tree4c56ec5083069c8f061ab0c285e36275fab1e61e
parentb53f08ac87f1e1f4bc2fbfa4560c2183a82020ee (diff)
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
-rw-r--r--lib/AST/ASTContext.cpp13
-rw-r--r--test/Sema/align-x86.c10
2 files changed, 17 insertions, 6 deletions
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];