add initial support for the gcc "alignof(decl) is the alignment of the decl
not the type" semantics.  This can definitely be improved, but is better than
what we had.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62939 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index f3243c2..63e4ccc 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -260,6 +260,26 @@
   }
 }
 
+/// getDeclAlign - Return a conservative estimate of the alignment of the
+/// specified decl.  Note that bitfields do not have a valid alignment, so
+/// this method will assert on them.
+unsigned ASTContext::getDeclAlign(const Decl *D) {
+  // FIXME: If attribute(align) is specified on the decl, round up to it.
+  
+  if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
+    QualType T = VD->getType();
+    // Incomplete or function types default to 1.
+    if (T->isIncompleteType() || T->isFunctionType())
+      return 1;
+    
+    while (isa<VariableArrayType>(T) || isa<IncompleteArrayType>(T))
+      T = cast<ArrayType>(T)->getElementType();
+    
+    return getTypeAlign(T);
+  }
+  
+  return 1;
+}
 
 /// getTypeSize - Return the size of the specified type, in bits.  This method
 /// does not work on incomplete types.