return getTypeInfo(T).second;
}
+ /// 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 getDeclAlign(const Decl *D);
+
/// getASTRecordLayout - Get or compute information about the layout of the
/// specified record (struct/union/class), which indicates its size and field
/// position information.
}
}
+/// 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.
private:
bool HandleCast(CastExpr* E);
- uint64_t GetAlignOfExpr(const Expr *E);
- uint64_t GetAlignOfType(QualType T);
+ unsigned GetAlignOfExpr(const Expr *E);
+ unsigned GetAlignOfType(QualType T);
};
} // end anonymous namespace
return Visit(Cond ? E->getTrueExpr() : E->getFalseExpr());
}
-uint64_t IntExprEvaluator::GetAlignOfType(QualType T) {
+unsigned IntExprEvaluator::GetAlignOfType(QualType T) {
const Type *Ty = Info.Ctx.getCanonicalType(T).getTypePtr();
// __alignof__(void) = 1 as a gcc extension.
return Info.Ctx.getTypeAlign(Ty) / CharSize;
}
-uint64_t IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
-
+unsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
+ E = E->IgnoreParens();
+
+ // alignof decl is always accepted, even if it doesn't make sense: we default
+ // to 1 in those cases.
+ if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
+ return Info.Ctx.getDeclAlign(DRE->getDecl());
+
+ if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
+ return Info.Ctx.getDeclAlign(ME->getMemberDecl());
+
return GetAlignOfType(E->getType());
}