diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-02 02:18:30 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-02 02:18:30 +0000 |
commit | 71235ecb7fa323b597051c1f097d9b6515a41c37 (patch) | |
tree | 9c95b333941cc6bcbfe79a04931477627b33600d /clang/lib/Sema/SemaExpr.cpp | |
parent | 49805454e662e44b5b61a9520e9437fa7f374dae (diff) | |
download | bcm5719-llvm-71235ecb7fa323b597051c1f097d9b6515a41c37.tar.gz bcm5719-llvm-71235ecb7fa323b597051c1f097d9b6515a41c37.zip |
When determining whether an expression refers to a bit-field, look
into the left-hand side of an assignment expression. This completes
most of PR3500; the only remaining part is to deal with the
GCC-specific implementation-defined behavior for "unsigned long" (and
other) bit-fields.
llvm-svn: 70623
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 47b9fbd7bce..33d308ee398 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -128,12 +128,8 @@ void Sema::DefaultFunctionArrayConversion(Expr *&E) { /// \returns the type this bit-field will promote to, or NULL if no /// promotion occurs. static QualType isPromotableBitField(Expr *E, ASTContext &Context) { - MemberExpr *MemRef = dyn_cast<MemberExpr>(E->IgnoreParenCasts()); - if (!MemRef) - return QualType(); - - FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()); - if (!Field || !Field->isBitField()) + FieldDecl *Field = E->getBitField(); + if (!Field) return QualType(); const BuiltinType *BT = Field->getType()->getAsBuiltinType(); @@ -1344,16 +1340,17 @@ bool Sema::CheckAlignOfExpr(Expr *E, SourceLocation OpLoc, if (E->isTypeDependent()) return false; - if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) { - if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) { - if (FD->isBitField()) { - Diag(OpLoc, diag::err_sizeof_alignof_bitfield) << 1 << ExprRange; - return true; - } - // Other fields are ok. - return false; - } + if (E->getBitField()) { + Diag(OpLoc, diag::err_sizeof_alignof_bitfield) << 1 << ExprRange; + return true; } + + // Alignment of a field access is always okay, so long as it isn't a + // bit-field. + if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) + if (dyn_cast<FieldDecl>(ME->getMemberDecl())) + return false; + return CheckSizeOfAlignOfOperand(E->getType(), OpLoc, ExprRange, false); } @@ -1385,7 +1382,7 @@ Sema::CreateSizeOfAlignOfExpr(Expr *E, SourceLocation OpLoc, // Delay type-checking for type-dependent expressions. } else if (!isSizeOf) { isInvalid = CheckAlignOfExpr(E, OpLoc, R); - } else if (E->isBitField()) { // C99 6.5.3.4p1. + } else if (E->getBitField()) { // C99 6.5.3.4p1. Diag(OpLoc, diag::err_sizeof_alignof_bitfield) << 0; isInvalid = true; } else { @@ -4254,7 +4251,7 @@ QualType Sema::CheckAddressOfOperand(Expr *op, SourceLocation OpLoc) { << op->getSourceRange(); return QualType(); } - } else if (op->isBitField()) { // C99 6.5.3.2p1 + } else if (op->getBitField()) { // C99 6.5.3.2p1 // The operand cannot be a bit-field Diag(OpLoc, diag::err_typecheck_address_of) << "bit-field" << op->getSourceRange(); |