зеркало из https://github.com/microsoft/clang-1.git
Eek! getDeclAlign sometimes returned alignment in bits.
- Renamed to getDeclAlignInBytes since most other query functions work in bits. - Fun to track down as isIntegerConstantExpr was getting it right, but Evaluate() was getting it wrong. Maybe we should assert they compute the same thing when they succeed? git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64828 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
39aa1ed8f9
Коммит
b7d0844c88
|
@ -434,10 +434,10 @@ public:
|
|||
/// a data type.
|
||||
unsigned getPreferredTypeAlign(const Type *T);
|
||||
|
||||
/// getDeclAlign - Return the alignment of the specified decl that should be
|
||||
/// returned by __alignof(). Note that bitfields do not have a valid
|
||||
/// alignment, so this method will assert on them.
|
||||
unsigned getDeclAlign(const Decl *D);
|
||||
/// getDeclAlignInBytes - Return the alignment of the specified decl
|
||||
/// that should be returned by __alignof(). Note that bitfields do
|
||||
/// not have a valid alignment, so this method will assert on them.
|
||||
unsigned getDeclAlignInBytes(const Decl *D);
|
||||
|
||||
/// getASTRecordLayout - Get or compute information about the layout of the
|
||||
/// specified record (struct/union/class), which indicates its size and field
|
||||
|
|
|
@ -263,7 +263,7 @@ const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
|
|||
/// 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) {
|
||||
unsigned ASTContext::getDeclAlignInBytes(const Decl *D) {
|
||||
// FIXME: If attribute(align) is specified on the decl, round up to it.
|
||||
|
||||
if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
|
||||
|
@ -275,7 +275,7 @@ unsigned ASTContext::getDeclAlign(const Decl *D) {
|
|||
while (isa<VariableArrayType>(T) || isa<IncompleteArrayType>(T))
|
||||
T = cast<ArrayType>(T)->getElementType();
|
||||
|
||||
return getTypeAlign(T);
|
||||
return getTypeAlign(T) / Target.getCharWidth();
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -981,10 +981,10 @@ unsigned IntExprEvaluator::GetAlignOfExpr(const Expr *E) {
|
|||
// 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());
|
||||
return Info.Ctx.getDeclAlignInBytes(DRE->getDecl());
|
||||
|
||||
if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
|
||||
return Info.Ctx.getDeclAlign(ME->getMemberDecl());
|
||||
return Info.Ctx.getDeclAlignInBytes(ME->getMemberDecl());
|
||||
|
||||
return GetAlignOfType(E->getType());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: clang -triple i386-unknown-unknown -O1 -emit-llvm -o %t %s &&
|
||||
// RUN: grep 'ret i32 4' %t
|
||||
|
||||
enum e0 { E0 };
|
||||
struct s0 {
|
||||
enum e0 a:31;
|
||||
};
|
||||
|
||||
struct s0 t1_tmp;
|
||||
int f0() {
|
||||
return __alignof__(t1_tmp);
|
||||
}
|
Загрузка…
Ссылка в новой задаче